电路图:

汇编代码:

     ORG 0000HLJMP MAIN  ORG 000BH           LJMP TIME   ORG 0100H;宏定义;键位K0  BIT 20H.0K1 BIT 20H.1K2 BIT 20H.2K3  BIT 20H.3K4    BIT 20H.4;暂存区ST  DATA 68HMT     DATA 69HHT  DATA 6AHDT  DATA 6BHMOUT DATA 6CHYLT    DATA 6DHYHT DATA 6EH    SPT DATA 21H    ;移位指针;时钟时间寄存区           S   DATA 60HM   DATA 61HH   DATA 62HD   DATA 63HMOU DATA 64HYL  DATA 65HYH  DATA 66HFLAG DATA 67H;闹钟时间寄存区           SC      DATA 50HMC      DATA 51HHC      DATA 52HDC      DATA 53HMOUC    DATA 54HYLC     DATA 55HYHC     DATA 56H;时间显示缓冲区//存放数码管显示16位的数据SDL      DATA 70HSDH     DATA 71HPOINT1  DATA 72HMDL     DATA 73HMDH     DATA 74HPOINT2  DATA 75HHDL     DATA 76HHDH     DATA 77HDDL     DATA 78HDDH     DATA 79HMOUDL   DATA 7AHMOUDH   DATA 7BHYD0     DATA 7CHYD1     DATA 7DHYD2     DATA 7EHYD3     DATA 7FH//主程序
