当前位置:文档之家› 单片机电子时钟汇编语言程序

单片机电子时钟汇编语言程序

51单片机架构下时钟控制程序;KEYA A键功能程序开启/关闭定时器;KEYB B键功能程序时值加1;KEYC C键功能程序分值加1;KEYD D键功能程序秒值加1;KEYE E键功能程序12/24时值转换;BEEP_BL整点报时;P0 显示接口;系统初始化程序****************************************************KEYA EQU P3.0 ;单片机控制设置KEYB EQU P3.1 ;单片机控制设置KEYC EQU P3.2 ;单片机控制设置KEYD EQU P3.3 ;单片机控制设置KEYE EQU P3.4 ;单片机控制设置BEEP EQU P3.7 ;单片机控制设置ORG 0000HAJMP MAIN ;转到系统初始化程序ORG 000BHAJMP PITO ;转到定时器0中断服务程序ORG 0100HMAIN: MOV SP, #60H ;确立堆栈区MOV TMOD, #01H ;设定定时器0为工作方式1MOV TL0, #0DCH ;装计数器初值MOV TH0, #0BHCLR 21H.0CLR TR0 ; TR0置"0",定时关闭SETB EA ; EA置"1",中断总允许SETB ET0 ; ET0置"1",定时器0中断; 允许MOV 30H, #10H ; 循环次数MOV 7EH, #0AH ; P.点显示初始化MOV R0, #79HMOV R1, #05HPP: MOV @R0, #0BHINC R0DJNZ R1, PPMOV R0, #31H ; 时、分、秒值存储单元清零Q00: MOV @R0, #00HINC R0DJNZ R1, Q00;监控程序**********************************************************LOOP: LCALL DIR ; 调显示子程序LCALL KEY ; 调键扫描子程序LOOP1: JB 20H.0, KEYA ; A键是否按下,是跳转到A键功能程序开启/关闭定时器JB 20H.1, KEYB ; B键是否按下,是跳转到B键功能程序时值加1JB 20H.2, KEYC ; C键是否按下,是跳转到C键功能程序分值加1JB 20H.3, KEYD ; D键是否按下,是跳转到D键功能程序秒值加1JB 20H.4, KEYE ; E键是否按下,是跳转到E键功能程序12/24时值转换LCALL DIRLJMP LOOP ; 跳转到监控程序;A键功能子程序****************************************************KEYA: CPL TR0 ;开启/关闭定时器SETB 21H.0AJMP LOOP ;返回;B键功能子程序****************************************************KEYB: JB TR0, KEYB1 ; 定时器是否运行,是跳转JNB 21H.0, KEYB2MOV R0, #36H ; 时值存储单元地址送R0LCALL DAAD1 ; 调加1子程序MOV A, R3 ; 时值加1后的值送累加器ALCALL 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, 35HMOV 7EH, 36HKEYB2: LJMP LOOP ; 返回监控程序;C键功能子程序****************************************************KEYC: JB 8CH, KEYC1 ; 定时器是否运行,否跳转MOV R0, #34H; 分值存储单元地址送R0LCALL DAAD1 ; 调加1子程序MOV A, R3 ;分值加1后的值送累加器AXRL A, #60H ;JNZ KEYC1 ; 分值是否到60分,否返回LCALL CLR0 ; 分值存储单元清零KEYC1: MOV 7CH, 34HMOV 7BH, 33HKEYC2: LJMP LOOP ; 返回监控程序;D键功能子程序**************************************************** KEYD: JB 8CH, KEYD1 ; 定时器是否运行,否跳转JNB 21H.0, KEYD2MOV R0, #32H ; 秒值存储单元地址送R0LCALL DAAD1 ; 调加1子程序MOV A, R3 ; 秒值加1后的值送R0XRL A, #60HJNZ KEYD1 ; 秒值是否到60秒,否返回LCALL CLR0 ; 秒值存储单元清0 KEYD1: MOV 79H, 31HMOV 7AH, 32HKEYD2: LJMP LOOP ; 返回监控程序;中断服务程序****************************************************** PITO: PUSH PSW ;中断服务程序,现场保护PUSH ASETB RS0 ;选第三组通用寄存器SETB RS1MOV TL0, #0DCH ; 计数器重新加载MOV TH0, #0BHMOV A, 30H ;循环次数减1DEC AMOV 30H, AJNZ RETO ;不满16次,转RET0返回MOV 30H, #10H ;满16次开始计时操作MOV R0, #32H ;秒显示单元地址ACALL DAAD1 ; 秒加1MOV A, R3 ; 加1后秒值在R3中XRL A, #60H ; 判是否到60秒JNZ RETO ; 不到转RET0返回ACALL CLR0 ; 到60秒显示单元清0MOV R0, #34H ;分显示单元地址ACALL DAAD1 ; 分加1MOV A, R3 ; 加1后分值在R3中XRL A, #60H ; 判是否到60分JNZ RETO ; 不到转RET0返回ACALL CLR0 ; 到60分显示单元清0MOV R0, #36H ; 时显示单元地址ACALL DAAD1 ; 时加1MOV A, R3 ; 加1后时值在R3中LCALL BEEP_BL ; 整点报时XRL A, #12H ; 时值是否到12时JNZ KEYB3 ;XRL A, #24H ; 判是否到24时JNZ RETO ; 不到转RET0返回ACALL CLR0 ; 到24时显示单元清0 KEYB3:JB 20H.4, RETO; 是否启用12时值,否返回ACALL CLR0 ; 时值存储单元清零RETO: CLR RS0 ; 返回第0组通用寄存器CLR RS1POP A ; 现场恢复POP PSWMOV 79H, 31H ; 时、分、秒值放缓冲区MOV 7AH, 32HMOV 7BH, 33HMOV 7CH, 34HMOV 7DH, 35HMOV 7EH, 36HRETI ; 中断返回;加1子程序******************************************************* DAAD1: MOV A, @R0 ; 加1子程序,十位送ADEC R0SW AP A ; 十位数占高4位ORL A, @R0 ; 个位数占低4位ADD A, #01H ; 加1DA A ; 十进制调整MOV R3, A ; 全值暂存R3中ANL A, #0FH ; 屏蔽十位数,取出个位数MOV @R0, A ; 个位值送显示缓冲单元MOV A, R3INC R0ANL A, #0F0H ; 屏蔽个位数取出十位数SW AP A ; 使十位数占低四位MOV @R0, A ; 十位数送缓冲单元RET ; 返回CLR0: CLR A ; 清缓冲单元子程序MOV @R0, A ; 十位缓冲单元清"0"DEC R0MOV @R0, A ; 个位数缓冲单元清"0"RET ; 返回;键盘扫描子程序*************************************************** KEY: LCALL KEYCHULI ; 调键值处理子程序JZ EXIT ; 没有键按下转到返回LCALL DIRLCALL DIR ; 调显示去抖动LCALL KEYCHULI ; 调键值处理子程序JZ EXIT ; 没有键按下转到返回MOV B, 20H ; 保存键值KEYSF: LCALL KEYCHULI ; 调键值处理子程序JZ KEY1 ; 键释放,转到恢复键值LCALL DIR ; 调显示子程序延时AJMP KEYSF ; 等到键释放KEY1: MOV 20H, B ; 键值送20H单元保存EXIT: RET ; 返回KEYCHULI: PUSH PSW ; 保护现场CLR RS1 ; 改变寄存器组号SETB RS0MOV P1, #0FFH ; 先向P1口写1MOV A, P1 ; P1口值送累加器ACPL A ; A值取反ANL A, #0FH ; 保存P1口的低4位MOV 20H, A ; A值送20H保存CLR RS1 ; 改变寄存器组号CLR RS0 ;POP PSW ; 恢复现场RET;显示子程序******************************************************** DIR: PUSH PSW ; 恢复现场SETB RS1 ; 改变寄存器组号CLR RS0MOV R0, #79H ; 建立显示缓冲区首地址MOV R3, #0FBH ; 设置位控码LD0: MOV P2, R3 ; 送位控码MOV A, @R0 ; 缓冲区值送累加器A DISP1: ADD A, #1BHMOVC A, @A+PC ; 取段控码并送A中DISP2: MOV P0, A ; 送段控码MOV R2, #09H ; 设置延时循环次数ACALL DEY ; 延时点亮INC R0 ; 缓冲区地址加1MOV A, R3 ; 位控码送AJNB ACC.1, HERE ; 是否到最高位,是转到返回JB ACC.5, LD2RL ARL A ; 不到向显示器高位移位LD2:RL AMOV R3, A ; 位控值保存到R4中AJMP LD0 ; 继续扫描HERE: CLR RS0 ; 改变寄存器组号CLR RS1POP PSW ; 恢复现场RET ; 返回DBB: DB 0C0HDB 0F9HDB 0A4HDB 0B0HDB 99HDB 92HDB 82HDB 0F8HDB 80HDB 90HDB 0CHDB 0FFH;整点报时********************************************************** BEEP_BL: MOV R6,#100BL1:CALL BL2CPL BEEPDJNZ R6,BL1MOV R5,#25CALL DEYRET ;返回计时BL2:MOV R7,#180BL3:NOPDJNZ R7,BL3RET;延时子程序******************************************************** DEY: PUSH 12HDEY0: PUSH 12HDEY1: PUSH 12HDEY2: DJNZ R2, DEY2POP 12HDJNZ R2, DEY1 POP 12HDJNZ R2, DEY0 POP 12HDJNZ R2, DEY RETEND。

相关主题