목차
목 차
1. 설계 목적
2. 설계 이론
3. 설계 장치
4. 설계 방법
5. 설계 결과
1. 설계 목적
2. 설계 이론
3. 설계 장치
4. 설계 방법
5. 설계 결과
본문내용
LED에 불이 들어오도록 해주는 변수
● sout_595이 외부에서 숫자를 받아온다. 내부에서 쓰는 maski,i를 선언해주고 maski는 16진수 0x80 = 로 고정하며 i = 8을 고정값으로 쓴다.
void sout_595(unsigned char num)
{
unsigned char maski,i;
maski=0x80; //maski=10000000
i=8;
while(i) //8번 반복
{
if(num&maski) {SER=1;} //외부에서 받아온 num와 maski의 AND 논리곱
else{SER=0;} //그렇지 않으면 SER=0
SCK=1;SCK=0; //SCK=1,SCK=0
maski>>=1; //maski가 오른쪽으로 한 칸씩 이동
ex) 100000000100000000100000.....
i--; //i가 1씩 줄어듦
}
}
● BCD변수가 0~255까지인 문을 선언하고 8개 bit 중 왼쪽 4개bit와 오른쪽 4개bit 변수를 선언하고 왼쪽 4개 bit를 10으로 나눈 몫을 값으로 하고 오른쪽 4개 bit를 10으로 나눈 나머지를 값으로 한다.
주어진 공식에 나온 값을 대입하여 bcdnum를 구할 수 있다.
unsigned char BCD(unsigned char bcdnum)
{
unsigned char left_nibble,right_nibble;
left_nibble=bcdnum/10;
right_nibble=bcdnum%10; bcdnum=left_nibble*16+right_nibble; //bcdnum 공식
ex) bcdnum=35 left_nibble=3
right_nibble=5
bcdnum=53
return bcdnum; //처음의 bcdnum상태로 돌아가 똑같은 계산을 반복 }
● i, jk, pwm=128을 변수로 선언해준다. DDRB는 0xff로 8개 bit가 모두 1인 상태로 출력이라는 뜻이다. PORT는 0x00으로 모든 PB의 상태가 0으로 LOW 상태라고 볼 수 있다. DDRC는 PORT2를 사용하기 때문에 0x04로 선언해준다. 나머지 PORT들은 사용하지 않기 때문에 따로 선언해 줄 필요가 없다.
void main(void)
{
unsigned char i, jk, pwm=128;
DDRA=0x00;PORTA=0x00;DDRB=0xff;PORTB=0x00;DDRC=0x04;PORTC=0x00;DDRD=0x00;PORTD=0x00;
TCCR0=(1<
TCNT0=0x00;OCR0=0x00;
while (1) //1번 반복
{
OCR0=pwm; //모터 속도와 관계된 변수
i=pwm/100; //i는 pwm에서 100을 나눠준 값(백의 자리에 표시) if(i==0) {B=0;A=0;D=0;C=0;} //A는 2^0, B는 2^1으로 세그먼트(백의 자리)에 표시되는 숫자를 나타내며 A,B가 0이 되니까 전류가 흐르지 않음.
이 때 LED에 전류를 흘려주는 변수인 C,D가 0이므로 LED는 켜지지 않음.
if(i==1) {B=0;A=1;D=1;C=0;} //B=0이고 A=1 이므로 1이라는 숫자가 나타나며 D=1이고 C=0이므로 LED가 하나 켜진 상태가 됨.
if(i==2) {B=1;A=0;D=1;C=1;} //B에 전류가 흐르게 되므로 숫자 2가 세그먼트에 표시되며 C,D 둘 다 전류가 흐르게 되므로 LED는 두 개 다 켜진 상태
jk=BCD(pwm%10); //우리가 원하는 홀, 짝수를 구별해 주기 위해
십의 자리를 나타내는 jk를 pwm에서 10을 나눠준 값의 나머지로 설정해 주어 1의 자리수를 표현 if(jk==0) {E=0;} //jk는 짝수일 때 E는 0으로 전류가 흐르지 않아 if(jk==1) {E=1;} LED가 꺼져있고 홀수일 때는 E가 1로 전류가
if(jk==2) {E=0;} 흘러 LED가 켜져 있는 상태이며 결론적으로 LED가 if(jk==3) {E=1;} 숫자가 변할 때마다 반짝반짝 거리는 상태가 됨.
if(jk==4) {E=0;}
if(jk==5) {E=1;}
if(jk==6) {E=0;}
if(jk==7) {E=1;}
if(jk==8) {E=0;}
if(jk==9) {E=1;}
jk=BCD(pwm%100); //100으로 나눈 나머지
sout_595(jk); //BCD코드화한 수 00101000이 위에 있는 sout_595로 입력 RCK=1;RCK=0; //maski=10000000와 00101000을 논리곱하여 00101000을 출력 if(UP==0) //UP스위치를 누르면 PC0가 풀업스위치이기 때문에 누르면 LOW가 되고 전원이 들어감
{
pwm++; //pwm이 1씩 증가
delay_ms(200); //0.2초의 간격
}
if(DOWN==0) //DOWN스위치를 누르면 PC1이 풀업스위치이기 때문에 누르면 LOW가 되고 전원이 들어감
{
pwm--; //pwm이 1씩 감소
delay_ms(200); //0.2초의 간격
}
}
}
설계 회로도
5. 설계 결과
- 세그먼트를 일의 자리부터 백의 자리까지 3개를 이용하여 숫자를 나타내고 모터를 설치하여 좌, 우로 움직이게 설계를 했다. 세그먼트 중에 백의 자리를 나타내는 곳에 LED 2개를 연결하여 백의 자리수가 2이면 LED 2개가 빛이 들어오고 1이면 1개가 빛이 들어오고 0이면 빛이 들어오지 않는 원리를 이용하여 설계를 하였다. 일의 자리를 나타내는 세그먼트에 LED를 연결하여 짝수일 때 빛이 들어오지 않고 홀수일 때 빛이 들어오는 구조를 설계하여 LED가 숫자가 변할 때마다 반짝거리도록 해주었다. 모터에 LED를 연결해주어 한 쪽 방향으로 돌 때마다 빛이 들어오도록 하여 기존의 구조에 변화를 주었다.
(1) 백의 자리수 0 십의 자리수 0 (2) 백의 자리수 2 십의자리수 5
일의 자리수 짝수인 경우 일의 자리수 홀수인 경우
(3) 백의 자리수 1 십의 자리수 9 (4) 모터를 돌렸을 때 불이 들어오는 일의 자리수 짝수인 경우 경우
● sout_595이 외부에서 숫자를 받아온다. 내부에서 쓰는 maski,i를 선언해주고 maski는 16진수 0x80 = 로 고정하며 i = 8을 고정값으로 쓴다.
void sout_595(unsigned char num)
{
unsigned char maski,i;
maski=0x80; //maski=10000000
i=8;
while(i) //8번 반복
{
if(num&maski) {SER=1;} //외부에서 받아온 num와 maski의 AND 논리곱
else{SER=0;} //그렇지 않으면 SER=0
SCK=1;SCK=0; //SCK=1,SCK=0
maski>>=1; //maski가 오른쪽으로 한 칸씩 이동
ex) 100000000100000000100000.....
i--; //i가 1씩 줄어듦
}
}
● BCD변수가 0~255까지인 문을 선언하고 8개 bit 중 왼쪽 4개bit와 오른쪽 4개bit 변수를 선언하고 왼쪽 4개 bit를 10으로 나눈 몫을 값으로 하고 오른쪽 4개 bit를 10으로 나눈 나머지를 값으로 한다.
주어진 공식에 나온 값을 대입하여 bcdnum를 구할 수 있다.
unsigned char BCD(unsigned char bcdnum)
{
unsigned char left_nibble,right_nibble;
left_nibble=bcdnum/10;
right_nibble=bcdnum%10; bcdnum=left_nibble*16+right_nibble; //bcdnum 공식
ex) bcdnum=35 left_nibble=3
right_nibble=5
bcdnum=53
return bcdnum; //처음의 bcdnum상태로 돌아가 똑같은 계산을 반복 }
● i, jk, pwm=128을 변수로 선언해준다. DDRB는 0xff로 8개 bit가 모두 1인 상태로 출력이라는 뜻이다. PORT는 0x00으로 모든 PB의 상태가 0으로 LOW 상태라고 볼 수 있다. DDRC는 PORT2를 사용하기 때문에 0x04로 선언해준다. 나머지 PORT들은 사용하지 않기 때문에 따로 선언해 줄 필요가 없다.
void main(void)
{
unsigned char i, jk, pwm=128;
DDRA=0x00;PORTA=0x00;DDRB=0xff;PORTB=0x00;DDRC=0x04;PORTC=0x00;DDRD=0x00;PORTD=0x00;
TCCR0=(1<
while (1) //1번 반복
{
OCR0=pwm; //모터 속도와 관계된 변수
i=pwm/100; //i는 pwm에서 100을 나눠준 값(백의 자리에 표시) if(i==0) {B=0;A=0;D=0;C=0;} //A는 2^0, B는 2^1으로 세그먼트(백의 자리)에 표시되는 숫자를 나타내며 A,B가 0이 되니까 전류가 흐르지 않음.
이 때 LED에 전류를 흘려주는 변수인 C,D가 0이므로 LED는 켜지지 않음.
if(i==1) {B=0;A=1;D=1;C=0;} //B=0이고 A=1 이므로 1이라는 숫자가 나타나며 D=1이고 C=0이므로 LED가 하나 켜진 상태가 됨.
if(i==2) {B=1;A=0;D=1;C=1;} //B에 전류가 흐르게 되므로 숫자 2가 세그먼트에 표시되며 C,D 둘 다 전류가 흐르게 되므로 LED는 두 개 다 켜진 상태
jk=BCD(pwm%10); //우리가 원하는 홀, 짝수를 구별해 주기 위해
십의 자리를 나타내는 jk를 pwm에서 10을 나눠준 값의 나머지로 설정해 주어 1의 자리수를 표현 if(jk==0) {E=0;} //jk는 짝수일 때 E는 0으로 전류가 흐르지 않아 if(jk==1) {E=1;} LED가 꺼져있고 홀수일 때는 E가 1로 전류가
if(jk==2) {E=0;} 흘러 LED가 켜져 있는 상태이며 결론적으로 LED가 if(jk==3) {E=1;} 숫자가 변할 때마다 반짝반짝 거리는 상태가 됨.
if(jk==4) {E=0;}
if(jk==5) {E=1;}
if(jk==6) {E=0;}
if(jk==7) {E=1;}
if(jk==8) {E=0;}
if(jk==9) {E=1;}
jk=BCD(pwm%100); //100으로 나눈 나머지
sout_595(jk); //BCD코드화한 수 00101000이 위에 있는 sout_595로 입력 RCK=1;RCK=0; //maski=10000000와 00101000을 논리곱하여 00101000을 출력 if(UP==0) //UP스위치를 누르면 PC0가 풀업스위치이기 때문에 누르면 LOW가 되고 전원이 들어감
{
pwm++; //pwm이 1씩 증가
delay_ms(200); //0.2초의 간격
}
if(DOWN==0) //DOWN스위치를 누르면 PC1이 풀업스위치이기 때문에 누르면 LOW가 되고 전원이 들어감
{
pwm--; //pwm이 1씩 감소
delay_ms(200); //0.2초의 간격
}
}
}
설계 회로도
5. 설계 결과
- 세그먼트를 일의 자리부터 백의 자리까지 3개를 이용하여 숫자를 나타내고 모터를 설치하여 좌, 우로 움직이게 설계를 했다. 세그먼트 중에 백의 자리를 나타내는 곳에 LED 2개를 연결하여 백의 자리수가 2이면 LED 2개가 빛이 들어오고 1이면 1개가 빛이 들어오고 0이면 빛이 들어오지 않는 원리를 이용하여 설계를 하였다. 일의 자리를 나타내는 세그먼트에 LED를 연결하여 짝수일 때 빛이 들어오지 않고 홀수일 때 빛이 들어오는 구조를 설계하여 LED가 숫자가 변할 때마다 반짝거리도록 해주었다. 모터에 LED를 연결해주어 한 쪽 방향으로 돌 때마다 빛이 들어오도록 하여 기존의 구조에 변화를 주었다.
(1) 백의 자리수 0 십의 자리수 0 (2) 백의 자리수 2 십의자리수 5
일의 자리수 짝수인 경우 일의 자리수 홀수인 경우
(3) 백의 자리수 1 십의 자리수 9 (4) 모터를 돌렸을 때 불이 들어오는 일의 자리수 짝수인 경우 경우
소개글