IT_etc/dk-128 (ATmega128)

적외선 센서 문제 풀기

JJun ™ 2009. 6. 25. 09:53

=================================================================================================

프로그램 상에서 지연을 반복문으로 줬다... 이는 안 좋은 방법이고, 원래는 타이머 카운트와 인터럽트를

이용해야 한다.. 하지만 아직 배우지 않았고, 다음 시간에 배울 예정이다..

하면서 느낀건데...내가 모르는 새로운 것을 배운다는 것은 언제나 즐거운 것 같다...

=================================================================================================

 

[보드 세팅]

 

 

 

 

=================================================================================================

 

[소스 코드 및 설명]

 

가.  적외선 센서 신호를 수신할 때 마다, LED 불빛을 전체 껐다가 다시 수신하면 켜기

 

[소스코드 및 설명]

#include<avr/io.h>

/* 광센서는 Port D의 8번째 최상위 비트인 PD7(32번핀)에 입력된다고 가정  */

int main(void)

{

             DDRC = 0x00;   // 키입력

             PORTC = 0x00; // 초기화

 

             DDRD = 0x00001111;    // D포트-EEPROM : 적외선 광센서

             PORTD = 0x11111111;  // D번째 IO 핀에 대한 출력값 초기화

 

             DDRF = 0xFF; // F번째 IO핀 : LED

             PORTF = 0xFF; // F번째 IO핀에 대한 출력값 초기화

            

             volatile unsigned char flag = 0x00; // LED 불을 크고 끄는 플래그 변수

             volatile unsigned int i, j;

                                       

             while(1)

             {                        

                           asm("NOP");

 

                           if(PIND == 0x7F) // 적외선 센서에 값이 입력되면

                           {                                                                             

                                        for(i=0; i<1000; ++i) // 플래그 값을 수정하기 위한 딜레이

                                                     for(j=0; j<600; ++j)

                                                                  ;

                                       

                                        flag = ~flag;

                           }

                          

                          

                           if(flag == 0x00)

                           {           

                                        PORTF = 0xFF;

                           }

                           else

                           {

                                        PORTF = 0x00;

                           }

             }

             return 1;

}

 

나.  적외선센서 신호를 수신할 때 마다, LED의 불빛이 좌측에서 우측으로 1칸씩

     이동 시키기

 

[소스코드 및 설명]

#include<avr/io.h>

 

int main(void)

{

             DDRC = 0x00;

             PORTC = 0x00;

 

             DDRD = 0x00001111;

             PORTD = 0x11111111;

 

             DDRF = 0xFF;

             PORTF = 0xFF;

            

             volatile unsigned int i, j, count = 0;

                                       

             while(1)

             {                        

                           asm("NOP");

                          

                           if(PIND == 0x7F)

                           {

                                        for(i=0; i<1000; ++i) // 값 설정을 위한 딜레이

                                                     for(j=0; j<600; ++j)

                                                                  ;

                                                                 

                                        PORTF = ~(1<<count); // 1 0을 시프트 하면서 LED를 옮김

                                        count++;

 

                                        if(count > 7)

                                                     count = 0;

                           }

                          

             }

            

             return 1;

}

 

 

다.  LED 불빛을 자동으로 1칸씩 우측으로 이동 시키다가, 적외선 센서 신호를 수신할 때 마다 이동 방향을 바꾸기

 

[소스코드 및 설명]

#include<avr/io.h>

 

int main(void)

{

             DDRC = 0x00;

             PORTC = 0x00;

 

             DDRD = 0x00001111;

             PORTD = 0x11111111;

 

             DDRF = 0xFF;

             PORTF = 0xFF;

            

             volatile unsigned int i, j, b = 1;

             volatile unsigned char count = 0;               

                                       

             while(1)

             {                                                  

                           if(PIND == 0x7F)

                           {

                                        for(i=0; i<1000; ++i) // 값 설정을 위한 딜레이

                                                     for(j=0; j<600; ++j)

                                                                  ;           

                                                                 

                                        b *= -1; // -1을 곱해줌으로써 방향을 정할 수 있다.(-1, 1)

                           }

                                       

                           PORTF = ~(1<<count); // 1을 시프트 하면서 LED 불을 옮긴다

                                                                               

                           if(count >= 7)  // LED가 계속 돌기 위해 설정

                                        count = 0;

                          

                           if(count <= 0) // LED가 계속 돌기 위해 설정

                                        count = 7;

                          

                           count += b;  // b = 1: 증가, b = -1: 감소

            

                           for(i=0; i<700; ++i)

                                        for(j=0; j<600; ++j)

                                                     ;                         

             }

            

             return 1;

}

 

 

라.  적외선센서 신호를 수신할 때 마다, FND의 값을 0에서부터 1씩 증가 시키기

 

[소스코드 및 설명]

#include<avr/io.h>

 

int main(void)

{

             DDRC = 0x00;

             PORTC = 0x00;

 

             DDRD = 0x00001111;

             PORTD = 0x11111111;

 

             DDRE = 0xFF;

             PORTE = 0xFF;

            

             volatile unsigned char count = 0;

             volatile unsigned int i, j;

                                       

             while(1)

             {                                                  

                           // 10의 자리와 1의 자리를 구해서 출력.

                           PORTE = ((count/10)<<4) | (count%10);                           

 

                           if(PIND == 0x7F)

                           {

                                        for(i=0; i<1000; ++i) // 값 설정을 위한 딜레이

                                                     for(j=0; j<600; ++j)

                                                                  ;           

                                                                 

                                        count++;

                                        if(count > 99)

                                                     count = 0;

                           }

             }

            

             return 1;

}

 

 

마.  0~99까지 순차적으로 숫자를 1씩 증가시키다가 버튼을 누르면 현재 값에서 1씩 감소하기, 다시 누르면 1씩 증가하기

 

[소스코드 및 설명]

#include<avr/io.h>

       

int main(void)

{

             DDRC = 0x00;

             PORTC = 0x00;

 

             DDRD = 0x00001111;

             PORTD = 0x11111111;

 

             DDRE = 0xFF;

             PORTE = 0xFF;

            

             volatile unsigned char count = 0;

             volatile unsigned int i, j, flag = 1;

                                       

             while(1)

             {           

                           asm("NOP");

                           if(PIND == 0x7F)

                           {           

                                        for(i=0; i<1000; ++i) // 값 설정을 위한 딜레이

                                                     for(j=0; j<600; ++j)

                                                                  ;

                             // flag : 정지, 진행의 값을 담고 있는 플래그 변수

                                        if(flag == 0)

                                                     flag = 1;

                                        else

                                                     flag = 0;

                           }

 

                            // 10의 자리와 1의 자리 수를 구함

                           PORTE = ((count/10)<<4) | (count%10);                          

 

                           count += flag;

                           if(count > 99)

                                        count = 0;

                          

                           for(i=0; i<1000; ++i) // 디스플레이를 위한 딜레이

                                        for(j=0; j<600; ++j)

                                                     ;           

            }

            

             return 1;

}

 

 

=================================================================================================


4장 적외선 센서 실습.pptx.pptx
0.46MB
적외선 센서.txt
0.0MB
main.c
0.0MB