求单片机高手帮忙详细解释下程序 特别是中断那

Tick equ 5000 ; 10000 x 100us = 1s
T100us equ 20 ; 100us时间常数(6M)
C100us equ 5h ; 100us记数单元
LEDBuf BIT 00H
LED BIT P1.1

org 0000H
ljmp Start
org 0030H
org 000bh
LJMP T0Int
ORG 0100H
T0Int:
push PSW
mov a, C100us+1
jnz Goon
dec C100us
Goon:
dec C100us+1
mov a, C100us
orl a, C100us+1
jnz Exit ; 100us 记数器不为0, 返回
mov C100us, #HIGH(TICK);#high(Tick)
mov C100us+1, #LOW(TICK);#low(Tick)
cpl LEDBuf ; 100us 记数器为0, 重置记数器
; 取反LED
Exit:
pop PSW
reti
Start:
mov TMOD, #02h ; 方式2, 定时器
mov TH0, #t100us
mov TL0, #t100us
mov IE, #10000010b ; EA=1, IT0 = 1
setb TR0 ; 开始定时
clr LEDBuf
clr P1.1
mov C100us, #high(Tick)
mov C100us+1, #low(Tick)
Loop:
mov c, LEDBuf
mov P1.1, c
ljmp Loop
end
解释下怎样定时一秒的,先谢谢了

这应该是一个闪烁灯的程序,定时器以方式2自动重装的方式工作,定时器到时产生一次中断就将记数字段减一,等到计数字段减到0就改变一次LED灯的状态,这基实就是一个延时的过程。
总的来讲就是定时器每100us就产生一次中断,而每次中断就将计数字段减一,因此计数字段应该设为10000,这样就是产生10000次中断(就是10000*100us =1s)时改变一次LED灯的状态,便实现了1s的计时。
Start:
mov TMOD, #02h ; 方式2, 定时器
mov TH0, #t100us
mov TL0, #t100us
mov IE, #10000010b ; EA=1, IT0 = 1
这几句是选择定时器并设置定时器工作方式,此处选择了定时器0并以工作方式2工作,方式2是自动重装,TH0减至0时,定时器到时产生中断并自动将TL0的值赋给TH0,之后重新工作。TH0和TL0决定了定时器工作起点,其中TH0是设置高八位字节,TL0是设置低八位字节(定时器总共是2个字节16位,最大值的十进制为65535)。EA=1是开总中断,IT0=1是开定时器0的中断。

mov C100us, #high(Tick)
mov C100us+1, #low(Tick)
两句是设置计数器计数起点,C100us是高位字段,C100us+1是低位字段。

T0Int:
push PSW
mov a, C100us+1
jnz Goon
dec C100us
这是定时器到时产生中断后的处理过程。先看C100us+1(即低位字段)是否为0,不为0即jnz(jump not zero)就跳转至Goon处,否则就将C100us(即高位字段)减一,然后执行Goon。

Goon:
dec C100us+1
mov a, C100us
orl a, C100us+1
jnz Exit ; 100us 记数器不为0, 返回
mov C100us, #HIGH(TICK);#high(Tick)
mov C100us+1, #LOW(TICK);#low(Tick)
cpl LEDBuf ; 100us 记数器为0, 重置记数器
; 取反LED
这几句就是判断计数器是否为0。其中 orl a, C100us+1是将高位字段与低位字断“按位与”。结果若不为0(只有在高位字断与低位字断同时为0时,结果才为0)便执行EXIT,即退出;若为0
则重置计数器,并将LED取反。

OK就是这样了,今天下午没课,一高兴就写了这么多,不要烦啊,呵呵。
温馨提示:内容为网友见解,仅供参考
无其他回答

求单片机高手帮忙详细解释下程序 特别是中断那
这应该是一个闪烁灯的程序,定时器以方式2自动重装的方式工作,定时器到时产生一次中断就将记数字段减一,等到计数字段减到0就改变一次LED灯的状态,这基实就是一个延时的过程。总的来讲就是定时器每100us就产生一次中断,而每次中断就将计数字段减一,因此计数字段应该设为10000,这样就是产生10000次...

