本帖最后由 xiaoyuxinke 于 2022-5-8 14:11 編輯
本程序無需DS1302,無需定時器,另本程序使用匯編語言編寫,只要按所使用的晶振修改延時部分,可以做到一年誤差5秒以內.
視頻已上傳至優酷,需要的可以看一下.https://v.youku.com/v_show/id_XN ... o_XNTg2ODI5MDQ3Mg==
需要精校時間的可調整此四個值,需要更精準可在延時部分加NOP修整(可做到年誤差3秒以內),此程序雖然不使用DS1302,但可以做到比DS1302更為精準
下面是單片機匯編語言程序部分:
- ;******************************************************************************
- ;* 【LCD12864數據接口定義】
- ;******************************************************************************
- RS BIT P2.7 //高電平數據低電平指令
- RW BIT P2.6 //高電平讀低電平寫
- E BIT P2.5 //LCD12864使能控制端
- DATE EQU P0 //八位數據送P0口(八位數據總線)
- COM EQU 70H //LCD12864指令暫存地址
- COOD EQU 91H //LCD12864數據暫存地址
- ;******************************************************************************
- ;* 【時間顯示定義】
- ;******************************************************************************
- SHI EQU 40H
- FEN EQU 41H
- MIAO EQU 42H
- SHIH EQU 43H
- SHIL EQU 44H
- FENH EQU 45H
- FENL EQU 46H
- MIAOH EQU 47H
- MIAOL EQU 48H
- ;******************************************************************************
- ;* 【按鍵功能和標志位定義】
- ;******************************************************************************
- KEY1 EQU P1.1
- KEY2 BIT P1.4
- KEY3 BIT P1.5
- KEY4 BIT P1.6
- BUZZ BIT P3.7
- ORG 0000H
- AJMP SDATA
- ORG 0030H
- AJMP INTT0
- ORG 0060H
- SDATA:
- SETB PX0 //外部中斷0優先權第1
- SETB EX0 //下降沿觸發中斷
- SETB IT0 //外部中斷0被允許
- SETB EA //總中斷位被允許
- MOV SHI,#17 //小時賦初值
- MOV FEN,#33 //分鐘賦初值
- MOV MIAO,#00 //秒鐘賦初值
- MOV SHIH,#0 //小時高位賦初值
- MOV SHIL,#0 //小時低位賦初值
- MOV FENH,#0 //分鐘高位賦初值
- MOV FENL,#0 //分鐘低位賦初值
- MOV MIAOH,#0 //秒鐘高位賦初值
- MOV MIAOL,#0 //秒鐘低位賦初值
- LCALL LCDCSH //LCD12864初始化
- LCALL FMQ //蜂鳴器響一聲
- JMP MAIN //
- MAIN:
- LCALL HZXSCX //
- JMP MAIN
- INTT0: //
- JNB KEY1,DISP1 //
- JNB KEY2,DISP2
- JNB KEY3,DISP3 //
- JNB KEY4,DISP4
- RETI //
- DISP1:
- LCALL FMQ
- CLR P3.2 //
- INC SHI
- RET //
- DISP2:
- RET //
- DISP3: //
- RET
- DISP4: //
- RET
- //
- LCDCSH:
- MOV COM,#01H //DDRAM寫入20H,DDRAM的AC計數器清零
- LCALL WCOM //12864寫入指令
- LCALL DEL10MS //延時4.6毫秒
- MOV COM,#02H // AC清零,游標到開頭位置
- LCALL WCOM //12864寫入指令
- LCALL DEL10MS //延時4.6毫秒
- MOV COM,#0CH //游標開,整體顯示開,游標位置開
- LCALL WCOM //12864寫入指令
- LCALL DEL10MS //延時4.6毫秒
- RET
- ;******************************************************************************
- ;* 【時間計算部分】
- ;******************************************************************************
- SJJSBF: //時間計算部分,秒到60分進一,分到60時進一,時到24全清零
- MOV A,MIAO //秒鐘數據送到累加器
- CJNE A,#60,FAG //如果不等于60就退出,否則向下執行
- MOV MIAO,#00 //秒鐘數據清零
- INC FEN //分鐘數據加一
- MOV A,FEN //分鐘數據送到累加器
- CJNE A,#60,FAG //如果不等于60就退出,否則向下熱行
- MOV FEN,#00 //分鐘數據清零
- INC SHI //小時數據加一
- MOV A,SHI //小時數據送到累加器
- CJNE A,#24,FAG //如果不等于24就退出,否則向下執行
- MOV SHI,#00 //小時數據清零
- RET
- FAG:
- RET
- HZXSCX:
- MOV COM,#9CH //從第四行第四個位置開始寫
- LCALL WCOM //12864寫入指令
- LCALL DEL10MS
- //********************************* //時分秒分配,把時分秒分別算出高低位
- MOV A,SHI //小時數據送到累加器
- MOV B,#10 //立既數10送到B
- DIV AB //小時數除以10
- MOV SHIH,A //整數送到小時高位
- MOV SHIL,B //余數送到小時低位
- MOV A,FEN
- MOV B,#10
- DIV AB
- MOV FENH,A
- MOV FENL,B
- MOV A,MIAO
- MOV B,#10
- DIV AB
- MOV MIAOH,A
- MOV MIAOL,B
- //*********************************
- MOV A,SHIH
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV COOD,A
- LCALL WCOD
- LCALL DEL1MS
-
- MOV A,SHIL
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV COOD,A
- LCALL WCOD
- LCALL DEL1MS
- //****************************
- MOV COOD,#":"
- LCALL WCOD
- LCALL DEL1MS
- //****************************
- MOV A,FENH
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV COOD,A
- LCALL WCOD
- LCALL DEL1MS
-
- MOV A,FENL
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV COOD,A
- LCALL WCOD
- LCALL DEL1MS
- //****************************
- MOV COOD,#":"
- LCALL WCOD
- LCALL DEL1MS
- //****************************
- MOV A,MIAOH
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV COOD,A
- LCALL WCOD
- LCALL DEL1MS
-
- MOV A,MIAOL
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV COOD,A
- LCALL WCOD
- LCALL DEL1MS
- INC MIAO
- LCALL DEL1S
- LCALL SJJSBF
- RET
-
- WCOD: ;寫12864數據
- SETB RS ;選擇數據
- LCALL DEL1MS
- CLR RW ;寫模式
- LCALL DEL1MS
- SETB E ;使能允許
- LCALL DEL1MS
- MOV DATE,COOD ;數據寫入
- LCALL DEL10MS
- CLR E
- LCALL DEL10MS
- RET
-
- WCOM: ;寫12864指令
- CLR RS ;選擇指令
- LCALL DEL1MS
- CLR RW ;寫模式
- LCALL DEL1MS
- SETB E ;使能允許
- LCALL DEL1MS
- MOV DATE,COM ;指令寫入
- LCALL DEL10MS
- CLR E
- LCALL DEL10MS
- RET
- FMQ:
- CLR BUZZ
- LCALL DEL80MS
- SETB BUZZ
- RET
- ;**************************************************************
- ;* 【延時程序】
- ;**************************************************************
- DEL1MS: //延時1毫秒子程序
- MOV R7,#01H //
- DL1: //
- MOV R6,#8EH //
- DL0: //
- MOV R5,#02H //
- DJNZ R5,[ DISCUZ_CODE_1 ]nbsp; //
- DJNZ R6,DL0 //
- DJNZ R7,DL1 //
- RET //子程序退出
- DEL10MS: //延時10毫秒子程序
- MOV R3,#02H //
- DEL41: //
- MOV R4,#20 //
- E11: //
- MOV R5,#25 //
- DJNZ R5,[ DISCUZ_CODE_1 ]nbsp; //
- DJNZ R4,E11 //
- DJNZ R3,DEL41 //
- RET //子程序退出
-
- DEL80MS: //延時80毫秒子程序
- MOV R3,#20 //
- DEL40: //
- MOV R4,#250 //
- E1: //
- MOV R5,#150 //
- DJNZ R5,[ DISCUZ_CODE_1 ]nbsp; //
- DJNZ R4,E1 //
- DJNZ R3,DEL40 //
- RET //子程序退出
- DEL1S: //延時1秒子程序
- MOV R3,#05H //
- E21: //
- MOV R4,#255 //
- E31: //
- MOV R5,#20 //
- E41: //
- MOV R6,#248 //
- DJNZ R6,[ DISCUZ_CODE_1 ]nbsp; //
- DJNZ R5,E41 //
- DJNZ R4,E31 //
- DJNZ R3,E21 //
- RET //子程序退出
- TAB:
- DB "0","1","2","3","4","5","6","7","8","9",":"
- END
復制代碼
|