Programming/8051

8051의 타이머 0

청솔1 2009. 11. 30. 10:55

<8051의 타이머 0>

8051에는 두개의 타이머를 내장하구 있습니다.
각 타이머에는 모드0,모드1,모드2,모드3의 4가지의 모드가 있으며
먼저 모드0에 대해 설명을 하면
<모드0>
13비트 카운터로 동작을 합니다. 즉, TH는 8비트를 모두 사용을하며 TL은 상위 3비트는 사용을 못하게 됩니다.
TH와 TL에 설정하는 값을 계산하기 위해서는 다음의 공식에 대입을 하면 됩니다.
먼저 내부 클럭 1개당 주기를 계산하면
T(주기)=1/f이며 머신 사이클 주파수는 11059200/12(분주)=921600
그러므로 내부 클럭 당 주기는 1/머신사이클=1/921600=0.0000010850694가 됩니다. 여기서 예를 들어 인터럽트 주기를 0.005초로 한다면
내부 클럭수는=0.005/0.0000010850694=4608이 되며 4608을 헥사값으로 나타내면 0x1200이므로
TH,TL개수=(0x1fff+1)-내부 클럭수=(0x1fff+1)-0x1200=0x0e00이 됩니다. 이 헥사 값을 이진수로 표현하면 00001110 00000000이 되며 이 값을 가지고 TH와 TL의 개수를 설정하면됩니다.
즉, TL의 상위 3비트를 사용하지 않는 것을 고려하여 다시 정렬하면
011100000 xxx00000이렇게 됩니다.
이것을 다시 헥사로 나타내면 TH=0x70, TL=0x00이됩니다. 물론 TL의 상위 3비트는 don't care이기 때문에 어떤 값으로도 상관이 없습니다.

위의 내용을 참고해서 타이머0를 이용한 LED 제어의 예를 들어 보면

#include

#define T0H=0x70; //TH0값 설정 위에서 계산된 값
#define T0L=0x00; //TL0값 설정 위에서 계산된 값

#define CNT=0;
#define LED_BIT=0;

void main(void)
{
TMOD=0x00; //타이머 모드0로 설정
TH0=T0H;
TL0=T0L;

TR0=1; //타이머 인에이블
EA=1; //인터럽트 인에이블
ET0=1; //타이머의 오버플로워 인터럽트사용

while(1)
{
if(LED_BIT==0)P1=0x0f; //P1포트의 상위 4비트 on
else if(LED_BIT=1)P1=0xf0; //P1포트의 하위 4비트 on
}
}
void external1(void) interrupt 0 //인터럽트 루틴
{
TH0=T0H;
TL0=T0L;

CNT++;
if(CNT >= 200) //타이머 1초마다 오버플로어 발생
//0.005*200=1초
{
CNT=0; //CNT를 초기값으로 치환
if(LED_BIT==0)LED_BIT=1; //LED_BIT 체크
else if(LED_BIT==1)LED_BIT=0;
}

 

<< 전자기기 개발 --- 건강기기, 통신기기,각종 전자회로 개발, PCB ARTWORK >>

http://cafe.daum.net/elecom-rnd

출처 : 민이 여행

 

 

 

'Programming > 8051' 카테고리의 다른 글

RS232/RS422/RS485  (0) 2009.11.30
8051 타이머 모드1  (0) 2009.11.30
8051타이머 모드설정  (0) 2009.11.30
8051( 중급 12부 - serial 통신 2 )   (0) 2009.11.29
8051( 중급 11부 - serial 통신 )  (0) 2009.11.29