数码之家

 找回密码
 立即注册
搜索
查看: 1186|回复: 7

做了一个时钟,串口校时

[复制链接]
发表于 2022-6-13 06:27:39 | 显示全部楼层 |阅读模式

串口使用用3.5音频插头和插座
显示用1602,背光接2.2K电阻
时钟芯片用DS1302
板子是自己做的,用Altium Designer 18,普通A4纸打印,老式电熨斗转印
因为1602太耗电,干脆就不装开关,插电长期运行。

上位机用VB编写,定制两个计划任务,每天两次运行程序,将电脑时间发送到串口,51接收后更新1302时间。

做完后发现这是一个最没用的东西,电脑开着谁会看时钟啊。

上位机源代码:

Public NOWSTR As Variant
Public SECOUT, MINOUT, HOUROUT, DATEOUT, MONTHOUT, XQOUT, YEAROUT As Variant
Public OUTSER As Variant

'一个主窗口,名字是MAIN
'一个串口控件,名字是COM4,因为我的电脑插上usb转串口,就是COM4

Private Sub Form_Initialize()
ReDim OUTSER(1 To 7) As Byte
NOWSTR = Now()
SECOUT = CByte(Second(NOWSTR))
MINOUT = CByte((Minute(NOWSTR)))
HOUROUT = CByte(Hour(NOWSTR))
DATEOUT = CByte(Day(NOWSTR))
MONTHOUT = CByte(Month(NOWSTR))
XQOUT = CByte(Weekday(NOWSTR) - 1)
YEAROUT = CByte(Year(NOWSTR) - 2000)
OUTSER(1) = SECOUT
OUTSER(2) = MINOUT
OUTSER(3) = HOUROUT
OUTSER(4) = DATEOUT
OUTSER(5) = MONTHOUT
OUTSER(6) = XQOUT
OUTSER(7) = YEAROUT
End Sub

Private Sub Form_Load()
Dim STARTTIME, ENDTIME As Long


COM4.OutBufferCount = 0
COM4.PortOpen = True
COM4.Output = OUTSER

'以下语句,等待一秒钟,让串口发送完
STARTTIME = Timer
Do
ENDTIME = Timer
Loop Until (ENDTIME - STARTTIME) >= 1
COM4.PortOpen = False
Unload Me       '发送完自动退出
End Sub



51单片机源代码:
因为我的编译器是英文版,注释都变成了乱码,懒得再整理了。
ORG 0000
AJMP START
ORG 100H
START:
MOV SP,#60H
RS EQU P1.3
RW EQU P1.4
E1602 EQU P1.5
CE1302 EQU P1.0
IO1302 EQU P1.1
SCLK1302 EQU P1.2
LCDSTATUS EQU 20H
LCDCMD EQU 21H        ;21H????LCD1602???
LCDDATA EQU 22H        ;22H????LCD1602???
TIMECMD EQU 23H        ;23H????DS1302???(??)
TIMEDATA EQU 24H        ;24H????1302??
SEC10 EQU 30H        ;0CAH
SEC01 EQU 31H        ;0CBH
MIN10 EQU 32H        ;0C7H
MIN01 EQU 33H        ;0C8H
HOUR10 EQU 34H        ;0C4H
HOUR01 EQU 35H        ;0C5H
DATE10 EQU 36H        ;89H
DATE01 EQU 37H        ;8AH
MONTH10 EQU 38H        ;86H
MONTH01 EQU 39H        ;87H
YEAR10 EQU 3CH        ;83H
YEAR01 EQU 3DH        ;84H
XQ10 EQU 3AH
XQ01 EQU 3BH        ;8EH

YEAR EQU 46H                ;46H????
XQ EQU 45H        ;45H????
MONTH EQU 44H        ;44H????
DAY EQU 43H        ;43H???
HOUR EQU 42H        ;42H????
MIN EQU 41H        ;41H????
SEC EQU 40H        ;40H???

