|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这是一个GPS授时的数字钟,做了已经好几年了,现在拿出来和大家分享一下
新版发图片还是有大小限制,要求文件尺寸小于5M,而我的手机照出来的照片基本都在6-7M左右,所以上传之前还得要压缩一下才行
本作品来源于本坛一位高手的创意,GPS授时部分直接采用了@fang3 老师的程序,在此表示感谢,如有侵权请联系我删除
fang3 老师的原帖在此http://bbs.mydigit.cn/read.php?tid=505033
先看看成品的效果吧,放在卧室的空调上,夜里睁眼就能看得到
fang3 老师在原帖里写的非常详细,我只是在程序及硬件上简化了一些
这是电路,实际上采用了大字符数码管,电路有些改动,每段都采用了两个三极管驱动
开始制作,过程不细说了,看图
连接显示板
调试走时程序
关灯的效果
白天正常显示
晚上21:00-次日6:00为暗显示,降低显示亮度,以保证夜间不刺眼
从领导那里要了个画状品盒子,装起来
关灯的效果
正常运行
左上角的灯亮起表示没有授时成功
左上角的灯熄灭表示授时成功
电源用的是12V1A的路由器电源
GPS模块线缆由空调孔穿到室外
将GPS模块做好防水处理后固定到空调穿墙孔处,以便接收GPS卫星信号
位置还是很隐蔽的,外面看不出来
下面是程序
- ;89C2051+GPS 1.8寸数码管四位电子钟
- ;11.0592M晶振;GPS模块接在P3.0 P3.1
- ;第一位小数点是GPS未收到信号标识
- ;P3.7是GPS模块供电控制端,58-00分输出高电平
- ;***************************************
- LEDR1 BIT P3.2;时十位
- LEDR2 BIT P3.3;时个位
- LEDR3 BIT P3.4;分十位
- LEDR4 BIT P3.5;分个位
- ;;;;;;;;;;;;;;;;;;;;;;;;
- HOU EQU 60H;时
- MIN EQU 61H;分
- SEC EQU 62H;秒
- ;;;;;;;;;;;;;;;;;;;;;;;;
- ORG 0H
- AJMP START
- ORG 0BH
- AJMP INT_T0 ;T0中断
- ORG 23H;;串行中断
- LJMP GPS
- ;;;;;;;;;;;;;;;;;;;;;;;;
- ORG 30H
- START:
- MOV P1,#0;;初始化P1口
- ORL P3,#0FFH;初始化P3口,不能用mov P3,#0
- MOV HOU,#0
- MOV MIN,#0
- MOV SEC,#0
- ;***************
- ;初始化串口波特率9600,允计接收
- MOV SCON,#50H;串行通讯控制SM1 REN
- MOV TMOD,#21H;定时/计数器M1 M0
- MOV TH1,#0FDH;定时时间设置高位
- MOV TL1,#0FDH;定时时间设置低位
- SETB TR1;定时/计数器(TCON)
- SETB ES;中断允许(IE)
- ;***************
- MOV TH0,#4CH;定时器0 50ms
- MOV TL0,#0
- SETB TR0;定时/计数器(TCON)
- SETB ET0;中断允许(IE)
- SETB EA;中断允许(IE)
- ;*******************
- MAIN:
- ;GPS模块供电控制
- JNB 24H.7,kkk;----------------------如果没有校时成功则一直打开P3.7
- mov a,min
- cjne a,#58,AAA
- ajmp kkk
- AAA:cjne a,#59,BBB
- ajmp kkk
- BBB:cjne a,#00,NNN
- ajmp kkk
- kkk:setb P3.7;GPS模块供电控端
- ajmp PPP
- NNN:clr P3.7
- PPP:mov a,hou;判断夜间21:00-6:00暗显示
- cjne a,#21,ten
- CALL display2
- ten:cjne a,#22,eleven
- CALL display2
- eleven:cjne a,#23,twelve
- CALL display2
- twelve:cjne a,#0,one
- CALL display2
- one:cjne a,#1,two
- CALL display2
- two:cjne a,#2,three
- CALL display2
- three:cjne a,#3,four
- CALL display2
- four:cjne a,#4,five
- CALL display2
- five:cjne a,#5,nor
- CALL display2
- nor:
- CALL DISPLAY;送显示
- AJMP MAIN
- ;**************************
- DISPLAY:;显示
- MOV DPTR,#TAB
- MOV A,HOU;时十位
- MOV B,#10
- DIV AB
- cjne a,#0,zero;消隐无效0
- mov a,#10
- zero:MOVC A,@A+DPTR
- JNB 24H.7,GGGG;判断GPS是否收到时间信号
- setb ACC.7;第一位小数点显示GPS状态
- GGGG:MOV P1,A ;送显
- SETB LEDR1
- CALL DELAY1MS
- CLR LEDR1
- ;----------------
- MOV A,B
- MOVC A,@A+DPTR
- MOV C,0AH;秒点闪烁
- MOV ACC.7,C
- MOV P1,A ;送显
- SETB LEDR2
- CALL DELAY1MS
- CLR LEDR2
- ;**************************
- MOV A,MIN;分十位
- MOV B,#10
- DIV AB
- MOVC A,@A+DPTR
- MOV C,0AH;秒点闪烁
- MOV ACC.7,C
- MOV P1,A ;送显
- SETB LEDR3
- CALL DELAY1MS
- CLR LEDR3
- ;----------------
- MOV DPTR,#TAB
- MOV A,B
- MOVC A,@A+DPTR
- MOV P1,A ;送显
- SETB LEDR4
- CALL DELAY1MS
- CLR LEDR4
- RET
- ;**************************
- DISPLAY2:;暗显示
- MOV DPTR,#TAB
- MOV A,HOU;时十位
- MOV B,#10
- DIV AB
- cjne a,#0,zero2
- mov a,#10
- zero2:MOVC A,@A+DPTR
- JNB 24H.7,GGGG2
- setb ACC.7
- GGGG2:MOV P1,A ;送显
- SETB LEDR1
- CALL DELAY3
- CLR LEDR1
- call delay2;显示后关一段时间,以实现亮度降低
- ;----------------
- MOV A,B
- MOVC A,@A+DPTR
- MOV C,0AH;秒点闪烁
- MOV ACC.7,C
- MOV P1,A ;送显
- SETB LEDR2
- CALL DELAY3
- CLR LEDR2
- call delay2
- ;**************************
- MOV A,MIN;分十位
- MOV B,#10
- DIV AB
- MOVC A,@A+DPTR
- MOV C,0AH;秒点闪烁
- MOV ACC.7,C
- MOV P1,A ;送显
- SETB LEDR3
- CALL DELAY3
- CLR LEDR3
- call delay2
- ;----------------
- MOV DPTR,#TAB
- MOV A,B
- MOVC A,@A+DPTR
- MOV P1,A ;送显
- SETB LEDR4
- CALL DELAY3
- CLR LEDR4
- call delay2
- RET
- ;****************;****************;****************
- INT_T0:
- PUSH ACC ;定时器0中断计时
- PUSH PSW
- MOV TH0,#4CH;50MS
- MOV TL0,#0
- INC 30H
- MOV A,30H
- CJNE A,#10,T0_OUT;
- MOV 30H,#0
- CPL 0AH;秒闪位
- INC 31H
- MOV A,31H
- CJNE A,#2,T0_OUT;500MS*2=1S
- MOV 31H,#0
- INC SEC;秒加一
- MOV A,SEC
- CJNE A,#60,T0_OUT
- MOV SEC,#0
- INC MIN;分加一
- MOV A,MIN
- CJNE A,#60,T0_OUT
- MOV MIN,#0
- SETB ES;每小时打开一次串行中断,进行GPS校时
- INC HOU;时加一
- MOV A,HOU
- CJNE A,#24,T0_OUT
- MOV HOU,#0
- T0_OUT:
- POP PSW
- POP ACC
- RETI
- ;****************;****************;****************
- DELAY1MS: ;白天延时,亮2ms
- MOV R6,#50H
- DL0:
- MOV R5,#0AH
- DJNZ R5,$
- DJNZ R6,DL0
- NOP
- RET
- DELAY2: ;夜间延时,灭3ms
- MOV R6,#0FBH
- DL2:
- MOV R5,#04H
- DJNZ R5,$
- DJNZ R6,DL2
- NOP
- RET
- DELAY3: ;夜间延时,亮1ms
- MOV R6,#66H
- DL3:
- MOV R5,#03H
- DJNZ R5,$
- DJNZ R6,DL3
- NOP
- RET
- ;****************;****************;****************
- TABGPRMC: DB "$GPRMC," ;$GPRMC,数据
- TABGPGSV: DB "$GPGSV," ;$GPGSV,数据
- ;****************;****************;****************
- PD_GPG:;接收比较数据
- MOV R2,#7;
- PD_GPG1:
- JNB RI,$
- CLR RI
- MOV A,#0
- MOVC A,@A+DPTR
- CJNE A,SBUF,gOUT
- INC DPTR;下一个数据
- djnz R2,PD_GPG1;校对完7个数据
- clr c
- ret
- gOUT:setb c
- ret
- ;*******************************************
- GPGSV:;判断GPGSV,的后10位是否是0
- MOV DPTR,#TABGPGSV;$TABGPGSV的数据指针GPGSV
- acall PD_GPG;接收比较是否是收到“$GPGSV,”
- jnc sdsj;收到继续
- AJMP OUT
- sdsj:
- MOV R1,#10;跳过10个数
- GE10:
- JNB RI,$
- CLR RI
- DJNZ R1,GE10
- ;**********************
- JNB RI,$
- CLR RI
- MOV A,SBUF
- CJNE A,#'0',GPSOK;非0跳出读时间
- JNB RI,$
- CLR RI
- MOV A,SBUF
- CJNE A,#'0',GPSOK;非0跳出读时间
- SETB 24H.7;继续判断,开绿灯位
- AJMP OUT
- GPSOK:
- CLR 24H.7;关绿灯
- SETB 24H.0;置读时间位
- AJMP OUT
- ;****************;****************;************
- ;-------串行口中断
- ;接收到$GPRMC, 后面的是时分秒数据ANSI格式的
- ;*********************;****************
- GPS:;$GPRMC
- CLR ES;关串行中断,避免反复中断,下面接收用查询
- PUSH ACC;保护
- PUSH DPH
- PUSH DPL
- JNB 24H.0,GPGSV;因为室内收不定位,所以首先判断GPGSV,再往后10位否为0,如果是0的话时间是不对的,
- ;如果非0,即使收不到定位信号时间也是对的
- TGPRMC:
- MOV DPTR,#TABGPRMC;$GPRMC的数据指针
- acall PD_GPG;接收比较是否是收到“$GPRMC,”
- jnc sdsjq;收到继续
- OUT:
- POP DPL
- POP DPH
- POP ACC
- SETB ES;打开串行中断
- RETI;退出
- sdsjq:
- ;**********************
- MOV R0,#40H;ANSI码时间的保存地址指针
- MOV R1,#6;时分秒6个ANSI码数据
- GET_GPS:
- JNB RI,$
- CLR RI
- MOV A,SBUF
- SUBB A,#30H;ANSI减30H是16进制数
- MOV @R0,A
- INC R0;下一内存
- DJNZ R1,GET_GPS
- ;**********************
- ;---------------
- ;处理数据,把6位数合成时分秒三位数
- MOV R0,#40H;ANSI码时间的保存地址指针
- MOV R1,#HOU;小时指针
- ZLGO:
- MOV A,@R0
- MOV B,#10
- MUL AB
- INC R0
- ADD A,@R0
- MOV @R1,A
- INC R0
- INC R1
- CJNE R0,#46H,ZLGO
- ;----------------
- ;收到的是伦敦时间,北京东8区 +8小时
- MOV A,HOU
- ADD A,#8;小时加8
- CJNE A,#24,JJ;是否大于24小时
- JJ:JC XY
- SUBB A,#24;大于24减24
- XY:
- MOV HOU,A;保存成北京时间
- CLR 24H.0;清读时间位
- POP DPL
- POP DPH
- POP ACC
- RETI
- ;****************;****************
- TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H
- ;0,1,2,3,4,5,6,7,8,9,灭
- END
复制代码
|
打赏
-
查看全部打赏
|