找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机汇编语言模拟时钟程序(LCD12864显示)精校时间(开源)

  [复制链接]
跳转到指定楼层
楼主
本帖最后由 xiaoyuxinke 于 2022-5-8 14:11 编辑

本程序无需DS1302,无需定时器,另本程序使用汇编语言编写,只要按所使用的晶振修改延时部分,可以做到一年误差5秒以内.
视频已上传至优酷,需要的可以看一下.https://v.youku.com/v_show/id_XN ... o_XNTg2ODI5MDQ3Mg==
需要精校时间的可调整此四个值,需要更精准可在延时部分加NOP修整(可做到年误差3秒以内),此程序虽然不使用DS1302,但可以做到比DS1302更为精准



下面是单片机汇编语言程序部分:


  1. ;******************************************************************************
  2. ;* 【LCD12864数据接口定义】
  3. ;******************************************************************************
  4.            RS       BIT    P2.7    //高电平数据低电平指令
  5.            RW       BIT    P2.6    //高电平读低电平写
  6.            E        BIT    P2.5    //LCD12864使能控制端
  7.            DATE     EQU    P0           //八位数据送P0口(八位数据总线)
  8.            COM      EQU    70H           //LCD12864指令暂存地址
  9.            COOD     EQU    91H           //LCD12864数据暂存地址
  10. ;******************************************************************************
  11. ;* 【时间显示定义】
  12. ;******************************************************************************
  13.            SHI      EQU    40H
  14.            FEN      EQU    41H
  15.            MIAO     EQU    42H
  16.            SHIH     EQU    43H
  17.            SHIL     EQU    44H
  18.            FENH     EQU    45H
  19.            FENL     EQU    46H
  20.            MIAOH    EQU    47H
  21.            MIAOL    EQU    48H
  22. ;******************************************************************************
  23. ;* 【按键功能和标志位定义】
  24. ;******************************************************************************
  25.            KEY1     EQU    P1.1
  26.            KEY2     BIT    P1.4
  27.            KEY3     BIT    P1.5
  28.            KEY4     BIT    P1.6
  29.            BUZZ     BIT    P3.7

  30.            ORG   0000H
  31.            AJMP  SDATA
  32.            ORG   0030H
  33.            AJMP  INTT0
  34.            ORG   0060H

  35.            SDATA:
  36.            SETB  PX0                                                //外部中断0优先权第1
  37.            SETB  EX0                                                //下降沿触发中断
  38.            SETB  IT0                                                //外部中断0被允许
  39.            SETB  EA                                                //总中断位被允许
  40.         MOV   SHI,#17                                                //小时赋初值
  41.         MOV   FEN,#33                                                //分钟赋初值
  42.         MOV   MIAO,#00                                                //秒钟赋初值
  43.         MOV   SHIH,#0                                                //小时高位赋初值
  44.         MOV   SHIL,#0                                                //小时低位赋初值
  45.         MOV   FENH,#0                                                //分钟高位赋初值
  46.         MOV   FENL,#0                                                //分钟低位赋初值
  47.         MOV   MIAOH,#0                                                //秒钟高位赋初值
  48.         MOV   MIAOL,#0                                                //秒钟低位赋初值
  49.         LCALL LCDCSH                                                //LCD12864初始化
  50.         LCALL FMQ                                                //蜂鸣器响一声
  51.         JMP   MAIN                                                //

  52. MAIN:
  53.         LCALL HZXSCX                                                //
  54.         JMP   MAIN
  55. INTT0:                                                                //
  56.         JNB   KEY1,DISP1                                        //
  57.         JNB   KEY2,DISP2
  58.         JNB   KEY3,DISP3                                        //
  59.         JNB   KEY4,DISP4
  60.         RETI                                                        //
  61. DISP1:
  62.         LCALL FMQ
  63.         CLR   P3.2                                                //
  64.         INC   SHI
  65. RET                                                                //
  66. DISP2:
  67. RET                                                                //
  68. DISP3:                                                                //
  69. RET
  70. DISP4:                                                                //
  71. RET
  72.                                                                 //
  73. LCDCSH:
  74.     MOV   COM,#01H                      //DDRAM写入20H,DDRAM的AC计数器清零
  75.     LCALL WCOM                          //12864写入指令
  76.     LCALL DEL10MS                       //延时4.6毫秒
  77.     MOV   COM,#02H                      // AC清零,游标到开头位置
  78.     LCALL WCOM                          //12864写入指令
  79.     LCALL DEL10MS                       //延时4.6毫秒
  80.     MOV   COM,#0CH                      //游标开,整体显示开,游标位置开
  81.     LCALL WCOM                          //12864写入指令
  82.     LCALL DEL10MS                       //延时4.6毫秒
  83.         RET
  84. ;******************************************************************************
  85. ;* 【时间计算部分】
  86. ;******************************************************************************
  87. SJJSBF:                                                                        //时间计算部分,秒到60分进一,分到60时进一,时到24全清零
  88.     MOV   A,MIAO                                                //秒钟数据送到累加器
  89.     CJNE  A,#60,FAG                                                //如果不等于60就退出,否则向下执行
  90.         MOV   MIAO,#00                                                //秒钟数据清零
  91.         INC   FEN                                                        //分钟数据加一

  92.         MOV   A,FEN                                                        //分钟数据送到累加器
  93.         CJNE  A,#60,FAG                                                //如果不等于60就退出,否则向下热行
  94.         MOV   FEN,#00                                                //分钟数据清零
  95.         INC   SHI                                                        //小时数据加一

  96.         MOV   A,SHI                                                        //小时数据送到累加器
  97.         CJNE  A,#24,FAG                                                //如果不等于24就退出,否则向下执行
  98.         MOV   SHI,#00                                                //小时数据清零
  99.         RET
  100. FAG:
  101.         RET

  102. HZXSCX:
  103.     MOV   COM,#9CH                                                 //从第四行第四个位置开始写
  104.     LCALL WCOM                          //12864写入指令
  105.     LCALL DEL10MS
  106. //*********************************     //时分秒分配,把时分秒分别算出高低位
  107.         MOV   A,SHI                                                    //小时数据送到累加器
  108.         MOV   B,#10                                                    //立既数10送到B
  109.         DIV   AB                                                        //小时数除以10
  110.         MOV   SHIH,A                                                //整数送到小时高位
  111.         MOV   SHIL,B                                                //余数送到小时低位
  112.         MOV   A,FEN
  113.         MOV   B,#10
  114.         DIV   AB
  115.         MOV   FENH,A
  116.         MOV   FENL,B
  117.         MOV   A,MIAO
  118.         MOV   B,#10
  119.         DIV   AB
  120.         MOV   MIAOH,A
  121.         MOV   MIAOL,B
  122. //*********************************
  123.         MOV   A,SHIH
  124.         MOV   DPTR,#TAB
  125.         MOVC  A,@A+DPTR
  126.     MOV   COOD,A
  127.     LCALL WCOD
  128.     LCALL DEL1MS
  129.         
  130.         MOV   A,SHIL
  131.         MOV   DPTR,#TAB
  132.         MOVC  A,@A+DPTR                        
  133.     MOV   COOD,A
  134.     LCALL WCOD                          
  135.     LCALL DEL1MS
  136.     //****************************
  137.         MOV   COOD,#":"
  138.     LCALL WCOD                          
  139.     LCALL DEL1MS
  140.         //****************************
  141.     MOV   A,FENH
  142.         MOV   DPTR,#TAB
  143.         MOVC  A,@A+DPTR
  144.     MOV   COOD,A
  145.     LCALL WCOD
  146.     LCALL DEL1MS
  147.         
  148.         MOV   A,FENL
  149.         MOV   DPTR,#TAB
  150.         MOVC  A,@A+DPTR                        
  151.     MOV   COOD,A
  152.     LCALL WCOD                          
  153.     LCALL DEL1MS
  154.         //****************************
  155.         MOV   COOD,#":"
  156.     LCALL WCOD                          
  157.     LCALL DEL1MS
  158.         //****************************
  159.     MOV   A,MIAOH
  160.         MOV   DPTR,#TAB
  161.         MOVC  A,@A+DPTR
  162.     MOV   COOD,A
  163.     LCALL WCOD
  164.     LCALL DEL1MS
  165.         
  166.         MOV   A,MIAOL
  167.         MOV   DPTR,#TAB
  168.         MOVC  A,@A+DPTR                        
  169.     MOV   COOD,A
  170.     LCALL WCOD                          
  171.     LCALL DEL1MS

  172.         INC   MIAO
  173.         LCALL DEL1S
  174.         LCALL SJJSBF
  175.         RET

  176.   
  177. WCOD:                                      ;写12864数据
  178.      SETB   RS                             ;选择数据
  179.      LCALL  DEL1MS
  180.      CLR    RW                             ;写模式
  181.      LCALL  DEL1MS
  182.      SETB   E                              ;使能允许
  183.      LCALL  DEL1MS
  184.      MOV    DATE,COOD                      ;数据写入
  185.      LCALL  DEL10MS
  186.      CLR E
  187.      LCALL  DEL10MS
  188.      RET
  189.       
  190. WCOM:                                      ;写12864指令
  191.      CLR   RS                               ;选择指令
  192.      LCALL DEL1MS
  193.      CLR   RW                                ;写模式
  194.      LCALL DEL1MS
  195.      SETB  E                                ;使能允许
  196.      LCALL DEL1MS
  197.      MOV   DATE,COM                          ;指令写入
  198.      LCALL DEL10MS
  199.      CLR   E
  200.      LCALL DEL10MS
  201.      RET

  202. FMQ:
  203.      CLR   BUZZ
  204.          LCALL DEL80MS
  205.          SETB  BUZZ
  206.          RET
  207. ;**************************************************************
  208. ;* 【延时程序】
  209. ;**************************************************************
  210. DEL1MS:                                                           //延时1毫秒子程序
  211. MOV R7,#01H                                                   //
  212. DL1:                                                           //
  213. MOV R6,#8EH                                                   //
  214. DL0:                                                           //
  215. MOV R5,#02H                                                   //
  216. DJNZ R5,[        DISCUZ_CODE_1        ]nbsp;                                                  //
  217. DJNZ R6,DL0                                                   //
  218. DJNZ R7,DL1                                                   //
  219. RET                                                                   //子程序退出

  220. DEL10MS:                                                   //延时10毫秒子程序
  221. MOV R3,#02H                                                   //
  222. DEL41:                                                           //
  223. MOV R4,#20                                                   //
  224. E11:                                                           //
  225. MOV R5,#25                                                   //
  226. DJNZ R5,[        DISCUZ_CODE_1        ]nbsp;                                                  //
  227. DJNZ R4,E11                                                   //
  228. DJNZ R3,DEL41                                                   //
  229. RET                                                           //子程序退出
  230.                                                                   
  231. DEL80MS:                                                   //延时80毫秒子程序
  232. MOV R3,#20                                                   //
  233. DEL40:                                                           //
  234. MOV R4,#250                                                   //
  235. E1:                                                           //
  236. MOV R5,#150                                                   //
  237. DJNZ R5,[        DISCUZ_CODE_1        ]nbsp;                                                  //
  238. DJNZ R4,E1                                                   //
  239. DJNZ R3,DEL40                                                   //
  240. RET                                                           //子程序退出


  241. DEL1S:                                                           //延时1秒子程序
  242. MOV R3,#05H                                                   //
  243. E21:                                                           //
  244. MOV R4,#255                                                   //
  245. E31:                                                           //
  246. MOV R5,#20                                                   //
  247. E41:                                                           //
  248. MOV R6,#248                                                   //
  249. DJNZ R6,[        DISCUZ_CODE_1        ]nbsp;                                                  //
  250. DJNZ R5,E41                                                   //
  251. DJNZ R4,E31                                                   //
  252. DJNZ R3,E21                                                   //
  253. RET                                                                   //子程序退出


  254. TAB:  
  255.     DB  "0","1","2","3","4","5","6","7","8","9",":"  
  256.     END
