
再次重新启动。
用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)
ORG 0000H
LJMP MAIN上电,转向主程序
ORG 000BH
LJMP CTC0转向定时器中断程序
MAIN:
MOV TMOD, #01H
MOV TL0, #0E0H
MOV TH0, #0D8H 定时10ms, T0初始值计算得D8E0H
SETB TR0启动悔明定时器T0
SETB ET0允许T0中断
SETB EA CPU开放中断
MOV R1, #0
MOV R2, #0A0H 设循环次数,循碧指告环160次
MOV P1, #0C0H数字显示
wait:
AJMP wait
CTC0: 定时器0中断子程序
MOV TL0, #0E0H
MOV TH0, #0D8H
DJNZ R2, EXIT
MOV R2, #160
INC R1
CJNE R1, #10, Display 判断是否到达10
MOV R1, #0
Display:
MOV A, R1
MOV DPTR, #TAB
MOVC A, @A + DPTR 查表逗薯
MOV P1, A
EXIT:
RETI
TAB:
DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H
DB 80H, 90H, 88H, 83H, 0C6H, 0A1H, 86H, 08EH
END
试试看。
1、中断是一个很高明的办法,没有中断时只会顺序执行主程岁悔序中的语句。2、定时器有自己的时钟尘雀携,打开定时器后,一边顺序执行主程序的语句时,一边定时器在计时。当计到设定的值后,需要产生派伏中断,然后暂停主程序语句,转到中断程序中执行的命令。执行完命令后返回到主程序的顺序语句中。然后知道下一次中断来临,再次产生中断。
3、要让其能产生中断,就必须开中断。这就像一个控制开关,不把开关打开,灯怎么会亮。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)