定时器中断
定时器计数为0~65535,共65536个数,当定时器计数计满65536个后会自动清零,所以常在清零时启动另一个任务(例如:使LED点亮),65536可以看做65536微妙 ,因为定时中断计数到第65536个才会清零(65535是第65536个计数)因为65535溢出值已经确定,所以用改变初值也就是定时开始的值来改变定时时间。举个栗子
#include <REGX51.H>
int c=1;
sbit LED=P2^0;
void main()
{
EA=1;//总中断
TR0=1;//启动定时中断0
ET0=1;// 定时/计数器0中断控制位,先打开ET0之后EA才能打开
TMOD=0x01;//设置定时器模式为方式1: 16位计数器
TH0 = 0x9e;//初值高八位:计算方式为(65536-25000)/256 取整换算为16进制
TL0= 0x58;//初值低八位:计算方式为(65536-25000)%256 取余换算为16进制
//初值可直接写计算方式 65536-25000=40536(十进制)=9E58(十六进制)9E为高八位,58为低八位
while(1)//死循环
{
if(c==100){ // c为100使电平翻转
LED=~LED; //默认LED=1时,LED=~LED会使LED=0;反之LED=1;也就是电平翻转
c=1;//电平翻转后使c为1,继续运行使c再次为100,达到循环亮灭
}
}
}
void time()interrupt 1{
TH0 = 0x9e;
TL0= 0x58;
c++;//c=100;运行100次定时器 25000微妙*100=2.5s
}