51单片机定时器中断程序怎么办?
再次重新启动。
用C语言实现的,先要定义好定时器的初值,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期,机器周期=12/n(n指晶振频率),假设你要定时的时间为M,那么定时的初值为:M/机器周期=初值;
TH0=(65536-初值)%256;
TL0=(65536-初值)/256;
将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值,例如用12M晶振做1ms定时计算如下:
机器周期=12/12*10^6=1us(微秒)
定时初值=(1*10^-3)/(1*10^-6)=1000;
所以:TH0=(65536-1000)%256;
TL0=(65536-1000)/256;
将65536-1000=64536化为16进制为:0xFC18,TH0=0xFC,TL0=0X18;
定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:timer0() interrupt 1 // 1ms延时(12.0MHz)
代码:
1 #include <reg52.h>
2 #include <intrins.h>
3 typedef unsigned char uchar;
4 sbit LED = P1 ^ 0;
5 uchar count = 0;
6 void Interrupt() interrupt 1
7 {
8 TH0 = (65536 - 46080) / 256; //触发中断时重新装填计时
9 TL0 = (65536 - 46080) % 256;
10 if (count == 20)
11 {
12 LED = ~LED;
13 count = 0;
14 }
15 else ++count;
16 }
17 void main(void)
18 {
19 LED = 0xff; //初始化LED
20 TMOD = 0x01; //初始化TMOD,定时器0,方式1
21 TH0 = (65536 - 46080) / 256; //装填计数
22 TL0 = (65536 - 46080) % 256;
23 EA = 1; //开放所有中断
24 ET0 = 1; //开放定时器0中断控制位
25 TR0 = 1; //定时器0开始计时
26 while(1)
27 {
28 _nop_();
29 }
30 }