1、用定时器中断控制信号灯。ORG0000H
本文引用地址://m.amcfsurvey.com/article/201611/320489.htmLJMPMAIN
ORG000BH;内中断T0入口地址
LJMPT0INT
ORG02400H
MAIN:MOVSP,#30H
MOVA,#00H
MOVTMOD,#01H
MOVTH0,#3CH
MOVTL0,#0B0H
SETBEA
SETBET0
SETBTR0
LOOP:LJMPLOOP
ORG0340H
T0INT:MOVTH0,#3CH
MOVTL0,#0B0H
MOVP1,A
CPLA;亮点闪烁
RETI
END
分析:在本程序中,使用定时器0的中断方式产生100ms的延时,实现8个LED的亮点闪烁。当给SP、A赋值后,程序员给TMOD、TH0、TL0,将TR0置1,然后执行“LOOP: SJMP LOOP”指令,这样不断的循环。
2、用定时器中断和外中断控制信号灯。
ORG0000H
LJMPMAIN
ORG0003H;外中断入口地址
LJMPINT
ORG000BH;内中断入口地址
LJMPT0INT
ORG0100H
MAIN:MOVSP,#30H
MOVA,#0FEH
MOVTMOD,#01H
SETBEA
SETBEX0
SETBIT0
SETBET0
SETBPX0;设置外部中断0为高优先级
MOVTH0,#3CH
MOVTL0,#0B0H
SETBTR0
LOOP0:LJMPLOOP0
ORG0200H;内中断程序块
T0INT:MOVTH0,#3CH
MOVTL0,#0B0H
MOVR3,#08H
MOVP1,A
LCALLDELAY
RLA;亮点流动
RETI
ORG0300H; 外中断程序块
INT:PUSHACC
MOVA,#00H
MOVR3,#08H
LOOP1:MOVP1,A
LCALLDELAY
CPLA;亮点闪烁
DJNZR3,LOOP1
POPACC
RETI
ORG0400H;延迟程序块
DELAY:MOVR0,#0FFH
D1:MOVR1,#0FFH
D2:MOVR2,#0FFH
D3:DJNZR2,D3
DJNZR1,D2
DJNZR0,D1
RET
END
分析:程序开始时,使用定时器0的中断方式产生100ms的延时,实现8个LED的亮点流动。在亮点流动的过程中,如果按下单脉冲键,由于将外部中断0的优先级设置为高优先级,所以8个LED的发光状态将改为同时闪烁,闪烁8次恢复亮点流动(闪烁时间间隔由延时程序完成)。
3、实验心得
计数器/定时器本质上都是是对一个脉冲源进行加1计数。它的计数的脉冲源是什么取决了它是计数器还是定时器;加1计数器的脉冲源是来自于晶体振荡器时,为定时状态;脉冲源是来自于单片机外部,由于外部的的脉冲间隔不一定相等,计数和时间就没有明确的关系密切,所以这时只能是对外部的脉冲进行“计数”。在实验中,由于没有给单片机输入外部信号,这说明定时/计数器的计数脉冲来自于单片机的晶体振荡,即定时/计数器工作在定时状态下。
由振荡频率来计数,因为一个机器周期包括12个振荡周期,计数器加1实际上累加的是机器周期,每一个机器周期,计数器就加1。根据振荡频率,可以得出计数脉冲的间隔时间,即计数器加1的时间间隔。当已知计数/定时器的差值时,就可得达到定时效果。
评论