MCS51系列单片机系统其应用.docx
《MCS51系列单片机系统其应用.docx》由会员分享,可在线阅读,更多相关《MCS51系列单片机系统其应用.docx(10页珍藏版)》请在冰点文库上搜索。
MCS51系列单片机系统其应用
MCS-51系列单片机系统及其应用
实验四:
时钟实验
实验内容:
在实验三的基础上,利用LED显示字型的功能,应用单片机的定时器及定时器中断功能编制一程序,让LED数码显示器上显示出按精确秒信号的节律变化的字型,即电子时钟。
b5E2RGbCAP
实验目的:
1:
掌握在RAM区内开辟显示缓冲区的方法。
2:
进一步熟悉用LED数码管显示字型程序的设计方法。
3:
掌握定时器初始值的计算方法。
4:
掌握定时器的用法以及定时器中断的控制。
5:
明确中断子程序与一般子程序的区别及联系。
6:
学会设计简单的数值比较程序,学会设计根据RAM中某一单元的内容进行查表的程序。
实验要求:
1:
设计程序时,应在内部RAM中开辟显示缓冲区,缓冲区内首先设置时钟的初始时间<12-00-00)。
p1EanqFDPw
2:
利用定时器的计数溢出产生中断,从而产生秒信号。
3:
将LED数字显示程序设计为子程序,将时、分、秒加“1”的溢出判断在中断服务子程序中进行,主程序完成初始化后一直调用显示子程序。
DXDiTa9E3d
程序的设计思路参考如下:
1:
将内部的RAM中的78H—7FH这八个单元作为显示缓冲区,将时钟要显示的初值的数字<非字型代码)置入这八个单元中,等待显示子程序利用其中的数据去查出相应的字型代码,送出显示。
RTCrpUDGiT
2:
用有寄存器间接寻址功能的工作寄存器R0作为显示缓冲区的指示器,将显示缓冲区内的数据与查表类指令发生联系,以便按显示缓冲区内的数据查表。
5PCzVD7HxA
3:
主程序初始化时首先将定时器中断的总开关关闭,选择一个定时器,设定该定时器的工作方式,将该定时器的两个计数单元赋一预先设好的初始数据。
开启所有与所选择的定时器有关的中断开关,但不启动计数器,作好准备。
jLBHrnAILg
4:
当主程序初始化完毕之后,开始调用显示子程序之前开启计数器,此时主程序即进入无休止的调用显示子程序的状态,随时准备着被定时器所中断。
xHAQX74J0X
5:
在中断子程序的入口处若有必要保护主程序在中断时主要寄存器的状态,请务必执行堆栈以保护中断时CPU的现场。
并且关闭所选择的定时器的中断允许控制位,但不要让定时计数器停止计数,重新对定时器的定时单元进行赋值<与主程序初始化时所赋的值相同)。
LDAYtRyKfE
6:
靠定时器溢出一次,不可能产生秒信号,所以要在定时器溢出发生中断,程序条入中断服务程序后,不仅要给定时器重新赋值,而且要设计一个计数器,让定时器溢出若干次,直到定时器定时的累积值达到1秒为止,然后对显示缓冲区的秒位加“1”,在加“1”之后还要判断是否产生进位,然后加以处理,结果让屏幕上所显示的数字为时钟的有效数值,即秒位与分位不能超出60,小时位则不能超出24<统一将时钟设计为24小时制)。
Zzz6ZB2Ltk
7:
为了使所设计的程序简短,建议将程序中相同的部分都设计成子程序。
参考程序二例:
参考程序程序一主程序略有不同,中断服务程序则大有差别,但都能实现同一个目的<电子时钟)。
dvzfvkwMI1
参考程序一:
CJC7.ASM
ORG0000H
AJMP0030H
ORG000BH;定时器中断入口地址
AJMPINTT0;跳入中断服务子程序
MAIN:
MOV78H,#00H
MOV79H,#00H
MOV7AH,#0AH
MOV7BH,#00H
MOV7CH,#00H
MOV7DH,#0AH
MOV7EH,#02H
MOV7FH,#01H;显示缓冲区初始化;-----------------------------------------rqyn14ZNXI
MOVSP,#50H;修改堆栈指针
MOVR0,#78H;给定显示缓冲区首地址
MOVTMOD,#01H;设置定时器的定时方式
MOVTH0,#17H
MOVTL0,#0B8H;预置定时初值
SETB8CH
SETB0AFH
SETB0A9H;开中断、启动定时器
MOVR6,#08H
LOOP0:
LCALLDISP;调用显示子程序
SJMPLOOP0;----------------------------------
DISP:
MOVR1,#01H
LOOP1:
MOVA,@R0
MOVCA,@A+DPTR
MOVP0,A
MOVP1,R1;显示1个数字
ACALLDELAY
INCR0
MOVA,R1
CJNEA,#01H,LOOP1;显示8个数字
MOVR0,#78HRET。
----------------------------------
DELAY:
MOVR3,#0FFH
DJNZR3,$
MOVR4,#0FFH
DJNZR4,$
RET;0.5毫秒延时。
----------------------------------EmxvxOtOco
DATA:
DB0C0H,0F9H,0A4H
DB0B0H,99H,92H
DB82H,0F8H,80H
DB90H,0BFH;显示字型代码表
。
-----------------------------------
INTT0:
MOVTH0,#17H;中断服务程序
MOVTL0,#0B8H;定时器再次预置初值
PUSHACC
PUSHPSW;保护现场
SETBPSW.3
MOVA,30H
DECA
MOV30H,A
JNZRETO;到1秒否?
MOV30H,#08H
。
-------------------------------------
MOVR0,#79H
ACALLADD1;秒加“1”
MOVA,R2
XRLA,#60;到60秒否?
JNZRETO
ACALLCLR0;秒位清零
。
-------------------------------------
MOVR0,#7CH
ACALLADD1;分加“1”
MOVA,R2
XRLA,#60
JNZRETO;到60分否?
ACALLCLR0;分位清零
。
---------------------------------
MOVR0,#7FH
ACALLADD1;小时加“1”
MOVA,R2
XRLA,#24
JNZRETO;到24小时否?
ACALLCLR0;小时位清零
;-----------------------------------
RETO:
POPPSW
POPACC;恢复现场
RETI;中断返回
。
-----------------------------------
ADD1:
MOVA,@R0;加“1”子程序
DECR0
SWAPA
ORLA,@R0;合并字节
ADDA,#01H;加“1”
DAA
MOVR2,A
ANLA,#0FH;坼分字节
MOV@R0,A;放入显示缓冲区
MOVA,R2
INCR0
ANLA,#0F0H
SWAPA
MOV@R0,A;放入显示缓冲区
RET
。
-----------------------------------
CLR0:
CLRA
MOV@R0,A
DECR0
MOV@R0,A
RET;清零子程序
---------------------------------------------------SixE2yXPq5
参考程序二:
CJC8.ASM
ORG0000H
AJMP000EH;主程序入口
ORG000BH;定时器中断程序入口
AJMPINTT0;跳入中断服务程序
ORG000EH
MAIN:
MOV78H,#00H
MOV79H,#00H
MOV7AH,#0AH
MOV7BH,#00H
MOV7CH,#00H
MOV7DH,#0AH
MOV7EH,#02H
MOV7FH,#01H;显示缓冲区初始化
MOVR0,#78H
MOVTMOD,#01H
MOVTH0,#17H
MOVTL0,#0B8H
SETBTR0
SETBET0
SETBEA;定时器的控制
MOVR6,#08H
LOOP0:
LCALLDISP;调用显示程序
SJMPLOOP0
;------------------------------------------
DISP:
MOVR1,#01H;显示子程序
LOOP1:
MOVA,@R0
MOVCA,@A+DPTR
MOVP0,A
MOVP1,R1
ACALLDELAY
INCR0
MOVA,R1
RLA
MOVR1,A
CJNEA,#01H,LOOP1
MOVR0,#78H
RET
。
----------------------------------
DELAY:
MOVR3,#0FFH
DJNZR3,$
MOVR4,#0FFH
DJNZR4,$
RET;显示用延时程序
。
---------------------------------------
DATA:
DB0C0H,0F9H,0A4H
DB0B0H,99H,92H
DB82H,0F8H,80H
DB90H,0BFH;显示字型代码表
。
-----------------------------------
INTT0:
MOVTH0,#17H;中断服务程序
MOVTL0,#0B8H
PUSHACC
DJNZR6,RETO
INC78H
MOVA,78H
CJNEA,#0AH,RETO
MOV78H,#00H
INC79H
MOVA,79H
CJNEA,#06H,RETO
MOV79H,#00H
INC7BH
MOVA,7BH
CJNEA,#0AH,RETO
INC7CH
MOVA,7CH
CJNEA,#06H,RETO
MOV7CH,#00H
INC77H
INC7EH
MOVA,77H
CJNEA,#24,TEET
。
-------------------------------
RETO:
MOV77H,#00H
MOV7EH,#00H
MOV7FH,#00H
POPACC
RETI
。
-----------------------------------
REET:
MOVA,7EH
CJNEA,#0AH,RETO
MOV7EH,#00H
INC7FH
MOVA,7FH
CJNEA,#03H,RETO
AJMPRETO;加“1”及判断程序
注意:
以上二程序仅供参考,不过稍加思考即可使程序成功地运行,请大家务必注意程序设计中的细节部分,吾故如此,旨在让大家悉心思考之,以便学习。
6ewMyirQFL