반응형

- 필요한 부분만 발췌해서 본 것임..

/*

   -> TY52가 아니라 516-sp에서도 동작되었슴... 
   TY52 First Demo Program for a crossroad traffic lights.

    Step 1. Just Light LEDs.
   

*/

#include <AT89X52.H>

#define LED1    P1_2
#define LED2    P1_3
#define LED3    P1_4

#define ON      0
#define OFF     1

void delay(int number)
{
    unsigned int i;
    for(i=0;i<number*1000;i++);
}

void main(void) {
    while(1) {
        delay(100);
        LED1=ON; LED2=OFF; LED3=OFF;
       
        delay(100);
        LED1=OFF; LED2=ON; LED3=OFF;

        delay(100);
        LED1=OFF; LED2=OFF; LED3=ON;
    }
}

.... 중략 ....

그 다음, 그러면 P1_2 는 대체 뭘까? ... ^^

그걸 알기 위해서는 위에서 첨가시킨 AT89X52.H 파일의 내용을 살펴봐야 한다. 그 파일을 살펴보면

__sbit __at 0x92 P1_2       ;
__sbit __at 0x93 P1_3       ;
__sbit __at 0x94 P1_4       ;

이런 부분이 중간에 들어 있음을 보게 된다.
여기서 앞의 __ 를 제외하면 다음과 같이 된다.

sbit at 0x92 P1_2;

이것은 0x92 번지의 special function register(sfr) 의 1 bit 를 P1_2 라는 이름으로 사용하겠다는 뜻이다.
앞으로 P1_2 라는 단어가 나오면 그것은 sfr 영역에 있는 0x92 번지의 1 비트를 가리키고 있는 것이다.
그러면 LED1 이 P1_2 로 치환되고, P1_2 는 0x92 번지를 가리키는 것이 되니까, LED1 에 어떤 값을 주면 마이크로프로세서 AT89S52 의 sfr 이라 불리는 영역에 있는 0x92 번지에 어떤 값이 주어지게 된다는 뜻이다.

0x92 번지에 어떤 값이 주어지면 어떻게 되는 것일까? 우선 sfr 이란 램과는 조금 다른 약간의 특별한 CPU 내부에 있는 기억장소라고 생각하면 된다. 어떻게 특별하느냐면.... 램은 그냥 기억시킨 것을 저장하고 있을 뿐이다. 하지만 sfr 영역에 어떤 값을 저장시키면 기억할 뿐만 아니라 어떤 일을 하게 된다. 쉽게 말해서 지금 우리가 사용하는 P1_2 로 정의된 0x92 번지에 어떤 값을 넣으면(1 또는 0, 당연히 1비트 짜리이므로 0과 1, 둘 중 하나일 수 밖에 없다), 그 값은 sfr 영역에 저장되면서 동시에 AT89S52 의 3번 핀에 저장된 신호를 출력하게 된다. 1이 출력된다는 의미는 +5V 가 출력된다는 뜻이고, 0이 출력된다는 의미는 0V가 출력된다는 뜻이다. 현재 회로도를 살펴보면 2번 핀에 LED가 연결되어 있고, 그 LED 와 직렬로 저항이 하나 달려있으며 그것은 +5V 전원에 연결되어 있다. 즉, 2번핀이 0V가 되면 전류가 흘러 LED에 불이 들어오게 되어 있다. 반대로 2번핀이 +5V가 되면 전류는 흐르지 않는다.

[+5V]-------[저항470옴]-----[LED -|>|-]-----[AT89S52의 2번핀]

쉬운 계산문제를 한번 풀어보자. 위의 회로에서 흐르는 전류의 값은 얼마가 될까?

전류는 전압이 높은 곳에서 낮은 곳으로 흐른다. 2번핀이 0V 가 되면 전류는 오른쪽으로 흐른다. 반대로 2번핀이 +5V가 되면 전류는 흐르지 않는다. 너무 기초적인 내용인가? 하지만 이걸 모르면 안된다. 사실 많은 학생들이 안다고 생각하지만 잘 모르고 있는 부분이다. ^^

LED 는 기본적으로 1V 의 전압강하가 있다고 한다. 즉, LED 의 양쪽 핀 사이에 걸리는 전압은 거의 1V로 일정하게 유지된다는 뜻이다. 그러면 저항 470옴의 양단에 걸리는 전압은 4V가 된다.

V = IR

이 공식을 이용하면,

4 = I * 470
I = 4/470
I = 0.0085 A = 8.5mA 가 된다.

LED에 흘릴수 있는 전류의 크기는 사용하는 LED 의 데이타시트를 참고하면 된다. 일반적으로 가장 많이 사용하는 것들은 10 - 15mA 정도를 흘려주면 적당하다고 한다. TY52 에서는 그렇게 빛의 세기에 신경쓸 일이 없다고 여겨져 8.5mA 로 충분한 발광량을 보인다고 판단, 회로를 작성했다.

자, 너무 옆으로 많이 샌것 같다. 다시 원래 있던 자리로 가보자.

 

#define ON      0
#define OFF     1

다시 #define 문이 나왔다. 이제 이게 무슨 뜻인지 알수 있을게다. ON 이라는 단어가 나오면 0으로 바꾸고, OFF 라는 단어가 나오면 1로 바꾸라는 뜻이다. 왜 ON 이 1이 아니고 0 일까? 그건 회로도를 보면 핀에 0V가 걸렸을때 LED가 켜지도록 구성해 두었기 때문이다. 일반적으로 8051 에서는 핀에서 나오는 출력이 상당히 작기 때문에 이런 식으로 회로를 구성하는 것이 보편적이다.

.... 중략 ...

-----------------

잘은 모르겠지만, 저 소스상으로 봤을땐.. sfr이란 곳에 값이 셋팅되면 함수처럼 즉각?적으로 반응하는 것으로 보여진다. 어차피 셋팅값도 출력값도 도 아니면 모일테니..

반응형

+ Recent posts