|
串口使用用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
打赏
-
查看全部打赏
|