因此一共经过了【(256-H-1)*256+256-L】=(65536-256H-L)次计数定时器请求中断。也就是说定时器中的16位寄存器的初值C=256H+L。
很明显TH0中的初值H=C/256,而TL0中的初值L=C%256,这就推导出来了。
搞定了定时器初值的问题,接下来就可以写定时器中断的代码了。
中断服务程序的写法
C51的中断函数格式如下:
void 函数名() interrupt 中断号 using 工作组
{中断服务程序具体内容}
中断函数没有返回值和参数,函数名只要符合C语言标准就可以,中断号是指单片机中的中断源序号,是编译器识别不同中断源的唯一凭证,using工作组是指这个中断服务程序使用单片机内存中4组工作寄存器的哪一组,由编译器自动分配,通常我们可以忽略不写。
#include //包含头文件
sbit led = P0^0;
unsigned char count = 0; //定时累计变量,我们需要1000ms定时,50 * 20 = 1000
//count是全局变量,通俗地说就是程序每次重新执行时值保持住最近一次的值
//后续会专门讲讲C语言的一些基础知识
void main()
{TMOD = 001; //设置定时器0工作方式1,16位计数
TH0 = (65536 - 45872) / 256; //晶振11.0592MHz,定时50ms时TH0初值
TL0 = (65536 - 45872) % 256; //晶振11.0592MHz,定时50ms时TL0初值
EA = 1; //开启总中断
ET0 = 1; //开启定时器0中断
TR0 = 1; //启动定时器0
while(1); //程序停止,等待定时器0中断发生}
void T0_INT() interrupt 1 //大家对照着上述格式看看