找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2126|回复: 0
打印 上一主题 下一主题
收起左侧

单片机数字时钟汇编语言程序与Proteus仿真图 能显示秒、分、时

[复制链接]
跳转到指定楼层
楼主
这是基于单片机的简易数字时钟,能显示秒、分、时。其中第一个按键按下后是时加一,第二个按键按下后是分加一,第三个按键是清零
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机汇编语言程序:
  1. ;====================================================================
  2. ; Main.asm file generated by New Project wizard
  3. ;
  4. ; Created:   周五 5月
  5. ; Processor: 80C51
  6. ; Compiler:  ASEM-51 (Proteus)
  7. ;====================================================================

  8. $NOMOD51
  9. $INCLUDE (8051.MCU)

  10. ;====================================================================
  11. ; DEFINITIONS
  12. ;====================================================================

  13. ;====================================================================
  14. ; VARIABLES
  15. ;====================================================================

  16. ;====================================================================
  17. ; RESET and INTERRUPT VECTORS
  18. ;====================================================================

  19.       ; Reset Vector
  20.       
  21.         ORG 0000H;程序开始地址
  22.         LJMP MAIN;跳到MAIN
  23.         ORG 000BH;TO 中断程序入口
  24.         LJMP INTT0;跳到To开始执行程序
  25.         ORG 0100H

  26. MAIN:
  27.         MOV @R0,#70H;准备7OH-79H 10个字节空间
  28.         MOV        R7,#09H

  29. XIANSHICHUSHIHUA:
  30.         MOV @R0,#00H;将70H-79H初始化为00H
  31.         INC R0
  32.         DJNZ        R7,XIANSHICHUSHIHUA
  33.         MOV TMOD,#01H;设To为16位定时器
  34.         MOV TL0,#0B0H;赋初始值
  35.         MOV TH0,#3CH
  36.         SETB EA;CPU开中断
  37.         SETB ET0;允许To中断
  38.         SETB TR0;启动To
  39.         MOV        R4,#14H;1S设定初始值

  40. LOOP:
  41.         LCALL         XIANSHI;调用显示程序
  42.         JB P1.0,LOOP1;判断P1.0有无按下
  43.         LCALL         HOUR_SET;调用小时设定程序
  44.         AJMP         LOOP

  45. LOOP1:
  46.         JB P1.1,LOOP2;判断P1.1有无按下
  47.         LCALL MIN_SET;调用分设定程序
  48.         AJMP LOOP

  49. LOOP2:
  50.         JB P1.2,LOOP3;判断P1.2有无按下
  51.         LCALL         CLR0;调用清零程序,这里只清零秒
  52.         AJMP LOOP

  53. LOOP3:
  54.         AJMP LOOP

  55. HOUR_SET:
  56.         ACALL         XIANSHI;调用显示程序
  57.         JNB P1.0,HOUR_SET ;P1.0按下跳到调小时程序
  58.         INC 78H;小时的个位加1
  59.         MOV R6,78H
  60.         CJNE R6,#10,HOUR1 ;个位不为10跳到HOUR1
  61.         MOV 78H,#0;个位清零
  62.         INC 79H;十位加1
  63.         JMP EXIT;跳到EXIT

  64. HOUR1:
  65.         MOV R6,78H
  66.         CJNE R6,#4,EXIT;个位不为4跳到EXIT
  67.         MOV R6,79H
  68.         CJNE R6,#2,EXIT;十位不为2跳到EXIT
  69.         MOV 78H,#0;小时清零
  70.         MOV 79H,#0

  71. EXIT:
  72.         RET;调时返回

  73. MIN_SET:
  74.         CALL         XIANSHI;调用显示程序
  75.         JNB P1.1,MIN_SET;P1.1按下跳到调分程序
  76.         INC        76H;分的个位加1
  77.         MOV        R5,76H
  78.         CJNE        R5,#10,EXIT ;个位不为10 跳到 MIS1
  79.         MOV 76H,#0;个位清零
  80.         INC         77H;十位加1
  81.         MOV        R5,77H
  82.         CJNE R5,#6,EXIT;十位不为6跳到MIS1
  83.         MOV         77H,#0;分清零
  84.         MOV         76H,#0
  85.         RET

  86. INTT0:
  87.         PUSH        ACC;入栈,保护现场
  88.         PUSH         PSw
  89.         CLR         ET0;关闭中观允许
  90.         CLR TR0;关闭中断
  91.         MOV         A,#0B7H;中断响应时间同步修正
  92.         ADD         A,TL0;低8位初值修正
  93.         MOV         TL0        ,A
  94.         MOV         A,#3CH;高8位初值修正
  95.         ADDC        A,TH0
  96.         MOV         TH0,A
  97.         SETB         TR0;开启定时器TO
  98.         DJNZ        R4,OUT;20 次中断未到中断退出

  99. ADDS:
  100.         MOV        R4,#14H;20次中断到重赋初值
  101.         MOV        R0,#71H;指向秒计时单元
  102.         ACALL         ADD1;调用ADD1
  103.         MOV         A,R3;秒数据放入A
  104.         CLR         C;清零进位标志
  105.         CJNE         A,#60,ADDMM;秒是否到了60.是则跳转

  106. ADDMM:
  107.         JC         OUT;小雨60秒中断退出
  108.         ACALL         CLR0;等于60秒调用 CLRO清零秒
  109.         MOV R0,#77H;指向分计时单元
  110.         ACALL         ADD1;调用 ADD1
  111.         MOV         A,R3;分数据放入A
  112.         CLR         C;清零进位标志
  113.         CJNE         A,#60,ADDH;分是否到了60,是则跳转

  114. ADDH:
  115.         JC         OUT;小于60分时中断退出
  116.         ACALL         CLR0;等于60分调用 CLRO清零秒
  117.         MOV R0,#79H;指向时计时单元
  118.         ACALL         ADD1;调用ADD1
  119.         MOV         A,R3;时数据放入A
  120.         CLR C;清零进位标志
  121.         CJNE         A,#24H,HOUR ;时是否到了24是则跳转

  122. HOUR:
  123.         JC         OUT;小于24时时中断退出
  124.         ACALL         CLR0;调用 CLRO

  125. OUT:
  126.         MOV         72H,76H;将分的存储地址转移
  127.         MOV         73H,77H
  128.         MOV         74H,78H;将时的存储地址转移
  129.         MOV         75H,79H
  130.         POP PSW;恢复现场
  131.         POP ACC
  132.         SETB         ET0
  133.         RETI

  134. CLR0:
  135.         CLR         A;清零A
  136.         MOV @R0,A;清零RO存放地址中的数据
  137.         DEC R0;RO地址减1
  138.         MOV @R0,A
  139.         RET

  140. ADD1:
  141.         MOV         A,@R0;取当前计时单元数据到A
  142.         DEC R0;指向前一地址
  143.         SWAP         A;A中数据高四位与低四位交换
  144.         ORL         A,@R0;前一地址中数据放入A中低四位
  145.         ADD         A,#01H;A加1操作
  146.         DA                A;十进制调整
  147.         MOV         R3,A;移入R3寄存器
  148.         ANL                 A,#0FH;高四位变0
  149.         MOV         @R0,A;放回前一地址单元
  150.         MOV         A,R3;取回R3中暂存数据
  151.         INC R0;指向当前地址单元
  152.         SWAP         A;A中数据高四位与低四位交换
  153.         ANL         A,#0FH;高四位变0
  154.         MOV @R0,A;数据放入当削地址单元中
  155.         RET;子程序返回

  156. XIANSHI:
  157.         MOV R1,#70H;指向显示数据首址
  158.         MOV R5,#01H;扫描控制字初值

  159. PLAY:
  160.         MOV         A,R5;扫描字放入A
  161.         MOV         P2,A;从P2口输出
  162.         MOV A,@R1;取显示数据到A
  163.         MOV DPTR,#TAB;取段码表地址
  164.         MOVC         A,@A+DPTR;查显示数据对应段码
  165.         MOV P0,A;段码放入PO口
  166.         LCALL         DL1MS;显示1MS
  167.         INC         R1;指向下一地址
  168.         MOV         A,R5;扫描控制字放入A
  169.         JB         ACC.5,ENDOUT ;ACC.5=0时一次显示结束
  170.         RL        A;A中数据循环左移
  171.         MOV         R5,A;放回R5内
  172.         AJMP         PLAY;跳回PLAY循环

  173. ENDOUT:
  174.         CLR         P2.5;一次显示结束,P2口复位
  175.         RET;子程序返回

  176. TAB:
  177. DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

  178. DL1MS:        ;1毫秒延时程序
  179.         MOV R6,#14H
  180. DL1:
  181.         MOV R7,#19H
  182. DL2:
  183.         DJNZ R7,DL2
  184.         DJNZ R6,DL1
  185.         RET
  186.         END

  187. ;====================================================================
  188. ; CODE SEGMENT
  189. ;====================================================================

  190. ;====================================================================
  191.       
复制代码

Proteus8.8仿真文件下载: 时钟.zip (22.74 KB, 下载次数: 39)

评分

参与人数 1黑币 +40 收起 理由
admin + 40 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表