;TMPYEAR EQU 56H                ;56H?????????,V3??
;TMPXQ EQU 55H        ;55H?????????,V3??
;TMPMONTH EQU 54H        ;54H?????????,V3??
;TMPDAY EQU 53H        ;53H????????,V3??
;TMPHOUR EQU 52H        ;52H?????????,V3??
;TMPMIN EQU 51H        ;51H?????????,V3??
;TMPSEC EQU 50H        ;50H????????,V3??


BUSY BIT 07H        ;07BIT(20H????)?????
BACKOFC BIT 7FH        ;7FH??CY???

INPUTBUFF EQU 3EH        ;3EH????????       

;1602????????30ms???????5V
CLR CE1302
LCALL DLY50MS
LCALL ISIDLE        ;??
;??1602????
MOV LCDCMD , #38H        ;2???,5*7,??,8???
LCALL WRCMD        ;?LCD1602???
LCALL DLY1MS        ;??1ms       
LCALL ISIDLE        ;??       
MOV LCDCMD , #01H        ;LCD1602?????01H
LCALL WRCMD        ;???
LCALL DLY5MS        ;????????,??5ms       
LCALL ISIDLE        ;??       
MOV LCDCMD ,#0CH        ;???
LCALL WRCMD
LCALL DLY1MS       
;??????????,????????,??“-:XQ”
MOV R0,#8        ;??8?????????
MOV R1,#0
MOV DPTR,#DISPADDTAB        ;??????????,??-??-??-?????
NEXTDISPCELL:
MOV A,R1
MOVC A,@A+DPTR        ;??????
MOV LCDCMD,A        ;???????
INC R1        ;????????
MOV A,R1
MOVC A,@A+DPTR
MOV LCDDATA,A        ;????LCD1602??????
INC R1        ;?????,????

LCALL ISIDLE       
LCALL WRCMD       
LCALL ISIDLE
LCALL WRDATA        ;??4?,??1?????

DJNZ R0,NEXTDISPCELL        ;????1,8??????,?????
;??3?,??1302???
MOV TIMECMD,#8EH
MOV TIMEDATA,#00
LCALL WRTIME
;??,??????,????,????
;---------------------------------------------------
INIDATEANDTIME:
MOV YEAR,#22H
MOV MONTH,#06H
MOV DAY,#06H
MOV HOUR,#18H
MOV MIN,#51H
MOV SEC,#00H
MOV XQ,#1

   MOV R3,#7
        MOV R4,#80H
        NEXTTIMEDATA:
   MOV A,R4
        MOV TIMECMD,A
        MOV A,R4
        RR A
        MOV R0,A
        MOV A,@R0
        MOV TIMEDATA,A
        INC R4
   INC R4   
        LCALL WRTIME
        DJNZ R3,NEXTTIMEDATA
;---------------------------------------------------
;????,??????
;????,?????,?????1302
        MOV TIMECMD,#8EH
        MOV TIMEDATA,#80H
        LCALL WRTIME       

;????,?????,????,???2400,??????
mov tmod,#20h           ;??T1???2(????)
mov tl1,#0F3H          ;???2400
mov th1,#0F3H         ;??
mov pcon,#00h           ;PCON?SMOD=0
setb tr1                        ;??T1???
clr ri                         ;?????
mov scon,#50h           ;??1??

READDATEANDTIME:        ;?1302????,??1602?????
MOV R0,#81H
MOV R1,#30H
RDNEXTREG:
MOV TIMECMD,R0        ;????1302???,??(81H)??
LCALL RDTIME

MOV A,TIMEDATA        ;??????(?????),??????
SWAP A
ANL A,#0FH
ADD A,#30H        ;?????????(?????),?30H?????*?????3*
MOV @R1,A
INC R1

MOV A,TIMEDATA        ;?????????
ANL A,#0FH
ADD A,#30H
MOV @R1,A
INC R1

INC R0
INC R0
CJNE R0,#8FH,RDNEXTREG        ;???????

