找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4967|回復(fù): 26
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)匯編語言模擬時(shí)鐘程序(LCD12864顯示)精校時(shí)間(開源)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 xiaoyuxinke 于 2022-5-8 14:11 編輯

本程序無需DS1302,無需定時(shí)器,另本程序使用匯編語言編寫,只要按所使用的晶振修改延時(shí)部分,可以做到一年誤差5秒以內(nèi).
視頻已上傳至優(yōu)酷,需要的可以看一下.https://v.youku.com/v_show/id_XN ... o_XNTg2ODI5MDQ3Mg==
需要精校時(shí)間的可調(diào)整此四個(gè)值,需要更精準(zhǔn)可在延時(shí)部分加NOP修整(可做到年誤差3秒以內(nèi)),此程序雖然不使用DS1302,但可以做到比DS1302更為精準(zhǔn)



下面是單片機(jī)匯編語言程序部分:


  1. ;******************************************************************************
  2. ;* 【LCD12864數(shù)據(jù)接口定義】
  3. ;******************************************************************************
  4.            RS       BIT    P2.7    //高電平數(shù)據(jù)低電平指令
  5.            RW       BIT    P2.6    //高電平讀低電平寫
  6.            E        BIT    P2.5    //LCD12864使能控制端
  7.            DATE     EQU    P0           //八位數(shù)據(jù)送P0口(八位數(shù)據(jù)總線)
  8.            COM      EQU    70H           //LCD12864指令暫存地址
  9.            COOD     EQU    91H           //LCD12864數(shù)據(jù)暫存地址
  10. ;******************************************************************************
  11. ;* 【時(shí)間顯示定義】
  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. ;* 【按鍵功能和標(biāo)志位定義】
  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優(yōu)先權(quán)第1
  37.            SETB  EX0                                                //下降沿觸發(fā)中斷
  38.            SETB  IT0                                                //外部中斷0被允許
  39.            SETB  EA                                                //總中斷位被允許
  40.         MOV   SHI,#17                                                //小時(shí)賦初值
  41.         MOV   FEN,#33                                                //分鐘賦初值
  42.         MOV   MIAO,#00                                                //秒鐘賦初值
  43.         MOV   SHIH,#0                                                //小時(shí)高位賦初值
  44.         MOV   SHIL,#0                                                //小時(shí)低位賦初值
  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計(jì)數(shù)器清零
  75.     LCALL WCOM                          //12864寫入指令
  76.     LCALL DEL10MS                       //延時(shí)4.6毫秒
  77.     MOV   COM,#02H                      // AC清零,游標(biāo)到開頭位置
  78.     LCALL WCOM                          //12864寫入指令
  79.     LCALL DEL10MS                       //延時(shí)4.6毫秒
  80.     MOV   COM,#0CH                      //游標(biāo)開,整體顯示開,游標(biāo)位置開
  81.     LCALL WCOM                          //12864寫入指令
  82.     LCALL DEL10MS                       //延時(shí)4.6毫秒
  83.         RET
  84. ;******************************************************************************
  85. ;* 【時(shí)間計(jì)算部分】
  86. ;******************************************************************************
  87. SJJSBF:                                                                        //時(shí)間計(jì)算部分,秒到60分進(jìn)一,分到60時(shí)進(jìn)一,時(shí)到24全清零
  88.     MOV   A,MIAO                                                //秒鐘數(shù)據(jù)送到累加器
  89.     CJNE  A,#60,FAG                                                //如果不等于60就退出,否則向下執(zhí)行
  90.         MOV   MIAO,#00                                                //秒鐘數(shù)據(jù)清零
  91.         INC   FEN                                                        //分鐘數(shù)據(jù)加一

  92.         MOV   A,FEN                                                        //分鐘數(shù)據(jù)送到累加器
  93.         CJNE  A,#60,FAG                                                //如果不等于60就退出,否則向下熱行
  94.         MOV   FEN,#00                                                //分鐘數(shù)據(jù)清零
  95.         INC   SHI                                                        //小時(shí)數(shù)據(jù)加一

  96.         MOV   A,SHI                                                        //小時(shí)數(shù)據(jù)送到累加器
  97.         CJNE  A,#24,FAG                                                //如果不等于24就退出,否則向下執(zhí)行
  98.         MOV   SHI,#00                                                //小時(shí)數(shù)據(jù)清零
  99.         RET
  100. FAG:
  101.         RET

  102. HZXSCX:
  103.     MOV   COM,#9CH                                                 //從第四行第四個(gè)位置開始寫
  104.     LCALL WCOM                          //12864寫入指令
  105.     LCALL DEL10MS
  106. //*********************************     //時(shí)分秒分配,把時(shí)分秒分別算出高低位
  107.         MOV   A,SHI                                                    //小時(shí)數(shù)據(jù)送到累加器
  108.         MOV   B,#10                                                    //立既數(shù)10送到B
  109.         DIV   AB                                                        //小時(shí)數(shù)除以10
  110.         MOV   SHIH,A                                                //整數(shù)送到小時(shí)高位
  111.         MOV   SHIL,B                                                //余數(shù)送到小時(shí)低位
  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數(shù)據(jù)
  178.      SETB   RS                             ;選擇數(shù)據(jù)
  179.      LCALL  DEL1MS
  180.      CLR    RW                             ;寫模式
  181.      LCALL  DEL1MS
  182.      SETB   E                              ;使能允許
  183.      LCALL  DEL1MS
  184.      MOV    DATE,COOD                      ;數(shù)據(jù)寫入
  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. ;* 【延時(shí)程序】
  209. ;**************************************************************
  210. DEL1MS:                                                           //延時(shí)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:                                                   //延時(shí)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:                                                   //延時(shí)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:                                                           //延時(shí)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