复制代码


评分

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

查看全部评分

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

使用道具 举报

来自 2#
ID:61140 发表于 2023-2-12 12:36 | 只看该作者
songxia8013 发表于 2023-2-10 15:49
请教一下,这个DJNZ R6,[        DISCUZ_CODE_1        ]nbsp; 是什么意思?

DJNZ R6,[        DISCUZ_CODE_1        ]nbsp;
这个原来是DJNZ R6,$
坛子里发不了$,所以自动转成那样了
回复

使用道具 举报

板凳
ID:262 发表于 2022-5-6 16:13 | 只看该作者
一般来说 是不可能达到一年几秒误差的精度的,楼主测试过吗?
回复

使用道具 举报

地板
ID:61140 发表于 2022-5-6 16:21 | 只看该作者
heicad 发表于 2022-5-6 16:13
一般来说 是不可能达到一年几秒误差的精度的,楼主测试过吗?

去理解一下C和汇编的差别,你会懂,一个汇编NOP指令,最多2-3微秒的时间,一个24M的晶振,几微秒,一年误差不会超过5秒种.
在C语言中,延时只是个模糊概念,不管你写延时多少都不一定,要看编译器怎么去做,但汇编语言你写延时多少就是多少,可以做到很精准.
回复

使用道具 举报

