51单片机定时器中断程序

51单片机定时器中断程序,第1张

再次重新启动。

用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、要让其能产生中断,就必须开中断。这就像一个控制开关,不把开关打开,灯怎么会亮。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8239391.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存