TH0 = 0x9c; TL0 = 0x9c;
时间: 2023-09-08 10:17:26 浏览: 85
TH0和TL0是8051单片机中定时器0的两个特殊功能寄存器,用于存储定时器计数器的初值和计数值。在这行代码中,将TH0和TL0分别设置为0x9c。由于定时器0是一个8位计数器,TH0寄存器的高8位为0,低8位为0x9c,TL0寄存器的高8位也为0,低8位也为0x9c。因此,TH0和TL0的值为0x9c,表示定时器0的初值为0x9c,即当定时器0开始计数时,计数器的初值为0x9c,每计数一次,计数值会减1,直到计数器的值减为0,触发定时器0中断。
相关问题
void InterruptInit() { TMOD &= 0xf0; TMOD |= 0x02; TH0 = 0x9c; TL0 = 0x9c; ET0 = 1; EA = 1; TR0 = 1; }
这是一个8051单片机的初始化函数,用于初始化定时器0的中断服务程序。在函数中,首先将TMOD寄存器的低4位清零,然后将TMOD寄存器的高4位设置为“0000 0010”,即将定时器0设置为模式2,使其工作在8位自动重装载方式下。接着,将定时器0的初值TH0和TL0设置为0x9c,使其定时器0每1毫秒中断一次。然后,使能定时器0的中断ET0,并打开总中断EA。最后,启动定时器0TR0,开始计时。该函数的作用是初始化定时器0的中断服务程序,使其可以在后续程序中被使用。
#include <reg51.h> unsigned char code table[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E}; unsigned char Count,i,j; void Timer0_Init() { TMOD |= 0x01; TH0 = 0x3C; TL0 = 0xAF; EA = 1; ET0 = 1; TR0 = 1; } void Timer0_ISR() interrupt 1 { TH0 = 0x3C; TL0 = 0xAF; Count--; if(Count == 60) { Count = 0; } i = table[Count / 10]; j = table[Count % 10]; SBUF = i; while(TI == 0); TI = 0; SBUF = j; while(TI == 0); TI = 0; } void main(void) { Count = 60; Timer0_Init(); while(1); }
这段程序与之前的程序相比,只有一个小错误。在定时器中断服务程序中,我们将`if(Count == 0)`修改为了`if(Count == 60)`,这样在计数器减到0时不会将计数器重新设置为60,而是一直保持在0。因此,需要将`if(Count == 60)`修改回`if(Count == 0)`。修改后的程序如下:
```c
#include <reg51.h>
unsigned char code table[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E};
unsigned char Count,i,j;
void Timer0_Init()
{
TMOD |= 0x01;
TH0 = 0x3C;
TL0 = 0xAF;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0_ISR() interrupt 1
{
TH0 = 0x3C;
TL0 = 0xAF;
Count--;
if(Count == 0)
{
Count = 60;
}
i = table[Count / 10];
j = table[Count % 10];
SBUF = i;
while(TI == 0);
TI = 0;
SBUF = j;
while(TI == 0);
TI = 0;
}
void main(void)
{
Count = 60;
Timer0_Init();
while(1);
}
```
在程序中,我们还是使用了定时器0来实现每隔1秒钟计数器减1的功能。程序中的`Timer0_Init()`函数用于初始化定时器0,`Timer0_ISR()`函数为定时器0的中断服务程序。在程序的`main()`函数中,我们调用了`Timer0_Init()`函数进行定时器0的初始化,并在无限循环中等待定时器0中断的触发。