基于DS1302+AT89C2051制作的红外遥控LED电子

基于ds1302+at89c2051制作的红外遥控led电子钟
自制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
点击文件名下载 代码.rar
;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_g mov dptr,#tab1
mov a,62h
anl a,#0fh
mov b,a
mov a,62h
swap a
anl a,#07h
movc a,@a+dptr
mov p1,a
clr led1
lcall dl2m
setb led1
mov a,b
movc 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
movc a,@a+dptr
mov c,07h
mov acc.6,c ;秒灯闪烁
mov p1,a
clr led3clk
lcall dl2m
setb led3clk
mov dptr,#tab1
mov a,b
movc 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
movc a,@a+dptr
mov p1,a
clr led1
lcall dl2m
setb led1
mov a,b
movc 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
movc a,@a+dptr
mov p1,a
clr led3clk
lcall dl2m
setb led3clk
mov a,b
mov dptr,#tab1
movc 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
movc a,@a+dptr
mov p1,a
clr led1
lcall dl2m
setb led1
mov a,b
movc 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
movc a,@a+dptr
mov p1,a
clr led3clk
lcall dl2m
setb led3clk
mov dptr,#tab1
mov a,b
movc 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
d 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
red 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
setb led3clk
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
clr led3clk
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
mov led4io,c
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
mov b,#10
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
clr rst
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

提供基于MikroSDK 2.0的GSDK扩展支持以简化第三方硬件集成设计
7 FPGA大数据互联及视频系统开发板
钢丝绳漏磁法检测方法
NFC生态环境渐成熟 行业壁垒成障碍
AI智能语音控制系统
基于DS1302+AT89C2051制作的红外遥控LED电子
【应用场景】安科瑞预付费产品在商业综合体行业的应用
什么是单面印刷电路板?
医疗电气设备接地注意事项
可调直流电源的制作方法是怎样的
能与华为荣耀8比美的魅蓝X,清仓降5百多,为新旗舰魅族Pro7造势
手机的NFC功能除了刷公交车到底还有那些功能
PCB各种表面处理的优缺点分析
达芬奇开拓手术机器人市场,并且几乎垄断
自动驾驶汽车凭啥成为杀手应用?有数据平台在背后撑腰
一加手机5详细配置曝光,残暴无人性,搭载骁龙835,全玻璃机身!
QORVO推出MMIC功率放大器突破功率屏障
采用MAXQ2000实现与MAX1169的高速I²
CIC插值滤波器与直接频率合成器DDS的FPGA实现
数字功放与模拟功放的分析