代码中注释为解释思路,基于教程中提供的知识步骤(不理解欢迎留言)
# include"reg51.h"
typedef unsigned int u16;
sbit led=P1^0;
void timer0init()
{
TMOD=0X01;//选择16位定时器,或一下来防止干扰定时器T1的设置(高四位)
TH0=0Xfc;
TL0=0X18; /*初值为64536,计数1000个溢出,精确计算时间为1ms
计数够了才会溢出去申请中断,然后就会CPU响应中断
TF1硬件自动清0,寄存器中定时器T0的8位自动清零*/
ET0=1;
EA=1;
TR0=1; /*为什么TMOD = 0X01不用管高四位全是0会不会影响T1的设置,
因为有TR0,所以也只有T0才会开启计数 */
}
void main()
{
timer0init();//满足中断条件进入中断服务函数
while(1);
}
void timer0() interrupt 1 //中断号为1
{
static u16 i;/*设置一个静态局部变量i,初始化i为0,
然后函数执行完一次会保留上次的值*/
TH0=0Xfc;
TL0=0X18;/*定时器溢出才申请中断,方式1不能自动重装载,
所以需要重新设置初值,同时在中断函数中设置
定时器初值,*/
++i;
if(i==1000)
{
i=0;
led=~led;
} /*函数执行过程:当i不满足1000时,就会退出中断服务函数,
但是定时器和CPU是相互独立并且它是开启的,所以就会一直计数
(在设定初值基础上),直到8位溢出再次申请中断,CPU响应中断
进入中断服务函数,之后CPU进入死循环也没事,因为满足中断条件
响应后,CPU就会转而去执行中断服务函数,所以中断函数被一次次调用
i的值在没达到1000时不能初始化,需要保存之前的值*/
}