前言:TF0是51单片机定时器T0的溢出中断标志位。当T0被允许计数后,T0从初值开始按机器周期或者外部引脚输入的脉冲进行加1计数。当计数到T0最高位产生溢出时,置“1”TF0,并向CPU请求中断。当CPU响应该中断时,将由硬件自动清“0”TF0。当然,你也可以用“位操作指令”对TF0进行置“1”或清“0”操作。
本次实验采用定时器中断,用的是第二种 T0
有三个开关,分别是ET0 EA,在初始化时可以设置为1,即默认打开
定时器TF0是定时器溢出时的标志位,当TF0=1时将自动触发中断函数1,执行完后自动硬件TF0清零。
贴上代码
void Timer0Init(void) //50毫秒@12.000MHz
{
//AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时初值,设置定时器初值(65536-50000)%256;
TH0 = 0x3C; //设置定时初值,设置定时器初值(65536-50000)/256;
TF0 = 0; //第一次初始化时清除TF0标志,达到50ms时会TF0=1,表示溢出
TR0 = 1; //定时器0开始计时
//cpu在每个机器周期都会查询标志位TF0,所以下面提前打开中断,一旦TF0=1,则会申请中断
ET0=1; //打开定时器中断T0,看图
EA=1; //打开定时器中断T0,看图
}
/**********************************************************
1、中断服务函数一定是一个没有返回值的函数
2、中断服务函数一定是个没有参数的函数
3、中断服务函数函数名后跟关键字 interrupt
4、interrupt n的取值从0~4 分别代表5个中断源 计算公式为 8*n +0003H
分别为 0 0003H INT0
1 000BH T0
2 0013H INT1
3 001BH T1
4 0023H ES
5、中断服务函数不能被主程序或其他程序调用
6、n 后面跟 using m (0-3)工作寄存器组
***********************************************************/
void timer0_ISP(void) interrupt 1 //1 000BH T0中断
{
TR0=0; //进入中断开始就关定时器
TL0 = 0xB0; //设置定时初值,设置定时器初值(65536-50000)%256;
TH0 = 0x3C; //设置定时初值,设置定时器初值(65536-50000)/256;
LED_1=~LED_1; //LED没进一次中断就改变一次状态,这样就会闪烁
TR0=1; //出中断就开定时器,节省一点点时间,避免误差
}
好好看注释!