时钟实验

leeweiran   2009-5-5 15:27 楼主
MCS-51系列单片机系统及其应用

实验四:时钟实验
实验目的:
1:掌握在RAM区内开辟显示缓冲区的方法。
2:进一步熟悉用LED数码管显示字型程序的设计方法。
3:掌握定时器初始值的计算方法。
4:掌握定时器的用法以及定时器中断的控制。
5:明确中断子程序与一般子程序的区别及联系。
6:学会设计简单的数值比较程序,学会设计根据RAM中某一单元的内容进行查表的程序。

实验要求:
1:设计程序时,应在内部RAM中开辟显示缓冲区,缓冲区内首先设置时钟的初始时间(12-00-00 )。
2:利用定时器的计数溢出产生中断,从而产生秒信号。
3:将LED数字显示程序设计为子程序,将时、分、秒加“1”的溢出判断在中断服务子程序中进行,主程序完成初始化后一直调用显示子程序。

程序的设计思路参考如下:
1:将内部的RAM中的78H—7FH这八个单元作为显示缓冲区,将时钟要显示的初值的数字(非字型代码)置入这八个单元中,等待显示子程序利用其中的数据去查出相应的字型代码,送出显示。
2:用有寄存器间接寻址功能的工作寄存器R0作为显示缓冲区的指示器,将显示缓冲区内的数据与查表类指令发生联系,以便按显示缓冲区内的数据查表。
3:主程序初始化时首先将定时器中断的总开关关闭,选择一个定时器,设定该定时器的工作方式,将该定时器的两个计数单元赋一预先设好的初始数据。开启所有与所选择的定时器有关的中断开关,但不启动计数器,作好准备。
4:当主程序初始化完毕之后,开始调用显示子程序之前开启计数器,此时主程序即进入无休止的调用显示子程序的状态,随时准备着被定时器所中断。
5:在中断子程序的入口处若有必要保护主程序在中断时主要寄存器的状态,请务必执行堆栈以保护中断时CPU的现场。并且关闭所选择的定时器的中断允许控制位,但不要让定时计数器停止计数,重新对定时器的定时单元进行赋值(与主程序初始化时所赋的值相同)。
6:靠定时器溢出一次,不可能产生秒信号,所以要在定时器溢出发生中断,程序条入中断服务程序后,不仅要给定时器重新赋值,而且要设计一个计数器,让定时器溢出若干次,直到定时器定时的累积值达到1秒为止,然后对显示缓冲区的秒位加“1”,在加“1”之后还要判断是否产生进位,然后加以处理,结果让屏幕上所显示的数字为时钟的有效数值,即秒位与分位不能超出60,小时位则不能超出24(统一将时钟设计为24小时制)。
7:为了使所设计的程序简短,建议将程序中相同的部分都设计成子程序。




ORG 0000H
                AJMP 0030H
ORG 000BH                         ;定时器中断入口地址
AJMP INTT0                        ;跳入中断服务子程序
MAIN:        MOV 78H,#00H
MOV 79H,#00H
MOV 7AH,#0AH
MOV 7BH,#00H
MOV 7CH,#00H
MOV 7DH,#0AH
MOV 7EH,#02H
MOV 7FH,#01H                       ;显示缓冲区初始化
;---------------------------------------------
MOV SP,#50H                       ;修改堆栈指针
MOV R0,#78H                       ;给定显示缓冲区首地址
MOV TMOD,#01H                     ;设置定时器的定时方式
MOV TH0,#17H
MOV TL0,#0B8H                     ;预置定时初值
SETB 8CH                  
SETB 0AFH
SETB 0A9H                          ;开中断、启动定时器
MOV R6,#08H
LOOP0:        LCALL DISP                         ;调用显示子程序
                SJMP LOOP0
;------------------------------------
DISP:                MOV R1,#01H
LOOP1:                MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
MOV P1,R1                    ;显示1个数字
ACALL DELAY
INC R0
MOV A,R1
CJNE A,#01H,LOOP1            ;显示8个数字
                        MOV R0,#78H
                        RET
;----------------------------------
DELAY:                MOV R3,#0FFH
                        DJNZ R3,$
                        MOV R4,#0FFH
                        DJNZ R4,$
                        RET                           ;0.5毫秒延时
;----------------------------------
DATA:                DB 0C0H,0F9H,0A4H
                        DB 0B0H,99H,92H
                        DB 82H,0F8H,80H
                        DB 90H,0BFH                   ;显示字型代码表
;-----------------------------------
INTT0:                MOV TH0,#17H                ;中断服务程序
MOV TL0,#0B8H               ;定时器再次预置初值
PUSH ACC  
PUSH PSW                      ;保护现场
SETB PSW.3
MOV A,30H
DEC A
MOV 30H,A
JNZ RETO                     ;到1秒否?
MOV 30H,#08H
;-------------------------------------
MOV R0,#79H
ACALL ADD1                 ;秒加“1”
MOV A,R2
XRL A,#60                  ;到60秒否?
JNZ RETO
ACALL CLR0                 ;秒位清零
;-------------------------------------
MOV R0,#7CH
ACALL ADD1                  ;分加“1”
MOV A,R2
XRL A,#60
JNZ RETO                        ;到60分否?
ACALL CLR0                     ;分位清零
;---------------------------------
MOV R0,#7FH
ACALL ADD1                     ;小时加“1”
MOV A,R2
XRL A,#24
JNZ RETO                         ;到24小时否?
ACALL CLR0                      ;小时位清零
;-----------------------------------
RETO:                POP PSW
POP ACC                          ;恢复现场
RETI                              ;中断返回
; -----------------------------------
ADD1:                 MOV A,@R0                       ;加“1”子程序
DEC R0
SWAP A
ORL A,@R0                        ;合并字节
ADD A,#01H                       ;加“1”
DA A
MOV R2,A
ANL A,#0FH                       ;坼分字节
MOV @R0,A                       ;放入显示缓冲区
MOV A,R2
INC R0
ANL A,#0F0H
SWAP A
MOV @R0,A                     ;放入显示缓冲区
RET
;-----------------------------------
CLR0:                  CLR A
MOV @R0,A
DEC R0
MOV @R0,A
RET                             ;清零子程序




本人不擅长单片机的研究,无奈老师 布置了这个作业,请知道的朋友多多帮忙.此程序有多处错误.

回复评论 (1)

你所谓的错误是什么?是keil提示的吗?
点赞  2009-8-27 23:52
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复