这是我在大学的时候编的. 记得当时我们开发小组从下午5点调试到11点多才成功, 最有成就感的一天!
;=======================================
; Clock programe
; Create date: 2004_05_12
; First Modify: 2004_05_13
; First Modify: 2004_05_13
; Last Modify: 2004_05_20
; Author: Dengjingyue
;=======================================
SDA BIT P0.1 ;定义
SCL BIT P0.0 ;定义
Second_0 EQU 40H ;定义秒个位
Second_1 EQU 41H ;定义秒十位
LED2 EQU 42H ;
Minute_0 EQU 43H ;定义分个位
Minute_1 EQU 44H ;定义分十位
LED5 EQU 45H
Hour_0 EQU 46H ;定义小时个位
Hour_1 EQU 47H ;定义小时十位
SECOND EQU 48H ;定义秒
MINUTE EQU 49H ;定义分
HOUR EQU 50H ;定义小时
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP INT_CLOCK ;中断入口
ORG 0100H
;============主程序开始=======================
MAIN:
MOV R7,#00H ;赋初值
MOV SECOND, #00H ;赋初值
MOV MINUTE, #00H ;赋初值
MOV HOUR, #00H ;赋初值
ACALL Separate ;拆分子程序
ACALL DISPLAY ;显示子程序
;----------------------------
MOV TMOD,#01H ;设定时器0为定时方式1(16位)
MOV TH0, #0DBH ;定时初值高8位
MOV TL0, #0F0H ;定时初值低8位
SETB EA ;开总中断允许
SETB ET0 ;开定时器0允许中断
SETB TR0 ;启动定时器
AJMP $
;================中断服务子程序=====================
INT_CLOCK:
MOV TH0, #0DBH ;定时初值高8位
MOV TL0, #0F0H ;定时初值低8位
INC R7
CJNE R7,#100, EXIT ;每次中断时间是0.1秒, 100次是1秒.
MOV R7,#00 ;到1秒, R7清零
;-----------------------------------
INC SECOND ;秒加1
MOV A,SECOND
CJNE A,#60, LP
MOV SECOND, #00H ;秒清0
INC MINUTE ;分加1
MOV A,MINUTE
CJNE A,#60, LP
MOV MINUTE, #00H ;分清0
INC HOUR ;小时1
MOV A,HOUR
CJNE A,#24, LP
MOV HOUR, #00H ;小时清0
LP: ACALL Separate ;拆分子程序
ACALL DISPLAY ;显示子程序
; ACALL DELAY_1* ;延时约一秒
**IT: RETI
;===主程序结束=== [page]
;==============拆分子程序=====================
Separate:
MOV DPTR,#TAB1
;-------------------
MOV A,SECOND
MOVC A,@A+DPTR ;查表,十六进制转为十进制数
mov R0,A ;R0暂存A中的数
ANL A,#0FH ;屏蔽高4位
MOV Second_0, A ;送秒个位
MOV A,R0 ;恢复A中数
ANL A, #0F0H ;屏蔽低4位
SWAP A ;高4位与低4位交换
MOV Second_1,A ;送秒十位
;--------------------
MOV LED2,#0FFH ;数码管灭的显示代码
;--------------------
MOV A,MINUTE
MOVC A,@A+DPTR
mov R0,A
ANL A,#0FH
MOV Minute_0, A
MOV A,R0
ANL A, #0F0H
SWAP A
MOV Minute_1,A
;-----------------------
MOV LED5,#0FFH ;数码管灭的显示代码
;-----------------------
MOV A,HOUR
MOVC A,@A+DPTR
ANL A,#0FH
MOV Hour_0, A
MOV A,HOUR
ANL A, #0F0H
SWAP A
MOV Hour_1,A
RET
;-----------------------
TAB1: DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H ; 十六进制转十进制数表
DB 10H,11H,12H,13H,14H,15H,16H,17H,18H,19H
DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H,48H,49H
DB 50H,51H,52H,53H,54H,55H,56H,57H,58H,59H
DB 60H,61H,62H,63H,64H,65H,66H,67H,68H,69H
DB 70H,71H,72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H,88H,89H
DB 90H,91H,92H,93H,94H,95H,96H,97H,98H,99H
;===================显示子程序=====================
DISPLAY:
MOV DPTR,#TAB2 ;送显示代码首地址
MOV A,Second_0 ;秒个位送A
MOVC A,@A+DPTR ;显示代码查表
ACALL SHIFT ;调移位子程序
MOV A,Second_1
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,LED2
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,Minute_0
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,Minute_1
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,LED5
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,Hour_0
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,Hour_1
MOVC A,@A+DPTR
ACALL SHIFT
RET
;----------------------------------------------
TAB2: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H ;0,1,2,3,4,5,6,7 显示代码
DB 10H,90H,50H,1CH,39H,16H,38H,78H,0FFH ;8,9,A,B,C,D,E,F,灭
;---------------------------------------------
;================移位子程序==================
SHIFT: push a ;A进栈暂存
MOV R2,#8
CLR C
CLR SCL
DL:
RLC A
MOV SDA,C
SETB SCL
CLR SCL
DJNZ R2,DL
pop a ;出栈恢复A值
RET
;============延时约一秒子程序=============
DELAY_1S: MOV R6,#1FH
LOOP7: MOV R5,#0FFH
LOOP6: NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R5,LOOP6
DJNZ R6,LOOP7
RET
END
完整程序请从这里下:http://www.51hei.com/ziliao/file/shiz.rar ,本人已经测试通过.
上一篇:串口通讯程序-查询法
下一篇:单片机双机通信(C51程序)
推荐阅读最新更新时间:2024-03-16 13:11