|
发表于 2010-3-13 18:05:02
|
显示全部楼层
很好。我也正有此意,想做一两个遥控关机的插座。
为了更方便大家查看,把附件中的程序和图转贴出来,楼主不会介意吧。- ;------EEPROM单元定义---------
- dat equ 0e2h
- drh equ 0e3h
- drl equ 0e4h
- cmd equ 0e5h
- trig equ 0e6h
- contr equ 0e7h
- ;-------外部信号、按键定义-----
- power bit p3.5 ;交流信号------应用时要根据实际电路作相应改动!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- jdq bit p3.7 ;电源继电器------应用时要根据实际电路作相应改动!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- d_key bit p3.3 ;手动键------应用时要根据实际电路作相应改动!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
- s_key bit p3.4 ;学习键------应用时要根据实际电路作相应改动!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
- ;-------程序内部定义-----------
- logo bit 20h.0 ;1为解码完成、0为解码未完成
- kgj bit 21h.0 ;开关机程序标志。0为等待开机,1为等待关机
- sled bit p1.5 ;学习指示灯------应用时要根据实际电路作相应改动!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- pled bit p1.7 ;工作指示灯------应用时要根据实际电路作相应改动!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- dbm equ 42h ;对比码
- jsm equ 52h ;接收码
-
- org 00h
- ajmp main
- org 03h
- ajmp int
- org 30h
- main: mov p1,#0ffh
- mov p3,#0ffh
- clr logo ;红外信号标示位清0
- clr kgj
- lcall read ;把对比值读出
- lcall off_ee ;关闭EEPROM
-
- clr it0 ;下降治触发
- clr ex0 ;开外部中断
- clr ea ;开总中断
- ;********** 主程序 **************
- start: lcall kj ;调用开机程序
- lcall gj ;调用关机程序
- lcall study ;调用学习程序
- ajmp start
- ;======= 0、开机功能部分 =======
- ;寄存器组为0组。rs1=0 rs0=0
- kj: clr rs1
- clr rs0
- jb kgj,kj_out ;开关机标志,0为等待开机,否则退出
- setb ex0 ;先开中断
- setb ea
- kj_0: jb logo,hw ;红外解码标志是否为1,为1表示未解码完成或未收到红外信号
- jnb d_key,dk ;手动键是否按下
- ajmp kj_out
- dk: lcall del_k ;手动键按下,消抖延时
- jb d_key,kj_0
- jnb d_key,$ ;手动键按下未松开
- ajmp p_on
-
- hw: clr ex0
- clr ea
-
- mov a,dbm ;与存储的数值进行对比
- cjne a,jsm,kj_out ;不同则退出
- clr logo ;解码标志位清0
- p_on: clr pled ;开电源指示灯
- clr jdq ;打继电器
- setb kgj ;开关机标志为1,说明开机程序执行完成
-
- kj_out:ret
- ;======= 1、关机功能部分 =======
- ;寄存器组为0组。rs1=0 rs0=0
- gj: clr rs1
- clr rs0
- jnb kgj,gj_out ;开关机标志,1为等待关机,否则退出
- mov r4,#15;
- gj_0: jnb power,gj_1 ;每秒检测1次,若在15秒内,外部电源未开,则闭电源和指示灯。
- lcall del_1s
- djnz r4,gj_0
- setb jdq ;超过15秒,关闭电源和指示灯
- setb pled
- clr kgj ;开关机标志清0,选择等待开机
- ajmp gj_out
-
- gj_1: lcall del_1s ;延时1秒
- setb ex0 ;打开各级中断
- setb ea
- gj_2: jb logo,pd_off
- jb power,off
- ajmp gj_2
- pd_off:clr ea ;关各级中断后对比接收数据
- clr ex0
- mov a,dbm
- cjne a,jsm,gj_out
- clr logo ;解码之后,要将标志位清0
- off: setb jdq
- setb pled
-
- clr ex0 ;关闭各级中断
- clr ea
- jm: mov r4,#15 ;静默15秒,不接收任何信号。
- jm_0: lcall del_1s
- djnz r4,jm_0
- clr kgj
- gj_out:ret
- ;-------开关机电源延时--------------------
- del_1s: mov r7,#100 ;延时子程序,1秒
- d_1s1: mov r6,#100
- d_1s2: mov r5,#100
- d_1s3: djnz r5,$
- djnz r6,d_1s2
- djnz r7,d_1s1
- ret
- ;-------键延时----------------------
- del_k: mov r7,#200
- kk1: mov r6,#200
- kk2: djnz r6,$
- djnz r7,kk1
- ret
-
-
- ;======= 1、学习功能部分 =======
- ;寄存器组为1组。rs1=0 rs0=1
- study: setb rs1
- clr rs0
- st_1: mov r7,#100 ;若在3秒中内松开,则退出
- st_2: mov r6,#100
- st_3: mov r5,#100
- st_4: jb s_key,st_out
- djnz r5,st_4
- djnz r6,st_3
- djnz r7,st_2
-
- st_5: clr sled ;开学习指示灯
- jnb s_key,st_5 ;按键不松开,不向下执行
- st_7: mov r7,#250 ;若在5秒中内未收到红外信号,则退出
- st_8: mov r6,#100
- st_9: mov r5,#100
- st_10: jb logo,st_11
- djnz r5,st_10
- djnz r6,st_9
- djnz r7,st_8
- setb sled ;关闭学习指示灯
- ajmp st_out
- st_11: clr logo ;红外信号接收标志位清0
- clr ex0 ;写入EEPROM前要关闭各中断
- clr ea
- mov dat,jsm ;将接收码送入EEPROM准备单元
- lcall write ;写入
- lcall off_ee ;完成后,关闭
- setb sled ;关闭学习指示灯
- mov dbm,jsm ;学习完成后,要及时更新jsm单元数据,很重要
- setb ex0
- setb ea
- st_out: ret
- ;======= 2、红外解码子程序 =======
- ;寄存器组为2组。rs1=1 rs0=0
- int: push acc
- push psw
- setb rs1
- clr rs0
- clr ex0
- mov r2,#04h
- mov r0,#50h
- i1: jnb p3.2,i2 ;等待 ir 信号出现
- djnz r2,i1
- jmp i_out ;ir信号没出现,退出。
- i2: mov r4,#20
- i20: call del
- djnz r4,i20
- jb p3.2,i1 ;确认ir信号出现
- i21: jb p3.2,i3 ;等 ir 变为高电平
- call del
- jmp i21
- i3: mov r3,#0 ;8位数清为0
- ll: jnb p3.2,i4 ;等 ir 变为低电平
- call del
- jmp ll
- i4: jb p3.2,i5 ;等 ir 变为高电平
- call del
- jmp i4
- i5: mov r2,#0 ;0.14ms 计数
- l1: call del
- jb p3.2, n1 ;等 ir 变为高电平
- ;ir=0,检查r2中的计数值
- mov a,#8
- clr c
- subb a,r2 ;判断高低位
- ;if c=0 bit=0
- mov a,@r0
- rrc a
- mov @r0,a ;处理完一位
- inc r3
- cjne r3,#8,ll ;需处理完8位
- mov r3,#0
- inc r0
- cjne r0,#54h,ll ;收集到4字节了
- mov a,53h ;对接收码进行判断,是否接收完成、正确
- cpl a
- cjne a,52h,i_out
- setb logo ;接收信号完成标志。0为未完成,1为完成
- n1: inc r2
- cjne r2,#30,l1 ;0.14ms 计数过长则时间到自动离开
-
- setb ex0
-
- i_out: pop psw
- pop acc
- reti
- ;---------红外解码延时程序------
- del: mov r5,#1 ;ir解码使用 0.138ms
- del0: mov r6,#2
- del1: mov r7,#67
- del2: djnz r7,del2
- djnz r6,del1
- djnz r5,del0
- ret
- ;=======3、EEPROM操作子程序 ========
- ;---------读取1个字节-------------------
- read: mov drh,#10h
- mov drl,#00h
- mov cmd,#01h
- mov contr,#84h
- mov trig,#046h
- mov trig,#0b9h
- mov dbm,dat
- nop
- nop
- ret
- ;---------写入1个字节-------------------
- write: lcall clear
- mov dat,jsm
- mov drh,#10h
- mov drl,#00h
- mov cmd,#02h
- mov contr,#84h
- mov trig,#046h
- mov trig,#0b9h
- nop
- nop
- ret
- ;---------擦除1个字节-------------------
- clear: mov drh,#10h
- mov drl,#00h
- mov cmd,#03h
- mov contr,#84h
- mov trig,#046h
- mov trig,#0b9h
- nop
- nop
- ret
- ;=========关闭EEPROM====================
- off_ee: mov drh,#00h
- mov drl,#00h
- mov cmd,#00h
- mov contr,#00h
- mov trig,#00h
- ret
- end
复制代码 |
-
|