MAIN:   MOV TMOD,#01H       ;T0工作方式1MOV TL0,#0B0HMOV TH0,#3CH       ;50msMOV R7,#20         ;20*50ms = 1sMOV S,#50MOV M,#59MOV H,#11MOV D,#11MOV MOU,#12MOV YL,#20MOV YH,#20MOV POINT1,#10     ;在TABLE中第10个对应“-”MOV POINT2,#10     MOV SPT,#1          ;移位指针初始最低位为1SETB K0             CLR  K1             ;K1置1 (非暂停状态)CLR  K2              ;K2置1  默认修改模式CLR  P3.5           ;默认蜂鸣器非工作状态CLR  P3.6           ;默认LED非工作状态SETB ET0         SETB EASETB TR0         ;开启定时器;不断循环
GO_ON:LCALL CHECK_KEYLCALL DISPLAYLCALL CHECK_CLOCK  ;闹铃LCALL LIGHT_ON       ;开灯LCALL LIGHT_OFF      ;关灯SJMP GO_ON           ;跳转循环;定时子程序
TIME:   MOV TL0,#0B0HMOV TH0,#3CH       DJNZ R7,TIME_END    MOV R7,#20          ;循环20次 定时1sLCALL TIME_INC       ;跳转到计时LCALL SAVE0           ;跳转到数据转移LCALL SEND_TO_DIS   ;储存时间寄存器中的BCD
TIME_END:RETI               ;数码管显示子程序
DISPLAY:MOV R0,#SDL         ;数据缓存区指针MOV DPTR,#TABLE     ;七段共阴数码管0-9显示MOV R1,#0          ;R1存放表示第几位的数字//P0口实现片选
NEXT:   MOV P0,R1           ;显示位连接P0MOV A,R1CLR C               SUBB A,#8      //实现前8个向HMS跳转,后8个向YMD跳转       JC  HMS             //P2口实现年月日
DIAN1:  //先判断是否位第10位,第10位需要有小数点CJNE R1,#10,DIAN2    ;跳转判断DIAN2MOV DPTR,#TABLE1MOV A,@R0         ;取显示数字MOVC A,@A+DPTR      MOV P2,A            ;显示年月日LCALL DELAY           ;调用延时MOV DPTR,#TABLESJMP GODIAN2:   //再判断是否位第12位,第12位也需要有小数点CJNE R1,#12,YMD     ;若不是第10,12位,跳转YMDMOV DPTR,#TABLE1MOV A,@R0            ;取显示数字MOVC A,@A+DPTR      MOV P2,A            ;显示年月日LCALL DELAY           ;调用延时MOV DPTR,#TABLESJMP GOYMD:    //正常输出没小数点的数字MOV A,@R0          ;取显示数字MOVC A,@A+DPTR      MOV P2,A            ;显示年月日LCALL DELAY           ;调用延时SJMP GO//P1口实现时分秒
HMS:    MOV A,@R0          ;取显示数字MOVC A,@A+DPTR      MOV P1,A            ;显示时分秒LCALL DELAY           ;调用延时SJMP GOGO:     INC R1              ;显示位左移INC R0            CJNE R1,#16,NEXTRET
//共阳极,0亮1灭,共阴极,1亮0灭
TABLE:  DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H  ;七段共阴数码管0-9
TABLE1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,40H  ;带小数点的七段共阴数码管0-9;计时程序
TIME_INC:
SEC:    INC S               ;+1SMOV R6,SCJNE R6,#60,INC_END ;满60秒进位MOV R6,#0MOV S,R6SJMP MIN
MIN:    INC M               ;+1MMOV R6,MCJNE R6,#60,INC_END ;满60分钟进位MOV R6,#0MOV M,R6SJMP HOUR
HOUR:   INC H               ;+1HMOV R6,HCJNE R6,#24,INC_END ;满24小时进位MOV R6,#0MOV H,R6
DAY:    LCALL CHECK_Y       ;检查平闰年MOV R6,FLAGCJNE R6,#1,PINGMOV DPTR,#R_YEAR    ;调用闰年月份表SJMP YGO
PING:   MOV DPTR,#P_YEAR    ;调用平年月份表
YGO:    MOV A,MOUMOVC A,@A+DPTR       INC AINC D              ;+1D               CJNE A,D,INC_ENDMOV R6,#1MOV D,R6SJMP MOUN
MOUN:   INC MOU             ;+1MMOV R6,MOUCJNE R6,#13,INC_END ;第13个月进位MOV R6,#0MOV MOU,R6SJMP YEAR
YEAR:   INC YL               ;+1Y低位MOV R6,YLCJNE R6,#100,INC_ENDMOV R6,#0MOV YL,R6INC YH               ;+1Y高位MOV R6,YHCJNE R6,#100,INC_ENDMOV R6,#0MOV YH,R6
INC_END:RET  ;检查平闰年子程序
CHECK_Y:MOV A,YLMOV B,#4DIV ABMOV A,BJNZ SET_FLAGMOV FLAG,#1SJMP CHECK_END
SET_FLAG:MOV FLAG,#0
CHECK_END:  RETP_YEAR:  DB 0,31,28,31,30,31,30,31,31,30,31,30,31        ;平年月份表
R_YEAR: DB 0,31,29,31,30,31,30,31,31,30,31,30,31        ;闰年月份表;将暂存区中的数据转为BCD码存入显示缓冲区
SEND_TO_DIS:                        MOV A,STLCALL H2BMOV SDL,R4MOV SDH,R5                   ;存秒MOV A,MTLCALL H2BMOV MDL,R4MOV MDH,R5                    ;存分MOV A,HTLCALL H2BMOV HDL,R4MOV HDH,R5                    ;存时MOV A,DTLCALL H2BMOV DDL,R4MOV DDH,R5                    ;存天MOV A,MOUTLCALL H2BMOV MOUDL,R4MOV MOUDH,R5              ;存月MOV A,YLTLCALL H2BMOV YD0,R4MOV YD1,R5                   ;存年(低位)MOV A,YHTLCALL H2BMOV YD2,R4MOV YD3,R5                 ;存年(高位)RET;1ms延时子程序
DELAY:  MOV R3,#4
DEL:    MOV R2,#250DJNZ R2,$DJNZ R3,DELRET;
H2B:    MOV B,#10DIV ABMOV R5,A         ;个位存到R5MOV R4,B         ;十位存到R4RET;查询按键子程序
CHECK_KEY:MOV A,P3          ;读取P3按键状态CPL A;JZ CHECK_EXITACALL KEY_DELAYMOV A,P3         ;读取P3按键状态 确认是否有键按下CPL AJZ CHECK_EXITJB ACC.0,ACT0       ;暂停/恢复键JB ACC.1,ACT1        ;闹钟键JB ACC.2,ACT2       ;换位键JB ACC.3,ACT3       ;+JB ACC.4,ACT4        ;-
CHECK_EXIT: RET;按键子程序
ACT:
ACT0:   MOV A,P3            ;检测按键是否释放JNB ACC.0,ACT0     ;键未释放,则继续等待CPL K0                ;K0取反,在暂停/继续中转换JB    K0,STARTCLR TR0             ;TR0=0,停止计时LJMP EXIT
START:  SETB TR0            ;TRO=1,开始计时CLR  K1             ;默认回修改功能RET;定时/修改按钮
ACT1:   MOV A,P3            ;检测按键是否释放JNB ACC.1,ACT1     ;键未释放,则继续等待CPL K2                ;取反闹铃使能开关JB K0,EXIT         ;若K0未在暂停状态,则返回CPL K1             ;K1取反,0为修改,1为闹钟定时RET;移位按钮
ACT2:   MOV A,P3            ;检测按键是否释放JNB ACC.2,ACT2     ;键未释放,则继续等待JB    K0,EXIT         ;若K0未在暂停状态,则返回MOV A,SPT          RL  A               ;SPT移动(RL循环左移,RLC带进位左移,RL不带进位)MOV SPT,A JNB ACC.7,EXIT      ;最多移到01000000MOV SPT,#1         RET;加
ACT3:   MOV A,P3            ;检测按键是否释放JNB ACC.3,ACT3     ;键未释放,则继续等待JB    K0,EXIT         ;若K0未在暂停状态,则返回JB     K1,CL_INCSJMP UP_INCRETCL_INC:                       ;闹钟LCALL KEY_INCLCALL SEND_TO_DISLCALL SEND1RET    UP_INC: LCALL SAVE0LCALL KEY_INCLCALL SEND_TO_DISLCALL SEND0RET;减
ACT4:   MOV A,P3            ;检测按键是否释放JNB ACC.4,ACT4     ;键未释放,则继续等待JB    K0,EXIT         ;若K0未在暂停状态,则返回JB     K1,CL_DECSJMP UP_DECRETCL_DEC:                      ;闹钟LCALL KEY_DECLCALL SEND_TO_DISLCALL SEND1RET UP_DEC: LCALL SAVE0LCALL KEY_DECLCALL SEND_TO_DISLCALL SEND0RET     EXIT:   RETKEY_DELAY:MOV R3,#24
KEY_DEL:MOV R2,#0FAHDJNZ R2,$DJNZ R3,KEY_DELRET;数据转移子程序
SAVE0:  MOV ST,SMOV MT,M    MOV HT,HMOV DT,DMOV MOUT,MOUMOV YLT,YLMOV   YHT,YHRET
;将数据传给计时数据寄存器
SEND0:  MOV S,STMOV M,MT    MOV H,HTMOV D,DTMOV MOU,MOUTMOV YL,YLTMOV   YH,YHTRET
;将数据传给闹钟数据寄存器
SEND1:  MOV SC,STMOV    MC,MT   MOV HC,HTMOV    DC,DTMOV    MOUC,MOUTMOV    YLC,YLTMOV  YHC,YHTRET//按下按键年月日时分秒的加减处理
;+按键子程序
KEY_INC:JB  SPT.0,S_INC     ;未按换位键 默认更改秒JB  SPT.1,M_INC     ;按一次更改分JB  SPT.2,H_INC     ;按两次更改小时JB   SPT.3,D_INC     ;按三次更改日JB   SPT.4,MOU_INC   ;按四次更改月JB   SPT.5,YL_INC    ;按五次更改年的个十位JB   SPT.6,YH_INC    ;按六次更改年的百千位S_INC:   INC ST              ;+1SMOV R6,STCJNE R6,#60,EXIT_INCMOV R6,#0MOV ST,R6RETM_INC:   INC MT              ;+1MMOV R6,MTCJNE R6,#60,EXIT_INCMOV R6,#0MOV MT,R6RETH_INC:   INC HT              ;+1HMOV R6,HTCJNE R6,#24,EXIT_INCMOV R6,#0MOV HT,R6RETD_INC:   LCALL CHECK_YMOV R6,FLAGCJNE R6,#1,PING1MOV DPTR,#R_YEARSJMP YGO1
PING1:  MOV DPTR,#P_YEAR    ;暂存本月天数上限
YGO1:   MOV A,MOUTMOVC A,@A+DPTR      INC AINC DT             ;+1D               CJNE A,DT,EXIT_INCMOV R6,#1MOV DT,R6RETMOU_INC: INC MOUT            ;+1MMOV R6,MOUTCJNE R6,#13,EXIT_INCMOV R6,#1MOV MOUT,R6RETYL_INC:  INC YLT              ;+1Y低位MOV R6,YLTCJNE R6,#100,EXIT_INCMOV R6,#0MOV YLT,R6RETYH_INC:    INC YHT               ;+1Y高位MOV R6,YHTCJNE R6,#100,EXIT_INCMOV R6,#0MOV YHT,R6RETEXIT_INC:RET;-按键子程序
KEY_DEC://根据移位指针SPT哪一位是1JB  SPT.0,S_DEC       ;未按换位键 默认更改秒JB    SPT.1,M_DEC       ;按一次更改分JB  SPT.2,H_DEC       ;按两次更改小时JB   SPT.3,D_DEC       ;按三次更改日JB SPT.4,MOU_DEC     ;按四次更改月JB SPT.5,YL_DEC      ;按五次更改年的个十位JB SPT.6,YH_DEC      ;按六次更改年的百千位S_DEC:DEC ST                ;-1sMOV R6,STCJNE R6,#0FFH,EXIT_DECMOV R6,#59MOV ST,R6RET
M_DEC: DEC MT                ;-1mMOV R6,MTCJNE R6,#0FFH,EXIT_DECMOV R6,#59MOV MT,R6RET
H_DEC:         DEC HT                ;-1hMOV R6,HTCJNE R6,#0FFH,EXIT_DECMOV R6,#23MOV HT,R6RETD_DEC:    LCALL CHECK_YMOV R6,FLAGCJNE R6,#1,PING2MOV DPTR,#R_YEARSJMP YGO2
PING2:  MOV DPTR,#P_YEAR
YGO2:   MOV A,MOUTMOVC A,@A+DPTR      ;暂存本月天数上限DEC     DT             ;-1DMOV R6,DTCJNE R6,#0,EXIT_INCMOV R6,AMOV DT,R6RETMOU_DEC:DEC MOUT             ;-1MOMOV R6,MOUTCJNE R6,#0,EXIT_DECMOV R6,#12MOV MOUT,R6RET
YL_DEC:                      DEC YLT              ;-1Y(低位)MOV R6,YLTCJNE R6,#0FFH,EXIT_DECMOV R6,#99MOV YLT,R6RET
YH_DEC: DEC YHT               ;-1Y(低位)MOV R6,YHTCJNE R6,#0FFH,EXIT_DECMOV R6,#99MOV YHT,R6RETEXIT_DEC:RET;闹钟响铃子程序
CHECK_CLOCK:                   ;判断是否响铃MOV R0,#M         MOV R1,#MCMOV R2,#5
CHECK_NEXT:         ;MOV    A,@R0SUBB A,@R1              ;判断当前时刻是否是闹铃时刻CLR CJNZ   CLOC_EXITINC R0INC R1DJNZ R2,CHECK_NEXTLCALL TIMEOUT            ;分 时 日 月 年均满足则调用响铃程序RETCLOC_EXIT:                  CLR P3.5RET
;响铃程序
TIMEOUT:                    JNB K2,BUZ_END          ;按下按键停止响铃
BUZ:    SETB P3.5           LCALL BUZ_DELAYBUZ_DELAY:                      ;延时MOV R3,#250
BUZ_T:  MOV R2,#40DJNZ R2,$DJNZ R3,BUZ_TRET
BUZ_END:    CLR P3.5RET;亮灯子程序
LIGHT_ON:MOV A,#12CJNE A,H,TTE3MOV A,#00CJNE A,M,TTE3MOV A,#00CJNE A,S,TTE3SETB P3.6                   ;从12:00:00开始亮
TTE3:   RET
LIGHT_OFF:MOV A,#23;CMP_LED_STARTCJNE A,H,TTE4MOV A,#00CJNE A,M,TTE4MOV A,#00CJNE A,S,TTE4CLR P3.6                    ;到21:00:00关灯
TTE4:
RETEND
R_YEAR: DB 0,31,29,31,30,31,30,31,31,30,31,30,31        ;TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H  ;END