MOV R3,#13        ;????????????,???,?13???
MOV R4,#0
MOV DPTR,#TIMENUMTAB        ;??????,???????1602??,??????
NEXTNUM:
MOV A,R4
MOVC A,@A+DPTR
MOV LCDCMD,A        ;????(LCD1602??)?????
INC R4
MOV A,R4
MOVC A,@A+DPTR
MOV R0,A
MOV A,@R0        ;???1602??????
MOV LCDDATA,A       
INC R4
;??4?,???????
LCALL ISIDLE       
LCALL WRCMD       
LCALL ISIDLE
LCALL WRDATA

MOV A,3BH        ;?????????,????,???0,??
SUBB A ,#30H
JNZ GOON
MOV 3BH,0F2H        ;3BH?????????F2,F2???
GOON:
DJNZ R3,NEXTNUM

MOV R7,#7        ;????7???
MOV R0,#SEC
JNB RI,NOINPUT        ;??????,??,????,?????1302,???
NEXTIODATA:
JNB RI,$
CLR RI
MOV A,SBUF
MOV @R0,A
INC R0        ;??????,?????????1
DJNZ R7,NEXTIODATA        ;??7?????????
CLR RI

LCALL GETDATETIMENUM        ;??????????

NOINPUT:
JMP READDATEANDTIME



;????????,??? R6/R7/R2/A/C ???
GETDATETIMENUM:
;????,?????????,???1302??
;????,??1302???
MOV TIMECMD,#8EH
MOV TIMEDATA,#00
LCALL WRTIME
;????,?????1302??????????
MOV R7,#7
MOV R0,#SEC
NEXTIODATATO1302:
MOV A,@R0
SWAP A
ANL A,#0FH
MOV R6,A
MOV A,@R0
ANL A,#0FH
ADD A,#0
DA A

ADD16:
CJNE R6,#0,ADDONE16
JMP ADDOVER
ADDONE16:
ADD A,#16H
DA A
DEC R6
JMP ADD16

ADDOVER:
MOV TIMEDATA,A        ;
MOV A,R0        ;???????????A
RL A        ;??1?(??2),??1302?????
MOV TIMECMD,A        ;??????R0
LCALL WRTIME
INC R0
DJNZ R7,NEXTIODATATO1302
;????,???1302
        MOV TIMECMD,#8EH
        MOV TIMEDATA,#80H
        LCALL WRTIME


RET



DLY100MS:
MOV R7,#200
DL1:MOV R6,#249
DL2:DJNZ R6,DL2
DJNZ R7,DL1
RET

DLY10MS:
MOV R7,#20
DL3:MOV R6,#249
DL4:DJNZ R6,DL4
DJNZ R7,DL3
RET
DLY1MS:
MOV R7,#2
DL7:MOV R6,#249
DL8:DJNZ R6,DL8
DJNZ R7,DL7
RET       
DLY5MS:
MOV R7,#10
DL9:MOV R6,#249
DLA:DJNZ R6,DLA
DJNZ R7,DL9
RET       



DLY50MS:
MOV R7,#100
DL5:MOV R6,#249
DL6:DJNZ R6,DL6
DJNZ R7,DL5
RET
;THIS FUNCTION USE BUSY(07) AS RETURN,1 IS BUSY,0 NOT BUSY
GETSTATUS:
CLR RS
SETB RW
NOP
NOP
SETB E1602
NOP
MOV P0,#0FFH       
MOV LCDSTATUS,P0
CLR E1602
RET

;WRITE COMMAND , USE R0 AS PAR TRANSLATE COMMAND LINE
WRCMD:
CLR RS
CLR RW
MOV P0,LCDCMD
NOP
SETB E1602
NOP
CLR E1602
RET

WRDATA:
SETB RS
CLR RW
MOV P0,LCDDATA
NOP
SETB E1602
NOP
CLR E1602
RET

ISIDLE:
CLR RS
SETB RW
NOP
NOP
SETB E1602
NOP
NOIDLE:MOV P0,#0FFH       
MOV C,P0.7
JC NOIDLE
CLR E1602
RET

