"); //-->
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。
汕尾职业技术学院电子信息系 李雪梅
数字万年历也叫数字时钟,市场上很常见。不过它们的年、月、日、时、分的调整是在时钟上设有调整按钮,每次需要调整时间时,要把时钟从墙上摘下来进行调时。这里介绍的红外遥控数字万年历,是采用长虹K11F型遥控器进行遥控调节年、月、日、时、分。
一、 硬件构成与工作原理
图一为电路原理方框图,图二为红外遥控数字万年历电路原理图。AT89C51 为主控芯片。I/O口P3.7负责取出时钟芯片DS1302送出的时钟脉冲;P3.5负责控制芯片DS1302的串行数据输入端;P3.2受到红外线传感器的控制,对AT89C51进行外部中断,达到调节年、月、日或时、分的目的;P3.1送出脉冲使闹钟BELL定时峰鸣,提醒使用者定时时间到;P0.0-P0.7并接6个LED八段高亮度数码管的a、b、c、d、e、f、g、h端,与I/O口P2.0—P2.5共同控制6个数码管,分别显示年、月、日或时、分、秒。显示采用流动循环显示,显示一位的时间为2ms,这样可以节省电能和提高数码管的使用寿命。LED1和LED2间出现“:”,作为分与秒的分隔符;LED3与LED4之间也出现“:”,作为时与分的分隔符。因此,LED1和LED3应该按照电路图倒装。
图二
二、软件设计 1、K11F各按键编码 下面例出K11F遥控器各按键的编码对应本电路的各种动作表(如果采用其他遥控器,需对程序相应部分的编码进行修改)。
表一
遥控器的按键 遥控器的编码 电子钟动作
静音键 40 BF 10 EF 闹铃开/关
菜单键 40 BF 0C F3 进入/退出设置状态
左移键 40 BF 46 B9 选择设置时、分、闹时、闹分、月、日状态
右移键 40 BF 47 B8 选择设置时、分、闹时、闹分、月、日状态
增加键 40 BF 19 E6 增加设置值
减少键 40 BF 1D E2 减少设置值
显示键 40 BF 16 E9 LED数码管显示/关闭
日历键 40 BF 44 BB 年月日显示/关闭
返回键 40 BF 40 BF 进入初始化状态12:00:00
****键 40 BF 14 EB 显示分秒/关闭
时、分、秒显示:该时钟开机自动进入显示时、分、秒状态
分秒显示:按“****”键进入显示分秒的状态,再按一次是返回。
年月日显示:按“日历”键进入显示日月的状态,再按一次是返回。
时间设置:按“菜单”键进入设置状态,按“↑↓”键调整数值,按“←“、”→”键可在闹铃与正常时间,日月之间移动。任意时刻再次按“菜单”键就退出设置。
闹铃设置:闹铃时间在时间设置中进行,闹铃允许和取消可在任意时刻按“静音”键。
2、时钟芯片DS1302
DS1302引脚内部结构图如图三,各引脚功能如表二,日历、时钟寄存器与控制字如表三。DS1302的控制字节有8位,最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中;(位6)如果为0,则表示存取日历时钟数据,(位6)为1表示存取RAM数据;(位5)至(位1)指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。在控制指令字输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低(位0)位至高(位7)
表三 DS1302日历、时钟寄存器及控制字
寄存器名 命令字 取值范围 各位内容
写操作 读操作 7 6 5 4 3 2 1 0
秒寄存器 80H 81H 00-59 CH 10SEC SEC
分钟寄存器 82H 83H 00-59 0 10MIN MIN
小时寄存器 84H 85H 01-12或00-23 12/24 0 10/AP HR HR
日期寄存器 86H 87H 01-28、29、30、31 0 0 10DATE DATE
月份寄存器 88H 89H 01-12 0 0 0 10M MONTH
周日寄存器 8AH 8BH 01-05 0 0 0 0 0 DAY
年份寄存器 8CH 8DH 00-99 10YEAR YEAR
3、AT89C51软件设计
程序主要有四个部分组成,其流程图分别如下。主程序(图四),红外遥控外中断程序(图五),定时T0中断程序用于读写DS1302时钟(图六),定时T1中断程序送时钟数据到LED显示(图七)。(注明:详细程序由于篇幅有限不在敖述。)
谢言:在制作本万年历过程中受到李星活副教授、崔少军高级讲师和本系同行们的热情支持和帮助,仅此表示感谢。在写本文中如有出错或漏洞请读者提出宝贵意见,有待更加完善。
联系电话:0660-3373212 email:swlxm116715@163.com
作者:李雪梅,女,生于1981年1月,助讲,2003年毕业于西南师范大学电子信息系,现在在广东汕尾职业技术学院电子信息系任教。
附程序:(稿中不必出现)
muteM EQU 10h ;静音键 闹铃开/关
timerT EQU 0Ch ;菜单键 进入/退出设置状态
leftL EQU 46h ;左移键
rightR EQU 47H ;右移键
upU EQU 19h ;增加键
downD EQU 1dh ;减少键
d_off EQU 16H ;显示键 LED数码管显示/关闭
recall EQU 44H ;日历键 日月NIAN显示/关闭
fanhui EQU 40H ;返回键 设置初始化
feimao EQU 14H ;****键 显示分秒/关闭
K_ON BIT P3.1
LED1 BIT P3.3
LED2 BIT P3.4
DS1302CLK BIT P3.5
DS1302IO BIT P3.7
RST BIT P3.0
KEY BIT P3.2
SECOND EQU 60H
;60H 秒
;61h 分
;62h 时
;63h 日
;64h 月
;65h DAY
;66h 年低
;6Ah 闹分 from 00(1302)
;6BH 闹时 from 01(1302)
ORG 0000H
AJMP START
ORG 0003H
LJMP S_INT
ORG 000BH
LJMP P_INT
ORG 001BH
LJMP DISPLAY
;**************************** ;main program
ORG 0040H
START: CLR RST
MOV SP,#2AH
SETB 05H
CLR 06H
START1: SETB 07H; CLR 07H
SETB 08H
CLR 09H
CLR 0AH
CLR 0BH
CLR 0CH
SETB 0DH
CLR 0EH
CLR 0FH
CLR 10H
CLR 11H
CLR 21H
CLR 22H
CLR 23H
CLR 18H
CLR 24H
MOV P1,#00H
MOV P2,#0FFH
MOV R2,#00H ;
MOV R3,#00H ;
MOV TMOD,#12H
MOV TL1,#0e5H ;wait
MOV TH1,#0BeH
MOV TH0,#3FH ;200uS 3f
MOV TL0,#3FH
SETB ET0 ;设置中断优先
SETB ET1
SETB PT0 ; 定时中断优先0
SETB TR0
SETB TR1
SETB IT0 ;脉冲触发T0
SETB EX0 ; 允许外中断
CLR PX0 ;外部中断0优先设0
;LCALL SET1302 ;初始化
NOP
MOV R1,#0C1H ;取定时参数从1302中
ACALL T_6061
NOP
MOV 6AH,A ;M
MOV R1,#0C3H
ACALL T_6061
MOV 6BH,A ;H
MOV 61H,#00H
MOV 62H,#00H
NOP
SETB EA
SJMP $
NOP
NOP
NOP
NOP
AJMP 0000H
NOP
NOP
NOP
LJMP 0000H
;*************DISPLAY*********
DISPLAY: PUSH ACC
PUSH PSW
MOV TL1,#0e0H ;wait how long to display (20ms)
MOV TH1,#0b0H
mov dptr,#TAB1
JB 18H,DISMAO ;分、秒
JB 0EH,DIS2 ;时
JB 0FH,DIS3 ;分
NOP
JB 10H,DIS4 ;闹时
JB 11H,DIS5 ;闹分
NOP
JB 21H,DIS6 ;年、月、日
JB 22H,DIS7 ;分、秒
NOP
JB 24H,DIS6
NOP
JB 18H,DISMAO
JNB 0DH,NEXD_OUT
NOP
JNB 08H,D_GO ;定时到时,显示闪烁
NOP
JNB 07H,NEXD_OUT
NOP
LJMP D_GO;显示时、分、秒
NOP
LJMP D_GO
NOP
NEXD_OUT:LJMP D_OUT
NOP
;*********************
DISMAO: LJMP DIS_7
DIS2: LJMP DIS_2
DIS3: LJMP DIS_3
DIS4: LJMP DIS_4
DIS5: LJMP DIS_5
DIS6: LJMP DIS_6
DIS7: LJMP DIS_6
;******************** 时、分、秒显示
D_GO: MOV DPTR,#TAB1
MOV A,62H
ANL A,#0FH
MOV B,A
MOV A,62H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
CLR P2.0
LCALL DLIM
SETB P2.0
MOV A,B
MOVC A,@A+DPTR
MOV C,07H
MOV acc.0,C ;秒灯闪烁
MOV P1,A
CLR P2.1
LCALL DLIM
SETB P2.1
mov dptr,#TAB2 ;倒装LED字段表
MOV A,61H
ANL A,#0FH
MOV B,A
MOV A,61H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV C,07H
MOV acc.1,C ;秒灯闪烁
MOV P1,A
MOV P1,A
CLR P2.2
LCALL DLIM
SETB P2.2
mov dptr,#TAB1
MOV A,B
MOVC A,@A+DPTR
MOV C,07H
MOV acc.0,C ;闹铃指示灯
MOV P1,A
CLR P2.3
LCALL DLIM
SETB P2.3
MOV DPTR,#TAB1 ;倒装LED字段表
MOV A,60H
ANL A,#0FH
MOV B,A
MOV A,61H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV C,07H
MOV acc.1,C ;秒灯闪烁
MOV P1,A
MOV P1,A
CLR P2.4
LCALL DLIM
SETB P2.4
mov dptr,#TAB1
MOV A,B
MOVC A,@A+DPTR
MOV C,06H
CPL 06H
MOV acc.0,C ;闹铃指示灯
MOV P1,A
MOV P1,A
CLR P2.5
LCALL DLIM
SETB P2.5
D_OUT: SETB TR1
POP PSW
POP ACC
NOP
NOP
RETI
NOP
NOP
AJMP START1
DIS_7: MOV DPTR,#TAB1 ;分秒显示
MOV A,61H
ANL A,#0FH
MOV B,A
MOV A,61H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
CLR P2.0
LCALL DLIM
SETB P2.0
MOV A,B
MOV DPTR,#TAB2
MOVC A,@A+DPTR
CLR C
MOV ACC.0,C
MOV P1,A
CLR P2.1
LCALL DLIM
SETB P2.1
MOV DPTR,#TAB1
MOV A,60H
ANL A,#0FH
MOV B,A
MOV A,60H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
CLR C
MOV ACC.0,C
MOV P1,A
CLR P2.2
CLR P2.2
LCALL DLIM
SETB P2.2
MOV P1,#0FFH
MOV DPTR,#TAB1
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR P2.3
CLR P2.3
LCALL DLIM
SETB P2.3
SETB TR1
POP PSW
POP ACC
NOP
NOP
RETI
NOP
NOP
NOP
LJMP 0000H
DIS_2: mov dptr,#TAB1 ;显示设置小时
MOV 6FH,62H
LCALL BCD_HEX
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A
CLR P2.0
LCALL DLIM
SETB P2.0
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR P2.1
LCALL DLIM
SETB P2.1
SETB TR1
POP PSW
POP ACC
NOP
NOP
RETI
NOP
NOP
LJMP 0000H
;*****************
DIS_3: MOV DPTR,#TAB2 ;显示设置分
MOV 6FH,61H
LCALL BCD_HEX
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A
CLR P2.2
CLR P2.2
LCALL DLIM
SETB P2.2
SETB P2.2
MOV A,B
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P1,A
CLR P2.3
CLR P2.3
LCALL DLIM
SETB P2.3
SETB P2.3
SETB TR1
POP PSW
POP ACC
NOP
NOP
RETI
NOP
NOP
NOP
LJMP 0000H
;*****************
DIS_4: MOV DPTR,#TAB1 ;显示设置闹时
JNB 07H,D4_OUT ;显示时闪烁
MOV P1,#0FFH
MOV 6FH,6BH
LCALL BCD_HEX
MOV B,#0AH
DIV AB
MOVC A,@A+DPTR
MOV P1,A
CLR P2.0
LCALL DLIM
SETB P2.0
MOV P1,#0FFH
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR P2.1
LCALL DLIM
SETB P2.1
MOV P1,#0FFH
D4_OUT: SETB TR1
POP PSW
POP ACC
NOP
NOP
RETI
NOP
NOP
LJMP 0000H
;***********************
DIS_5: MOV DPTR,#TAB2
MOV P1,#0FFH
JNB 07H,D5_OUT ;显示时闪烁
MOV 6FH,6AH ;显示设置闹分
LCALL BCD_HEX
MOV B,#0AH
DIV AB
MOVC A,@A+DPTR
MOV P1,A
MOV P1,A
CLR P2.2
LCALL DLIM
SETB P2.2
MOV DPTR,#TAB1
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR P2.3
LCALL DLIM
SETB P2.3
D5_OUT: SETB TR1
POP PSW
POP ACC
NOP
NOP
RETI
NOP
NOP
LJMP 0030H
DIS_6: MOV DPTR,#TAB1 ;显示设置日月nian
MOV A,66H
ANL A,#0FH
MOV B,A
MOV A,66H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
CLR P2.0
LCALL DLIM
SETB P2.0
MOV A,B
MOVC A,@A+DPTR
CLR C
MOV ACC.0,C
MOV P1,A
CLR P2.1
CLR P2.1
LCALL DLIM
SETB P2.1
MOV P1,#0FFH
MOV DPTR,#TAB2
MOV A,64H
ANL A,#0FH
MOV B,A
MOV A,64H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
CLR P2.2
CLR P2.2
LCALL DLIM
SETB P2.2
MOV DPTR,#TAB1
MOV A,B
MOVC A,@A+DPTR
CLR C
MOV ACC.0,C
MOV P1,A
CLR P2.3
CLR P2.3
LCALL DLIM
SETB P2.3
MOV P1,#0FFH
MOV DPTR,#TAB2
MOV A,63H
ANL A,#0FH
MOV B,A
MOV A,63H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
CLR P2.4
LCALL DLIM
SETB P2.4
MOV DPTR,#TAB1
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR P2.5
CLR P2.5
LCALL DLIM
SETB P2.5
SETB TR1
POP PSW
POP ACC
NOP
NOP
RETI
NOP
NOP
LJMP 0030H
;*****************************
DLIM: MOV 43H,#14H ; every LED(2ms)
DL2: MOV 44H,#14H
DL1: NOP
NOP
DJNZ 44H,DL1
DJNZ 43H,DL2
RET
TAB1: DB 03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,09H
TAB2: DB 03H,0F3H,4AH,62H,0B2H,26H,06H,73H,02H,22H;倒装LED段码表
;**************定时读取数1302及判断*******
P_INT: PUSH ACC
PUSH PSW
INC R2
CJNE R2,#250D,P_OUT
MOV R2,#00H
INC R3
CJNE R3,#10D,P_OUT
MOV R3,#00H
CPL 07H
MOV P1,#0FFH
ACALL R_1302
NOP
ACALL R_1302
NOP
OUT: JNB 06H,P_OUT
MOV 6FH,6BH
LCALL BCD_HEX
MOV B,#10
DIV AB
SWAP A
ADD A,B
CJNE A,62H,PP_OUT
MOV 6FH,6AH
LCALL BCD_HEX
MOV B,#10
DIV AB
SWAP A
ADD A,B
CJNE A,61H,PP_OUT
SETB 08H ;定时到标志
MOV C,06H
CPL C
MOV K_ON,C
NOP
P_OUT: POP PSW
POP ACC
NOP
NOP
RETI
NOP
NOP
LJMP 0000H
PP_OUT: SETB K_ON
CLR 08H
POP PSW
POP ACC
NOP
NOP
RETI
NOP
NOP
LJMP 0000H
;*******有接收遥控信号**********
S_INT: CLR EA
PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
PUSH 02H
PUSH 03H
MOV R6,#10D
SB: ACALL YS1
JB P3.2,EXIT
DJNZ R6,SB
JNB P3.2,$
ACALL YS2
JB P3.2,EXIT
MOV R1,#1AH
MOV R2,#04H
PP: MOV R3,#08H
IIII: JNB P3.2,$
ACALL YS1
NOP
MOV C,P3.2
JNC UUU
JB P3.2,$
UUU: MOV A,@R1
RRC A
MOV @R1,A
DJNZ R3,IIII
INC R1
DJNZ R2,PP
;------解码验证-------
MOV A,1AH
XRL A,#40H;判断遥控低8位
JNZ EXIT
MOV A,1BH
XRL A,#0BFH;高8位是否正确
JNZ EXIT
MOV A,1CH
CPL A
XRL A,1DH;将功1CH和1DH比,不同无效
JNZ EXIT
ACALL DO
EXIT: SETB EA
POP 03H
POP 02H
POP DPL
POP DPH
POP PSW
POP ACC
NOP
NOP
RETI
NOP
NOP
LJMP 0030H
;--------延时-------
YS1: MOV 70H,#20D
D1: MOV 71H,#20D
DJNZ 71H,$
DJNZ 70H,D1
RET
YS2: MOV 70H,#10D ;延时2
D2: MOV 71H,#235D
DJNZ 71H,$
DJNZ 70H,D2
RET
;0CH 为设置标志,0DH为全显示标志,0EH为显示设置小时标志,0FH为显示设置分标志
;10H 为显示设置闹时标志,11H为显示设置闹分标志
;增加闹时静音功能
;mute-10h,timer-0eh,left-46h,right-47h,up-19h,down-1dh
DO: MOV A,1CH
CJNE A,#TIMERT,REDO ;代码不是设置/退出键
JNB 0CH,SET1 ;是,则进入
CLR 0CH ;是,已经进入,则退出
SETB 0DH ;恢复正常显示
CLR 0EH
CLR 0FH
CLR 10H
CLR 11H
CLR 21H
CLR 22H
CLR 13H
CLR 18H
CLR 24H
NOP
NOP
RET
SET1: SETB 0CH
SETB 0EH
CLR 0DH
CLR 0FH
CLR 10H
CLR 11H
CLR 21H
CLR 22H
CLR 13H
CLR 18H
CLR 24H
NOP
NOP
RET
REDO: CJNE A,#MUTEM,SET2D1 ;不是设置键的处理REDO1,2,3,4...
LJMP MUTE ;MUTE?
SET2D1: CJNE A, #FEIMAO,SET2D3
LJMP DFEIMAO
SET2D3: CJNE A,#FANHUI,SET2D4
LJMP SET1302
SET2D4: CJNE A,#RECALL,REDO1
LJMP RECALL2
REDO1: CJNE A,#D_OFF,DO_SET2
LJMP DIS_OFF ;关闭显示
DO_SET2:JB 0CH,SET2 ;时间设置的处理
RET
SET2: CJNE A,#UPU,SET2A
SETB 23H
LJMP INC1;加(^)
SET2A: CJNE A,#DOWND,SET2B
CLR 23H
LJMP INC1;减(-)
SET2B: CJNE A,#RIGHTR,SET2C
LJMP RIGHT; 右移(>)
SET2C: CJNE A,#LEFTL,SET2D
LJMP LEFT; 左移(<)
SET2D: CJNE A,#FANHUI,SET2EXT
LJMP SET1302
SET2EXT:NOP
NOP
RET
RECALL2: CPL 24H ;
CLR 0EH
CLR 0FH
CLR 10H
CLR 11H
&n