復(fù)制代碼


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏11 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

來自 2#
ID:61140 發(fā)表于 2023-2-12 12:36 | 只看該作者
songxia8013 發(fā)表于 2023-2-10 15:49
請教一下,這個(gè)DJNZ R6,[        DISCUZ_CODE_1        ]nbsp; 是什么意思?

DJNZ R6,[        DISCUZ_CODE_1        ]nbsp;
這個(gè)原來是DJNZ R6,$
壇子里發(fā)不了$,所以自動轉(zhuǎn)成那樣了
回復(fù)

使用道具 舉報(bào)

板凳
ID:262 發(fā)表于 2022-5-6 16:13 | 只看該作者
一般來說 是不可能達(dá)到一年幾秒誤差的精度的,樓主測試過嗎?
回復(fù)

使用道具 舉報(bào)

地板
ID:61140 發(fā)表于 2022-5-6 16:21 | 只看該作者
heicad 發(fā)表于 2022-5-6 16:13
一般來說 是不可能達(dá)到一年幾秒誤差的精度的,樓主測試過嗎?

去理解一下C和匯編的差別,你會懂,一個(gè)匯編NOP指令,最多2-3微秒的時(shí)間,一個(gè)24M的晶振,幾微秒,一年誤差不會超過5秒種.
在C語言中,延時(shí)只是個(gè)模糊概念,不管你寫延時(shí)多少都不一定,要看編譯器怎么去做,但匯編語言你寫延時(shí)多少就是多少,可以做到很精準(zhǔn).
回復(fù)

使用道具 舉報(bào)

5#
ID:61140 發(fā)表于 2022-5-6 16:26 | 只看該作者
如果加上年累積誤差校正,一年走時(shí)誤差控制在1秒以內(nèi)是做的到的(這里只計(jì)論走時(shí)誤差,晶振的熱穩(wěn)定誤差不討論,那個(gè)是元件性能決定的)
回復(fù)

使用道具 舉報(bào)

6#
ID:99987 發(fā)表于 2022-5-6 18:53 | 只看該作者
厲害,匯編做的延時(shí)是很精確的,直擊底層,是C無法比擬的。
回復(fù)

使用道具 舉報(bào)