5#
ID:61140 发表于 2022-5-6 16:26 | 只看该作者
如果加上年累积误差校正,一年走时误差控制在1秒以内是做的到的(这里只计论走时误差,晶振的热稳定误差不讨论,那个是元件性能决定的)
回复

使用道具 举报

6#
ID:99987 发表于 2022-5-6 18:53 | 只看该作者
厉害,汇编做的延时是很精确的,直击底层,是C无法比拟的。
回复

使用道具 举报

7#
ID:744744 发表于 2022-5-6 20:03 来自手机 | 只看该作者
看不懂汇编程序,失败
回复

使用道具 举报

8#
ID:61140 发表于 2022-5-8 14:05 | 只看该作者
本人不会C,所以只好汇编充大头了,各位见笑/
回复

使用道具 举报

9#
ID:864787 发表于 2022-5-9 23:53 | 只看该作者
就喜欢汇编的可操作性,就好比开车一样,我自己握方向盘总比使唤别人握方向盘爽的多,当然使唤别人握方向盘肯定轻松多(类似C语言),但缺少那份激情,我喜欢汇编也是这原因,别跟我算法,我就编个时钟或者一个手电筒控制程序,你跟我谈算法
回复

使用道具 举报

10#
ID:61140 发表于 2022-5-25 22:37 | 只看该作者
axiongzhang 发表于 2022-5-6 20:03
看不懂汇编程序,失败

