本帖最后由 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
复制代码
|