7#
ID:744744 發(fā)表于 2022-5-6 20:03 來自手機(jī) | 只看該作者
看不懂匯編程序,失敗
回復(fù)

使用道具 舉報(bào)

8#
ID:61140 發(fā)表于 2022-5-8 14:05 | 只看該作者
本人不會C,所以只好匯編充大頭了,各位見笑/
回復(fù)

使用道具 舉報(bào)

9#
ID:864787 發(fā)表于 2022-5-9 23:53 | 只看該作者
就喜歡匯編的可操作性,就好比開車一樣,我自己握方向盤總比使喚別人握方向盤爽的多,當(dāng)然使喚別人握方向盤肯定輕松多(類似C語言),但缺少那份激情,我喜歡匯編也是這原因,別跟我算法,我就編個(gè)時(shí)鐘或者一個(gè)手電筒控制程序,你跟我談算法
回復(fù)

使用道具 舉報(bào)

10#
ID:61140 發(fā)表于 2022-5-25 22:37 | 只看該作者
axiongzhang 發(fā)表于 2022-5-6 20:03
看不懂匯編程序,失敗

匯編并不是很難的,有人教就可以
回復(fù)

使用道具 舉報(bào)

11#
ID:61140 發(fā)表于 2022-5-25 22:37 | 只看該作者
madell 發(fā)表于 2022-5-6 18:53
厲害,匯編做的延時(shí)是很精確的,直擊底層,是C無法比擬的。

說的對,這是匯編的優(yōu)點(diǎn),C和匯編各有優(yōu)缺點(diǎn).
回復(fù)

使用道具 舉報(bào)

12#
ID:61140 發(fā)表于 2022-5-25 22:38 | 只看該作者
風(fēng)云101 發(fā)表于 2022-5-9 23:53
就喜歡匯編的可操作性,就好比開車一樣,我自己握方向盤總比使喚別人握方向盤爽的多,當(dāng)然使喚別人握方向盤 ...

喜歡就好,喜歡的才是適合自己的.
回復(fù)

使用道具 舉報(bào)

13#
ID:829973 發(fā)表于 2022-5-26 14:58 | 只看該作者
不錯(cuò),我也是喜歡匯編。。
回復(fù)

使用道具 舉報(bào)

14#
ID:78901 發(fā)表于 2022-5-26 17:40 | 只看該作者
不管是c還是匯編,中斷操作肯定影響計(jì)時(shí)
回復(fù)

使用道具 舉報(bào)

15#
ID:61140 發(fā)表于 2022-5-30 18:04 | 只看該作者
fsj5098 發(fā)表于 2022-5-26 17:40
不管是c還是匯編,中斷操作肯定影響計(jì)時(shí)

整個(gè)程序沒用到中斷,為什么要用中斷呢
回復(fù)

使用道具 舉報(bào)

16#
ID:102963 發(fā)表于 2023-2-10 15:49 | 只看該作者
請教一下,這個(gè)DJNZ R6,[        DISCUZ_CODE_1        ]nbsp; 是什么意思?
回復(fù)

使用道具 舉報(bào)

17#
ID:61140 發(fā)表于 2023-2-12 12:37 | 只看該作者
songxia8013 發(fā)表于 2023-2-10 15:49
請教一下,這個(gè)DJNZ R6,[        DISCUZ_CODE_1        ]nbsp; 是什么意思?

看我前面發(fā)的圖片上面就知道了
回復(fù)

使用道具 舉報(bào)

18#
ID:1072680 發(fā)表于 2023-4-25 16:55 | 只看該作者
您好,我想問你點(diǎn)關(guān)于單片機(jī)匯編的問題可以嗎?我是個(gè)新手小白,在做設(shè)計(jì)遇到了一些問題不知道咋解決想找您幫個(gè)忙。如果不方便的話就算了,叨嘮您了,不好意思啊
回復(fù)

使用道具 舉報(bào)