汇编并不是很难的,有人教就可以
回复

使用道具 举报

11#
ID:61140 发表于 2022-5-25 22:37 | 只看该作者
madell 发表于 2022-5-6 18:53
厉害,汇编做的延时是很精确的,直击底层,是C无法比拟的。

说的对,这是汇编的优点,C和汇编各有优缺点.
回复

使用道具 举报

12#
ID:61140 发表于 2022-5-25 22:38 | 只看该作者
风云101 发表于 2022-5-9 23:53
就喜欢汇编的可操作性,就好比开车一样,我自己握方向盘总比使唤别人握方向盘爽的多,当然使唤别人握方向盘 ...

喜欢就好,喜欢的才是适合自己的.
回复

使用道具 举报

13#
ID:829973 发表于 2022-5-26 14:58 | 只看该作者
不错,我也是喜欢汇编!!!
回复

使用道具 举报

14#
ID:78901 发表于 2022-5-26 17:40 | 只看该作者
不管是c还是汇编,中断操作肯定影响计时
回复

使用道具 举报

15#
ID:61140 发表于 2022-5-30 18:04 | 只看该作者
fsj5098 发表于 2022-5-26 17:40
不管是c还是汇编,中断操作肯定影响计时

整个程序没用到中断,为什么要用中断呢
回复