WRTIME:        ;CMD TO TIMECMD,DATA TO TIMEDATA
CLR SCLK1302
SETB CE1302

CLR C
MOV R2,#8
MOV A,TIMECMD
WRNEXTCMDBIT:
RRC A
MOV IO1302,C
NOP
SETB SCLK1302       
NOP
CLR SCLK1302
DJNZ R2,WRNEXTCMDBIT

CLR C
MOV R2,#8
MOV A,TIMEDATA
WRNEXTDATABIT:
RRC A
MOV IO1302,C
NOP
SETB SCLK1302
NOP
CLR SCLK1302
DJNZ R2,WRNEXTDATABIT

SETB SCLK1302
SETB IO1302
CLR CE1302

RET

RDTIME:        ;CMD TO TIMECMD,DATA TO TIMEDATA   
CLR SCLK1302
SETB CE1302
CLR C
MOV R2,#8
MOV A,TIMECMD
RD_WR_NEXTCMDBIT:
RRC A
MOV IO1302,C
NOP
SETB SCLK1302
NOP
CLR SCLK1302
DJNZ R2,RD_WR_NEXTCMDBIT
NOP

MOV R2,#8
RDNEXTDATABIT:
MOV C,IO1302
RRC A
SETB SCLK1302
NOP
CLR SCLK1302
DJNZ R2,RDNEXTDATABIT


CLR CE1302
SETB IO1302
MOV TIMEDATA,A

RET


DISPADDTAB:
DB 81H, "2", 82H, "0",85H,"-",88H,"-",8CH,"X",8DH,"Q",0C6H,":",0C9H,":"
TIMENUMTAB:       
DB 0CAH,30H,0CBH,31H,0C7H,32H,0C8H,33H,0C4H,34H,0C5H,35H,89H,36H,8AH,37H,86H,38H,87H,39H,83H,3CH,84H,3DH,8EH,3BH       

END

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +10 收起 理由
w9988 + 10 優秀文章

查看全部打赏

发表于 2022-6-13 07:37:00 | 显示全部楼层
看到汇编就头疼
回复 支持 反对

使用道具 举报

发表于 2022-6-13 08:09:43 | 显示全部楼层
代码不够精炼,在一个这格式(关键字对齐、空格等)看着晕。。。
回复 支持 反对

使用道具 举报

发表于 2022-6-13 11:10:45 | 显示全部楼层
谢谢楼主分享  汇编 专业人员实际应用 还是有优势的 高效率
回复 支持 反对

使用道具 举报

发表于 2022-6-13 13:24:29 | 显示全部楼层
这也就是玩玩,正如楼主所说,电脑开着谁还看钟啊。其实电脑校时还不如网络校时,通常家里的wifi不会关,可以每天校时。
回复 支持 反对

使用道具 举报

发表于 2022-6-13 20:01:02 | 显示全部楼层
改变思路,电脑关机后才显示时间,电脑开机时上位机ntp后设置ds1302.
回复 支持 1 反对 0

使用道具 举报

发表于 2022-6-13 20:47:22 | 显示全部楼层
楼主的分享使我想起来我很多年前的一个烂尾制作,当时的设计是用VB做上位机,每次电脑开机自动启动并通过24L01无线模块发送电脑时间数据,而后将所有时钟、闹表都加上24L01接收模块用来校时,后来调试完成了24L01的收、发后就转向弄电波校时去了,而后发现我这里的电波校时信号极其不稳定就放弃了,而后开始关注GPS校时但发现很多人说那个模块在室内无法接收信号就就没上手,直到近两年wifi模块的出现才真正实现了自动校时的梦想。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-6-23 21:03:57 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2022-6-13 20:47
楼主的分享使我想起来我很多年前的一个烂尾制作,当时的设计是用VB做上位机,每次电脑开机自动启动并通过24 ...

很好的想法,无线这块我也想过,还没玩过,可以一试。谢谢你提供思路。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-24 18:52 , Processed in 0.405601 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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