19#
ID:61140 發(fā)表于 2023-10-21 20:24 | 只看該作者
Dream匯編男孩 發(fā)表于 2023-4-25 16:55
您好,我想問你點(diǎn)關(guān)于單片機(jī)匯編的問題可以嗎?我是個(gè)新手小白,在做設(shè)計(jì)遇到了一些問題不知道咋解決想找您 ...

什么問題,工只是業(yè)余來一下這里,平時(shí)工作較忙。
回復(fù)

使用道具 舉報(bào)

20#
ID:78901 發(fā)表于 2023-10-21 22:49 | 只看該作者
如果環(huán)境溫度不變更的情況下,時(shí)鐘可以做得很準(zhǔn)(不管是匯編還是C)
回復(fù)

使用道具 舉報(bào)

21#
ID:397054 發(fā)表于 2023-10-22 09:42 | 只看該作者
xiaoyuxinke 發(fā)表于 2023-2-12 12:37
看我前面發(fā)的圖片上面就知道了

是啊,就是這個(gè)DJNZ R6,$是什么意思呢?
遍觀整個(gè)程序中并沒有這個(gè)標(biāo)號,跳到哪里去呢?
回復(fù)

使用道具 舉報(bào)

22#
ID:611626 發(fā)表于 2023-10-22 10:00 | 只看該作者
xiaoyuxinke 發(fā)表于 2022-5-8 14:05
本人不會C,所以只好匯編充大頭了,各位見笑/

樓主既然對匯編熟系,對OD跟蹤 WINhex這些一定也不陌生吧,能不能出個(gè)教程,工業(yè)控制上經(jīng)常用
回復(fù)

使用道具 舉報(bào)

23#
ID:397054 發(fā)表于 2023-10-22 10:58 | 只看該作者
剛試了下,可以編譯,結(jié)果是-2,這樣就省了個(gè)標(biāo)號,這在Keil中行得通,在其他的匯編環(huán)境中不知怎樣,這不是個(gè)標(biāo)準(zhǔn)用法,第一次看到。
回復(fù)

使用道具 舉報(bào)

24#
ID:61140 發(fā)表于 2023-10-22 22:51 | 只看該作者
鵜鶘 發(fā)表于 2023-10-22 09:42
是啊,就是這個(gè)DJNZ R6,$是什么意思呢?
遍觀整個(gè)程序中并沒有這個(gè)標(biāo)號,跳到哪里去呢?

R6中的數(shù)減一,如果不為0原地執(zhí)行,
就是說R6中的數(shù)不為0就重復(fù)執(zhí)行這句,
直到R6等于0,才跳到下一句。
回復(fù)

使用道具 舉報(bào)

25#
ID:61140 發(fā)表于 2023-10-22 22:54 | 只看該作者
songxia8013 發(fā)表于 2023-2-10 15:49
請教一下,這個(gè)DJNZ R6,[        DISCUZ_CODE_1        ]nbsp; 是什么意思?

原程序中是:
DJNZ R6,$
但是壇子里不讓發(fā)$這個(gè)符號,所以變成這樣了
回復(fù)

使用道具 舉報(bào)

26#
ID:61140 發(fā)表于 2023-10-22 22:56 | 只看該作者
宏達(dá)工控 發(fā)表于 2023-10-22 10:00
樓主既然對匯編熟系,對OD跟蹤 WINhex這些一定也不陌生吧,能不能出個(gè)教程,工業(yè)控制上經(jīng)常用

我還要工作,沒太多時(shí)間來這里,只是偶然過來看看,所以實(shí)在報(bào)歉
回復(fù)

使用道具 舉報(bào)

27#
ID:61140 發(fā)表于 2023-10-22 22:57 | 只看該作者
鵜鶘 發(fā)表于 2023-10-22 10:58
剛試了下,可以編譯,結(jié)果是-2,這樣就省了個(gè)標(biāo)號,這在Keil中行得通,在其他的匯編環(huán)境中不知怎樣,這不是 ...

匯編的移植性本來就不太友好,這是公認(rèn)的缺點(diǎn),所以這個(gè)我只能呵呵了
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表