单片机定时器中断实验 程序(汇编语言)不要c语言的

单片机定时器中断实验 程序(汇编语言)不要c语言的,第1张

下列程序,已经经过实验,可以满足题目要求.

ORG 0000H

SJMP MAIN

ORG 000BH

SJMP T0_INT

MAIN:

MOV TMOD, #01H T0定时方式1

MOV TH0, #(65536-50000) / 256 定时50ms@12MHz

MOV TL0, #(65536-50000) MOD 256

SETB TR0 启动T0

MOV IE, #82H 开中断

第一秒钟L0,L2亮,第二秒钟L1,L3亮,第三秒L4,L6亮,第四秒钟L5,L7亮,

第五秒L0,L2,L4,L6亮,第六秒钟,L1,L3,L5,L7亮,第七秒钟八个二极管全亮,第八秒钟全灭.

MOV 30H, #11111010B

MOV 31H, #11110101B

MOV 32H, #10101111B

MOV 33H, #01011111B

MOV 34H, #10101010B

MOV 35H, #01010101B

MOV 36H, #00000000B

MOV 37H, #11111111B

MOV R0, #30H

MOV R7, #20

M_LOOP:

SJMP M_LOOP无限循环

T0_INT:

MOV TL0, #(65536-50000) MOD 256

MOV TH0, #(65536-50000) / 256 定时50ms@12MHz

DJNZ R7, T0_END

MOV R7, #20

MOV P1, @R0

INC R0

CJNE R0, #38H, T0_END

MOV R0, #30H

T0_END:

RETI

END完

再次重新启动。

用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)

定时器定时时间到,则自动进入中断程序,程序程序执行完后又“自动”返回主程序

由于nn是全局变量,所以它可以在原来的基础不断加1 如此反复

如果你看汇编程序:可知,不同的中断源有不同的中断程序入口地址,如定时器0的中断程序入口地址是000BH,一旦中断发生,程序便跳至此处执行,但此处并不是真正的中断程序,而它又是一条跳转指令,指向真正的中断服务程序,中断程序结束有一条返回语句RETI,又回到了中断之前的主程序中去,主程序每执行完一条指令,都要判断有无中断的发生,不需人工乾预

whlie(1)是个死循环,中断程序跳来跳去,还是在这个小圈子里


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

原文地址: http://outofmemory.cn/yw/12110220.html

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

发表评论

登录后才能评论

评论列表(0条)

保存