学校设计有关资料
采用实时时钟芯片DS1302+AT89C2051的红外遥控LED 电子钟
作者:佚名 来源:不详 录入:Admin 更新时间:2008-7-27 13:55:52 点击数:4
【字体:
】
自制LED 电子钟在很多电子报刊杂志上都可以见到,但大多数在断电后都要重新设置时间等 参数,给使用带来很多不便。也有用后备电池作为备用电源的,但往往体积较大。本文介绍 的LED 电子钟克服了以往的弊端,而且采用了家电通用的红外遥控器进行控制,方便使用。 有一路闹铃输出,可以通过遥控器设置闹铃时间及允许与否。
电子钟的正面
电子钟的背面 一.工作原理
DS1302为达拉斯公司的一种实时时钟芯片,主要特点是采用串行数据传输,可为掉电保护电 源提供可编程的充电功能,并且可以关闭充电功能。采用普通32768Hz 晶振。
AT89C2051作为主控芯片,一是对接收到的红外遥控编码进行判断识别,并执行相应的处 理;第二就是定期的读取时钟芯片DS1302中的时间并把小时和肥以示在4位LED 中;第三就是 对设置的闹铃时间与实时时间进行比较,如果时间相同且闹铃允许,那么蜂鸣器就会以1秒 的周期鸣响一分钟,提醒使用者。如果要停止鸣闹,只要按遥控器相应键就可以关闭闹铃。 闹铃时间保存在DS1302自带的RAM 中,不需要单独的EEPROM 。
二.硬件电路
图一为电子钟的原理图,IC2为DS1302,电子爱好者可以向MAXIM 公司索取免费样品。Y2为 32768 Hz石英晶振,可以用普通电子表里的。IC3为三脚的塑封一体化红外接收头。LED1-4 为高亮度共阳数码管。89C2051所用的晶振Y1如果没有10MHz 也可以用其他12M 以内的代替, 只要修改程序中YS1和YS2的延时参数,让其保持延时长度不变就行。调整R2可以改变数码管 亮度。P1口接数码管的八字段。数码管左两位显示小时,右两位显示分,当显示的是闹铃时 间时闪动。第二位和第三位的小数点作为秒闪动,注意第三位数码管按图一布好印制版后安 装时要旋转180°,以便让时和分之间出现“:”,最后一位小数点作为闹铃开关标志,亮表 示闹铃开启。蜂鸣器B2采用小型自带音源的。
要特别说明的是备用电源B1,可以用电池或者超级电容(10万uF 以上)。虽然DS1302在主电 源掉电后,耗电很小,但如果要长时间保证时钟正常,最好选用小型充电电池。可以用老式 电脑主板上的那种3.6V 充电电池。如果断电时间较短(几小时或几天)时,就可以用漏电较 小的普通电解电容代替。100uF 就可以保证1小时的正常走时。DS1302在第一次加电后,须进 行初始化操作。初始化后就可以按正常方法调整时间及闹铃。
三.软件
软件部分的重点是对DS1302的操作以及红外遥控的解码。单片机解码可参看其他文章,这里 主要对设置部分作一些说明:
遥控器采用长虹彩电K11F 型遥控器,遥控器按照16位地址码,8位数据码以及8位数据码的反 码发送。表一列出了各按键的编码及本电子钟对应的动作。如果采用其他遥控器,需对程序 相应部分的编码作修改。
操作方法中,任意是指该键第一次按后,进入该状态,再次按后退出该状态。
时间设置:按“菜单”键进入设置状态,LED 只显示正常时间的小时,按“↑↓”键调整数 值,按“←“、”→”键可在闹铃与正常时间之间移动。任意时刻再次按“菜单”键就退出 设置。
闹铃设置:闹铃时间在时间设置中进行。闹铃允许和取消可在任意时刻按“静音”键。
显示开关:可在任意时刻按“显示”键开启和关闭显示器。
初始化:在按“菜单”键进入设置状态后任意时刻按“日历”键,初始化后的时间为 2002/12/1/12:00:00
;DS1302+AT89C2051的LED 钟
; 遥控器各按键数据码, 可根据不同的遥控器修改对应的键码 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 ; 日历键 DS1302初始化操作
K_on BIT P3.0 ; 闹铃输出 LED1 BIT P3.3 LED2 BIT P3.4
LED3CLK BIT P3.5 ;DS1302
LED4IO BIT P3.7 RST BIT P3.1
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 ;IRF ORG 000BH ;200Us LJMP P_INT ;
ORG 001BH ;display LED LJMP DISPLAY
;**************************** ;main program ORG 0030H START: CLR RST MOV SP,#2AH SETB 05H CLR 06H
SETB 07H;CLR 07H CLR 08H
CLR 09H CLR 0AH CLR 0BH CLR 0CH SETB 0DH CLR 0EH CLR 0FH CLR 10H CLR 11H
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 SETB TR0 SETB TR1 SETB IT0 ; SETB EX0 ; CLR PX0
;LCALL SET1302 ; 初始化
MOV R1,#0C1H ; 取定时参数从1302中 acall T_6061
MOV 6AH,A ;M
MOV R1,#0C3H ACALL T_6061 MOV 6BH,A ;H
MOV 61H,#0 MOV 62H,#0 SETB EA sjmp $
;******************************** DISPLAY: PUSH ACC PUSH PSW
MOV TL1,#0e0H ;wait how long to display (20ms) MOV TH1,#0b0H MOV dptr,#tab1 JB 0EH,DIS2 JB 0FH,DIS3 JB 10H,DIS4 JB 11H,DIS5 JNB 0DH,D_OUT
JNB 08H,D_GO ; 定时到时,显示闪烁 JNB 07H,D_OUT D_GO: MOV DPTR,#TAB1 MOV A,62H ANL A,#0FH MOV B,A MOV A,62H SWAP A ANL A,#07H MOV C A,@A+DPTR
CLR LED1 LCALL DL2M SETB LED1 MOV A,B
MOV C A,@A+DPTR MOV C,07H
MOV acc.7,C ; 秒灯闪烁 MOV P1,A CLR LED2 LCALL DL2M SETB LED2
MOV dptr,#tab2 ; 倒装LED 字段表 MOV A,61H ANL A,#0FH MOV B,A MOV A,61H SWAP A ANL A,#0FH
MOV C A,@A+DPTR
MOV C,07H
MOV acc.6,C ; 秒灯闪烁 MOV P1,A CLR LED3CLK LCALL DL2M SETB LED3CLK
MOV dptr,#tab1
MOV C A,@A+DPTR MOV C,06H cpl c
MOV acc.7,C ; 闹铃指示灯 MOV P1,A CLR LED4IO LCALL DL2M SETB LED4IO D_OUT: SETB TR1 POP PSW POP ACC RETI
;********************* DIS2: AJMP DIS_2 DIS3: AJMP DIS_3 DIS4: AJMP DIS_4 DIS5: AJMP DIS_5 ;********************
DIS_2: MOV dptr,#tab1 MOV 6FH,62H ACALL BCD_HEX MOV B,#10 DIV AB
MOV C A,@A+DPTR MOV P1,A CLR LED1 LCALL DL2M SETB LED1
; 显示设置小时
MOV C A,@A+DPTR MOV P1,A CLR LED2 LCALL DL2M SETB LED2
SETB TR1 POP PSW POP ACC RETI
;*****************
DIS_3: MOV DPTR,#TAB2 MOV 6FH,61H ACALL BCD_HEX MOV B,#10 DIV AB
MOV C A,@A+DPTR MOV P1,A CLR LED3CLK LCALL DL2M SETB LED3CLK MOV A,B
MOV DPTR,#TAB1 MOV C A,@A+DPTR MOV P1,A CLR LED4IO LCALL DL2M SETB LED4IO
; 显示设置分
SETB TR1 POP PSW POP ACC RETI
;*****************
DIS_4: MOV dptr,#tab1 ; 显示设置闹时 JNB 07H,D4_OUT ; 显示时闪烁 MOV A,6BH MOV B,#0AH DIV AB
MOV C A,@A+DPTR MOV P1,A CLR LED1 LCALL DL2M SETB LED1 MOV A,B
MOV C A,@A+DPTR MOV P1,A CLR LED2 LCALL DL2M SETB LED2 D4_OUT: SETB TR1 POP PSW POP ACC RETI
;*********************** DIS_5: MOV DPTR,#TAB2
JNB 07H,D5_OUT ; 显示时闪烁 MOV A,6AH ; 显示设置闹分
MOV B,#0AH
DIV AB
MOV C A,@A+DPTR
MOV P1,A
CLR LED3CLK
LCALL DL2M
SETB LED3CLK
MOV DPTR,#TAB1
MOV A,B
MOV C A,@A+DPTR
MOV P1,A
CLR LED4IO
LCALL DL2M
SETB LED4IO
D5_OUT: SETB TR1
POP PSW
POP ACC
RETI
;*****************************
DL2M: MOV 43H,#14H ; every LED(2ms)
DL2: MOV 44H,#14H
DL1: NOP
NOP
DJNZ 44H,DL1
DJNZ 43H,DL2
RET
;************************定时读取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
OUT: JNB 06H,P_OUT
MOV A,6BH
MOV B,#10
DIV AB
SWAP A
ADD A,B
CJNE A,62H,PP_OUT
MOV A,6AH
MOV B,#10
DIV AB
SWAP A
ADD A,B
CJNE A,61H,PP_OUT
SETB 08H ; 定时到标志
MOV C,07H
cpl c
MOV K_ON,C
P_OUT: POP PSW
POP ACC
RETI
PP_OUT: SETB K_ON
CLR 08H
POP PSW
POP ACC
RETI
;************************有接收到遥控器信号*******
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,#4D
PP: MOV R3,#8D
JJJJ: JNB P3.2,$
ACALL YS1
MOV C,P3.2
JNC UUU
JB P3.2,$
UUU: MOV A,@R1
RRC A
MOV @R1,A
DJNZ R3,JJJJ
INC R1
DJNZ R2,PP
;-------------------------------------
MOV A,1AH ;
XRL A,#40h ; 判断1AH 的值是否等于遥控器低8位地址(40h )
JNZ EXIT ;
MOV A,1bH
XRL A,#0bfh ; 再判断高8位地址是否正确(0bfh )
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
RETI
;--------------------delay-----------------------
YS1: MOV 70H,#16D ; 延时1
D1: MOV 71H,#21D
DJNZ 71H,$
DJNZ 70H,D1
RET
YS2: MOV 70H,#09D ; 延时2
D2: MOV 71H,#220D
DJNZ 71H,$
DJNZ 70H,D2
RET
;---------------------------------------------------------
TAB: DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H ;TAB1 LED 数码管显示表 TAB 遥控器键值表(未用)
;TAB1: DB 3FH,11H,5EH,5BH,71H,6BH,6FH,19H,7FH,7bH,77H,7CH,39H,5EH,79H,71H tab1: DB 0C0H,0F9H,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0a7h,0a1h,86h,8EH TAB2: DB 0c0H,0f9H,64H,70H,59H,52H,42H ; 倒装LED 段码表
;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
RET
SET1: SETB 0CH
SETB 0EH
CLR 0DH
CLR 0FH
CLR 10H
CLR 11H
RET
REDO: CJNE A,#MUTEM,REDO1 ; 不是设置键的处理REDO1,2,3,4... LJMP MUTE ;MUTE?
REDO1: CJNE A,#D_OFF,DO_SET2 LJMP DIS_OFF ; 关闭显示 DO_SET2:JB 0CH,SET2 ; 时间设置的处理 RET
SET2: CJNE A,#UPU,SET2A
LJMP INC1 ;+加(^)
SET2A: CJNE A,#DOWND,SET2B
LJMP DEC2 ;- 减
SET2B: CJNE A,#RIGHTR,SET2C
LJMP RIGHT ;RIGHT 右移(>) SET2C: CJNE A,#LEFTL,SET2D
LJMP LEFT ;LEFT 左移(
SET2D: CJNE A,#RECALL,SET2EXT ;DS1302初始化 LJMP SET1302
SET2EXT:RET
;--------------------------------INC------------------------ INC1: JB 0EH,INCH
JB 0FH,INCM
JB 10H,INC_H
JB 11H,INC_M
RET
INC_H: INC 6BH ; 闹钟小时增加 MOV A,6BH
CJNE A,#24D,INCH3
MOV 6BH,#0
INCH3: MOV R1,#0C2H
MOV R0,6BH
ACALL SETONE ; 写入DS1302 RET
INC_M: INC 6AH ; 闹钟分增加 MOV A,6AH
CJNE A,#60D,INCH4
MOV 6AH,#0
INCH4: MOV R1,#0C0H
MOV R0,6AH
ACALL SETONE ;
RET
INCH: ;INC 62H ;
MOV 6FH,62H
ACALL BCD_HEX
INC A
CJNE A,#24D,INCH1
MOV A,#0
INCH1: MOV 6FH,A
ACALL HEX_BCD
MOV 62H,A
MOV R1,#84H
MOV R0,62H
ACALL SETONE ;
RET
INCM: ;INC 61H ;
MOV 6FH,61H
ACALL BCD_HEX
INC A
CJNE A,#60D,INCH2
MOV A,#0
INCH2: MOV 6FH,A
ACALL HEX_BCD
MOV 61H,A
MOV R1,#82H
MOV R0,61H
ACALL SETONE ;
RET
;----------------------------------DEC---------------------- DEC2: JB 0EH,DECH
JB 0FH,DECM
JB 10H,DEC_H
JB 11H,DEC_M
RET
DECH: MOV 6FH,62H
ACALL BCD_HEX
DEC A
CJNE A,#0FFH,DECH1
MOV A,#23
DECH1: MOV 6FH,A
ACALL HEX_BCD
MOV 62H,A
MOV R1,#84H
MOV R0,62H
ACALL SETONE
RET
DECM: MOV 6FH,61H
ACALL BCD_HEX
DEC A
CJNE A,#0FFH,DECM1
MOV A,#59
DECM1: MOV 6FH,A
ACALL HEX_BCD
MOV 61H,A
MOV R1,#82H
MOV R0,61H
ACALL SETONE
RET
DEC_H: DEC 6BH
MOV A,6BH
CJNE A,#0FFH,DECH3
MOV 6BH,#23D
DECH3: MOV R1,#0C2H
MOV R0,6BH
ACALL SETONE
RET
DEC_M: DEC 6AH
MOV A,6AH
CJNE A,#0FFH,DECH4
MOV 6AH,#59D
DECH4: MOV R1,#0C0H
MOV R0,6AH
ACALL SETONE
RET
;--------------------------------RIGHT---------------------- RIGHT: JB 0EH,RIGHT1
JB 0FH,RIGHT2
JB 10H,RIGHT3
JB 11H,RIGHT4
RET ; 右移
RIGHT1: CLR 0EH
SETB 0FH
RET
RIGHT2: CLR 0FH
SETB 10H
RET
RIGHT3: CLR 10H
SETB 11H
RET
RIGHT4: CLR 11H
SETB 0EH
RET
;--------------------------------LEFT-----------------------
LEFT: JB 0EH,LEFT1
JB 0FH,LEFT2
JB 10H,LEFT3
JB 11H,LEFT4
RET ; 左移
LEFT1: SETB 11H
CLR 0EH
RET
LEFT2: SETB 0EH
CLR 0FH
RET
LEFT3: SETB 0FH
CLR 10H
RET
LEFT4: SETB 10H
CLR 11H
RET
;------------------------------MUTE-------------- MUTE: setb k_ON
CPL 06H ; 静音
CLR 08H
RET
;-----------------------------DISPLAY OFF-------- DIS_OFF:CLR ET1
CPL 05H
JNB 05H,REDORE
SETB ET1
REDORE: RET
;------------------------------------初始化1302-------------------------
SET1302: CLR RST ;2002年1月1日12:00:00 CLR LED3CLK
MOV SECOND,#0
MOV 61H,#0
MOV 62H,#18 ;
MOV 63H,#1
MOV 64H,#1
MOV 65H,#1
MOV 66H,#2
SETB RST
MOV A,#8EH
LCALL R_BIT
MOV A,#00H
LCALL R_BIT
SETB LED3CLK
CLR RST
MOV R0,#SECOND
MOV R7,#7
MOV R1,#80H
SET1302A:CLR RST
CLR LED3CLK
SETB RST
MOV A,R1
LCALL R_BIT
MOV A,@R0
LCALL R_BIT
INC R0
INC R1
INC R1
CLR RST
DJNZ R7,SET1302A
CLR RST
CLR LED3CLK
sETB LED3CLK
nop
CLR RST
nop
clr led3clk
SETB RST
MOV A,#90H
LCALL R_BIT
MOV A,#10100101B ; 充电器设置 LCALL R_BIT
SETB LED3CLK
CLR RST
CLR LED3CLK
SETB RST
MOV A,#8EH
LCALL R_BIT
MOV A,#80H
LCALL R_BIT
SETB LED3CLK
CLR RST
RET
;----------------------读取一RAM ------ T_6061: CLR RST
SETB RST
MOV A,R1
LCALL R_BIT
LCALL W_BIT
SETB LED3CLK
CLR RST
RET
;-----------------------------
R_1302: MOV R0,#SECOND MOV R7,#7
MOV R1,#81H
R_1302A: CLR RST
CLR LED3CLK
SETB RST
MOV A,R1
LCALL R_BIT
LCALL W_BIT
MOV @R0,A
INC R0
INC R1
INC R1
SETB LED3CLK
CLR RST
DJNZ R7,R_1302A
RET
;------------------R_BIT------------------ R_BIT: MOV R4,#8
R_BIT1: RRC A
SETB LED3CLK
CLR LED3CLK
DJNZ R4,R_BIT1
RET
;-------------------W_BIT----------------------- W_BIT: MOV R4,#8
W_BIT1: MOV C,LED4IO RRC A
SETB LED3CLK
CLR LED3CLK
DJNZ R4,W_BIT1
RET
;-------------------------------------------------- BCD_HEX:
MOV A,6FH
ANL A,#0FH
MOV B,A
MOV A,6FH
MOV 6FH,B
SWAP A
ANL A,#0FH
MOV B,#0AH
MUL AB
ADD A,6FH
; MOV 6FH,A
RET
HEX_BCD:
MOV A,6FH
DIV AB
SWAP A
ADD A,B
; MOV 6FH,A
RET
;-----写一地址---R1 为地址,R0 为数据---------- SETONE: CLR LED3CLK CLR RST
CLR LED3CLK NOP
SETB RST
MOV A,#8EH
LCALL R_BIT
MOV A,#00H
LCALL R_BIT
SETB LED3CLK CLR RST
CLR LED3CLK NOP
CLR RST
CLR LED3CLK SETB RST
MOV A,R1
LCALL R_BIT
MOV A,R0
LCALL R_BIT
NOP
SETB LED3CLK
NOP
NOP
CLR RST
CLR LED3CLK SETB RST MOV A,#8EH LCALL R_BIT MOV A,#80H LCALL R_BIT SETB LED3CLK CLR RST RET