C51汇编实现时间控制器+proteus仿真相关推荐

  1. Proteus仿真:C51中断函数实例

    实现目标 要求外部中断INT0和INT1为低电平触发,相应引脚分别接一按钮,按钮按下接地输入低电平,产生中断信号:定时器/计数器T0和定时器/计数器T1设置为外部计数输入,相应引脚接1khz的方波信号 ...

  2. C51 Proteus仿真板

    "新手上路的你急需一块开发板,也不贵就100来块,再加点外设模块就200多!" "我这51开发板买的100多,吃灰了2年,半价卖给你,不包邮,要不要?" &qu ...

  3. 单片机实验笔记(汇编、Proteus仿真)(下)

    接上一条单片机实验笔记(汇编.Proteus仿真) 第五节课 第五节课 内容为驱动多位数码管.和驱动一位数码管大同小异. ORG 0000H LJMP MAINORG 0100H MAIN: MOV ...

  4. 单片机——C51实验含Proteus仿真(独立键盘,矩阵键盘)

    文章仅为本人学习记录,如有引用部分会另加说明引用出处 矩阵键盘检测原理:(独立键盘的原理在代码注释中很详细) 线反法的原理为:首先使P1口的高四位输出高电平,P1口低四位输出低电平,这时键盘的行线被拉 ...

  5. 【Proteus仿真】51单片机汇编数显大型交通灯控制

    [Proteus仿真]51单片机汇编数显大型交通灯控制 Proteus仿真 学汇编的人虽然 不多,但是还是有的,分享一个汇编的案例,给需要的人予以参考学习,有些时候我们还是需要懂一些汇编指令比较好. ...

  6. 【Proteus仿真】51单片机汇编实现DS18B20+LCD1602显示

    [Proteus仿真]51单片机汇编实现DS18B20+LCD1602显示 Proteus仿真 汇编代码(.asm) ;**************************************** ...

  7. c51语言提供了code存储类型来访问,单片机原理与应用(C51编程+proteus仿真)第2版张毅刚--第3章课后习题答案2020年1月30日整理...

    单片机原理与应用(C51编程+proteus仿真)第2版 -张毅刚课后习题参考答案 第3章思考题及习题3 参考答案 一.填空 1.与汇编语言相比, C51语言具有().().().和()等优点.答:可 ...

  8. 单片机实验笔记(汇编、Proteus仿真)

    实验基础 51单片机 本门课程硬件平台为ATMEL公司的AT89C52单片机,在Proteus软件进行仿真实验. 51单片机是8位单片机.8k ROM .256bytes RAM.四个8位并行I/O口 ...

  9. 【proteus仿真】单片机汇编+74xx595驱动8X8点阵滚动显示

    [proteus仿真]单片机汇编+74xx595驱动8X8点阵滚动显示 Proteus仿真 汇编代码(.asm) ORG 00HJMP MAINORG 0BHLJMP INTS_T0ORG 30H M ...

