发布时间 : 星期六 文章单片机电子时钟汇编语言程序更新完毕开始阅读1a81486a7e21af45b307a8cc
51单片机架构下时钟控制程序
;KEYA A键功能程序 开启/关闭定时器 ;KEYB B键功能程序 时值加1 ;KEYC C键功能程序 分值加1 ;KEYD D键功能程序 秒值加1
;KEYE E键功能程序 12/24时值转换 ;BEEP_BL整点报时 ;P0 显示接口
;系统初始化程序****************************************************
KEYA EQU P3.0
ORG 0000H AJMP MAIN
ORG 000BH AJMP PITO
;转到系统初始化程序
KEYB EQU P3.1 KEYC EQU P3.2 KEYD EQU P3.3 KEYE EQU P3.4 BEEP EQU P3.7
;单片机控制设置 ;单片机控制设置 ;单片机控制设置 ;单片机控制设置 ;单片机控制设置 ;单片机控制设置
;转到定时器0中断服务程序
ORG 0100H
MAIN: MOV SP, #60H MOV TMOD, #01H MOV TL0, #0DCH
MOV TH0, #0BH CLR 21H.0 CLR TR0 ; SETB EA ;
;确立堆栈区
;设定定时器0为工作方式1 ;装计数器初值
TR0置\,定时关闭 EA置\,中断总允许
SETB ET0 ; ET0置\,定时器0中断 ; 允许 MOV 30H, #10H ; MOV 7EH, #0AH ; MOV R0, #79H MOV R1, #05H PP: MOV @R0, #0BH INC R0
DJNZ R1, PP
MOV R0, #31H ;
循环次数 P.点显示初始化
时、分、秒值存储单元清零
MOV R1, #06H
Q00: MOV @R0, #00H INC R0
DJNZ R1, Q00
;监控程序********************************************************** LOOP: LCALL DIR LCALL KEY
; ;
调显示子程序 调键扫描子程序
LOOP1: JB 20H.0, KEYA ; A键是否按下,是跳转到A键功能程序 开启/关闭定时器
JB 20H.1, KEYB ; 时值加1
JB 20H.2, KEYC ; 分值加1
JB 20H.3, KEYD 秒值加1
JB 20H.4, KEYE
C键是否按下,是跳转到C键功能程序 B键是否按下,是跳转到B键功能程序
; D键是否按下,是跳转到D键功能程序 ; E键是否按下,是跳转到E键功能程序
跳转到监控程序
12/24时值转换
LCALL DIR LJMP LOOP ;
;A键功能子程序**************************************************** KEYA: CPL TR0 ;开启/关闭定时器 SETB 21H.0 AJMP LOOP
;返回
;B键功能子程序**************************************************** KEYB: JB TR0, KEYB1 ; 定时器是否运行,是跳转 JNB 21H.0, KEYB2
MOV R0, #36H ; 时值存储单元地址送R0 LCALL DAAD1 ; 调加1子程序 MOV A, R3 ; 时值加1后的值送累加器A LCALL BEEP_BL ; 整点报时 XRL A, #12H ;时值是否到12时 JNZ KEYB0 ; BACK: XRL A, #24H; 判是否到24时 JNZ KEYB1 ; 时值是否到24时,否返回 LCALL CLR0
; 时值存储单元清零
KEYB0: JB 20H.4, KEYB1; 是否启用12时值,否返回 LCALL CLR0 ; 时值存储单元清零 KEYB1: MOV 7DH, 35H
MOV 7EH, 36H KEYB2: LJMP LOOP ; 返回监控程序
;C键功能子程序**************************************************** KEYC: JB 8CH, KEYC1 ; 定时器是否运行,否跳转
JNB 21H.0, KEYC2
MOV R0, #34H; 分值存储单元地址送R0 LCALL DAAD1 ; 调加1子程序
MOV A, R3 ; 分值加1后的值送累加器A
XRL A, #60H ; JNZ KEYC1 ; 分值是否到60分,否返回 LCALL CLR0 ; 分值存储单元清零 KEYC1: MOV 7CH, 34H MOV 7BH, 33H KEYC2: LJMP LOOP ; 返回监控程序
;D键功能子程序**************************************************** KEYD: JB 8CH, KEYD1 ; 定时器是否运行,否跳转 JNB 21H.0, KEYD2
MOV R0, #32H ; 秒值存储单元地址送R0 LCALL DAAD1 ; 调加1子程序 MOV A, R3 ; 秒值加1后的值送R0 XRL A, #60H JNZ KEYD1 LCALL CLR0
KEYD1: MOV 79H, 31H MOV 7AH, 32H KEYD2: LJMP LOOP
;
返回监控程序 ; ;
秒值是否到60秒,否返回 秒值存储单元清0
;中断服务程序****************************************************** PITO: PUSH PSW PUSH A SETB RS0
;中断服务程序,现场保护 ;选第三组通用寄存器 ;
计数器重新加载
SETB RS1
MOV TL0, #0DCH MOV TH0, #0BH MOV A, 30H
DEC A
MOV 30H, A JNZ RETO MOV 30H, #10H
;循环次数减1
;不满16次,转RET0返回 ;满16次开始计时操作 ;秒显示单元地址 ; 秒加1
加1后秒值在R3中 判是否到60秒 不到转RET0返回 ; 到60秒显示单元清0 分显示单元地址 ; 分加1
MOV R0, #32H ACALL DAAD1 MOV A, R3 ; XRL A, #60H ; JNZ RETO ; ACALL CLR0 MOV R0, #34H; ACALL DAAD1
MOV A, R3 ;
XRL A, #60H ; JNZ RETO ; ACALL CLR0 MOV R0, #36H ;
加1后分值在R3中 判是否到60分 不到转RET0返回
; 到60分显示单元清0 时显示单元地址
时加1
加1后时值在R3中
ACALL DAAD1 MOV A, R3 ; ;
LCALL BEEP_BL ; 整点报时
XRL A, #12H ; 时值是否到12时
JNZ KEYB3 ;
XRL A, #24H ; 判是否到24时
;
不到转RET0返回
JNZ RETO
ACALL CLR0 ; 到24时显示单元清0 KEYB3:JB 20H.4, RETO; 是否启用12时值,否返回 ACALL CLR0 RETO: CLR RS0 CLR RS1 POP A
; 时值存储单元清零 ; 返回第0组通用寄存器
;
现场恢复
POP PSW MOV 79H, 31H ; MOV 7AH, 32H
时、分、秒值放缓冲区
MOV 7BH, 33H MOV 7CH, 34H MOV 7DH, 35H MOV 7EH, 36H RETI ; 中断返回
;加1子程序******************************************************* DAAD1: MOV A, @R0 ; 加1子程序,十位送A DEC R0 SWAP A
;
十位数占高4位
ORL A, @R0 ; ADD A, #01H ; DA A MOV R3, A
;
个位数占低4位 加1
; 十进制调整 全值暂存R3中
屏蔽十位数,取出个位数 ; 个位值送显示缓冲单元
ANL A, #0FH ; MOV @R0, A MOV A, R3 INC R0
ANL A, #0F0H ; SWAP A MOV @R0, A RET CLR0: CLR A MOV @R0, A
; ;
屏蔽个位数取出十位数 ; ;
使十位数占低四位 十位数送缓冲单元
返回
清缓冲单元子程序
; 十位缓冲单元清\