哪位高手能给大概讲解一下51单片机“中断”的概念!先谢谢了!
单片机好比一个人,CPU是大脑,人体感官相当于传感器或者中断口;你在做你的事情,突然有只虫咬了你一下,你条件反射的就会停下手中的事情去处理伤口;这个过程就是中断,你处理完了又回到你要做的事情。中断一样,中断口发中断信号给CPU,CPU接到信号会停止目前程序,进入中断程序,中断程序完了,再回...

单片机c语言程序高手进 这个程序应该怎样实现中断
首先来个键盘扫描程序。采集是A键按下还是B键按下。如果是A键按下的话,就给LED1口输出高电平然后延时1S,延时程序可以用delay来粗略延时,也可以用定时器精确延时;延时1S过后,让LED1口输出低电平,然后再延时1S。给这段程序用while或者for语句来循环5次,这样就能得到启动LED1(1S闪烁一次,持续10S...

c51 单片机编程中断问题,中断后不能继续返回main函数,哪位高手看一下...
void int1_srv() interrupt 2\/\/INT1中断服务函数,中断向量标号2 { my_delay_10ms(1);\/\/延时消抖 KEY_BIT = 1;\/\/读MCS51的IO口之前要先对其置1 if(KEY_BIT == 0)\/\/按键仍然是按下状态 { \/\/while(KEY_BIT == 0);\/\/等待按键抬起 这部分就不用了。使用边沿触发,不必在等待按键抬起...

求单片机高手帮我逐句解释一下这个程序 谢谢了
include<intrins.h> define uchar unsigned char\/\/方便定义函数无符号型应该用UCHAR表示为方便直接用CHAR表示了。define uint unsigned int\/\/整形同上解释 sbit clock=P1^0; \/\/定义CLOCK接到单片机P0_1口,请注意这里用P0^1,就是因为包含了REG51.H。如果不包含就不能这么使用。sbit d_in=P1^1;sb...

高手,单片机程序里面可以同时出现两个中断吗
单片机程序里是不可能同时进入两个中断的。1、会有出现同时两个中断满足进入中断的条件,这时就会根据中断优先级进行判断先进入那个中断服务程序里,高优先级的执行完毕才会进入低优先级中断;2、如果正在执行中断服务程序(中断1)的时候,另一个中断(中断2)触发,如果优先级高于正在执行的中断,那么会...

高手,单片机程序里面可以同时出现两个中断吗
单片机程序里是不可能同时进入两个中断的。1、会有出现同时两个中断满足进入中断的条件,这时就会根据中断优先级进行判断先进入那个中断服务程序里,高优先级的执行完毕才会进入低优先级中断;2、如果正在执行中断服务程序(中断1)的时候,另一个中断(中断2)触发,如果优先级高于正在执行的中断,那么会...

单片机问题 高手麻烦帮忙解答下 谢谢了
总体上讲:为了每一次触发事件可查询,设立了标志位,当一标志位为1时,说明此事件已触发或是完成,这样可方便去查询该标志,然后需清0,再待下一次事件触发。 中断如果有触发,基本上全要软件清0; 至于外部,则同理,是用来记录单片机外围电路的触发事件的,如外部中断。

问几个单片机的问题 急求高手帮助 谢
1、ORG 30H \/\/将这一句之后的程序定义到地址30H处,一般51单片机的地址前30H是中断向量表,所以程序开头不能从00H开始,需要让开,所以,51单片机的程序都是,在00H处放跳转指令,跳到主程序,而主程序也不一定必须从30H开始,也可以往前或往后,全看你的程序如何了 2、A是51的累加器,作用是...

单片机的中断问题。。。
所以主函数中没有【引用】.中断函数和主函数没有任何直接关系 唯一的间接关系就是:在主函数中开放了中断请求(EXO=1)如果没有这行 中断就不可能发生 中断函数就永远不被运行 按钮就没有任何反应 .【要产生一个低电平触发的外部中断请求】这句话你要看完整啊,不要只看一段就乱说了 主语是什么...

相似回答
大家正在搜