最新文章

  1. request.form()和request()和request.data的区别
  2. ADO.NET 快速入门(四):从数据库填充 DataSet
  3. 2 获取对象 IDbDataAdapter 用于填充 DataSet 和更新数据源
  4. 【任务脚本】更新京东任务东东农场脚本,京东种水果脚本,京东活动任务半自动程序...
  5. 使用jquery处理数据时要注意的问题
  6. python找到一行单词中最长的_在Python的给定列表中找到k个最长的单词
  7. sqoop数据导出导入命令
  8. 五十一、【Bluetooth蓝牙模块】
  9. Linux中级之负载均衡(lvs,nginx,haproxy)、中间件
  10. C语言使用SQLite3数据库
  11. 我对计算机的看法英语作文,我对创新的看法英语作文7篇作文
  12. java 2048思路_浅谈2048
  13. java使用nmap工具进行端口扫描,简单学习
  14. 修改设备管理器信息,修改我的电脑系统属性,修改dxdiag信息
  15. sealos2.0使用教程,最简单kubernetesHA方案
  16. 新手入门,想用VB给班上写一个自动播放上下课铃声的程序,求教
  17. 最新Exsi-6.7.0U3b版本下载
  18. oracle 11g安装包下载地址合集
  19. Scrum:产品负责人责任
  20. 小博无线认证无法连接服务器,路由器wan口认证失败

热门文章

  1. Excel除了复制粘贴,更快速的将单元格区域的公式转换成数值?
  2. 用示波器抓取LIN协议波形并分析
  3. 更改linux文件/目录的权限、拥有者及用户组
  4. 【PPic】在PPic图床中如何配置使用七牛
  5. 北京房价当日报20141013
  6. 乐视账号服务器关闭,乐视手机重置后无法登录账号 官方给出解决方案
  7. 4月21日V反再次来临?
  8. 显著性目标检测SOD论文大盘点
  9. 刷脸支付新技术的蔓延能出乎我们的意料
  10. 如何写好一个标题?十分钟教你写出优质标题