使用道具 举报

16#
ID:102963 发表于 2023-2-10 15:49 | 只看该作者
请教一下,这个DJNZ R6,[        DISCUZ_CODE_1        ]nbsp; 是什么意思?
回复

使用道具 举报

17#
ID:61140 发表于 2023-2-12 12:37 | 只看该作者
songxia8013 发表于 2023-2-10 15:49
请教一下,这个DJNZ R6,[        DISCUZ_CODE_1        ]nbsp; 是什么意思?

看我前面发的图片上面就知道了
回复

使用道具 举报

18#
ID:1072680 发表于 2023-4-25 16:55 | 只看该作者
您好,我想问你点关于单片机汇编的问题可以吗?我是个新手小白,在做设计遇到了一些问题不知道咋解决想找您帮个忙。如果不方便的话就算了,叨唠您了,不好意思啊
回复

使用道具 举报

19#
ID:61140 发表于 2023-10-21 20:24 | 只看该作者
Dream汇编男孩 发表于 2023-4-25 16:55
您好,我想问你点关于单片机汇编的问题可以吗?我是个新手小白,在做设计遇到了一些问题不知道咋解决想找您 ...

什么问题,工只是业余来一下这里,平时工作较忙。
回复

使用道具 举报

20#
ID:78901 发表于 2023-10-21 22:49 | 只看该作者
如果环境温度不变更的情况下,时钟可以做得很准(不管是汇编还是C)
回复

使用道具 举报

21#
ID:397054 发表于 2023-10-22 09:42 | 只看该作者
xiaoyuxinke 发表于 2023-2-12 12:37
看我前面发的图片上面就知道了

是啊,就是这个DJNZ R6,$是什么意思呢?
遍观整个程序中并没有这个标号,跳到哪里去呢?
回复

使用道具 举报

22#
ID:611626 发表于 2023-10-22 10:00 | 只看该作者
xiaoyuxinke 发表于 2022-5-8 14:05
本人不会C,所以只好汇编充大头了,各位见笑/

楼主既然对汇编熟系,对OD跟踪 WINhex这些一定也不陌生吧,能不能出个教程,工业控制上经常用
回复

使用道具 举报

23#
ID:397054 发表于 2023-10-22 10:58 | 只看该作者
刚试了下,可以编译,结果是-2,这样就省了个标号,这在Keil中行得通,在其他的汇编环境中不知怎样,这不是个标准用法,第一次看到。
回复

使用道具 举报

24#
ID:61140 发表于 2023-10-22 22:51 | 只看该作者
鹈鹕 发表于 2023-10-22 09:42
是啊,就是这个DJNZ R6,$是什么意思呢?
遍观整个程序中并没有这个标号,跳到哪里去呢?

R6中的数减一,如果不为0原地执行,
就是说R6中的数不为0就重复执行这句,
直到R6等于0,才跳到下一句。
回复

使用道具 举报

25#
ID:61140 发表于 2023-10-22 22:54 | 只看该作者
songxia8013 发表于 2023-2-10 15:49
请教一下,这个DJNZ R6,[        DISCUZ_CODE_1        ]nbsp; 是什么意思?

原程序中是:
DJNZ R6,$
但是坛子里不让发$这个符号,所以变成这样了
回复

使用道具 举报

26#
ID:61140 发表于 2023-10-22 22:56 | 只看该作者
宏达工控 发表于 2023-10-22 10:00
楼主既然对汇编熟系,对OD跟踪 WINhex这些一定也不陌生吧,能不能出个教程,工业控制上经常用

我还要工作,没太多时间来这里,只是偶然过来看看,所以实在报歉
回复

使用道具 举报

27#
ID:61140 发表于 2023-10-22 22:57 | 只看该作者
鹈鹕 发表于 2023-10-22 10:58
刚试了下,可以编译,结果是-2,这样就省了个标号,这在Keil中行得通,在其他的汇编环境中不知怎样,这不是 ...

汇编的移植性本来就不太友好,这是公认的缺点,所以这个我只能呵呵了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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