单片机遥控控制酒店客房灯光系统_secret_第1页
单片机遥控控制酒店客房灯光系统_secret_第2页
单片机遥控控制酒店客房灯光系统_secret_第3页
单片机遥控控制酒店客房灯光系统_secret_第4页
单片机遥控控制酒店客房灯光系统_secret_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机遥控控制酒店客房灯光系统 摘 要:本文通过老式酒店客房灯光控制系统进行改造,将原机的机械开关控制改为单片 机红外线遥控控制,说明了单片机在现代酒店灯光智能控制中的适用性、灵活性、先进性。 通过对客房灯光控制电路改造后,大大提高了客人的使用舒适感,使酒店的硬件设施提高 了一个台阶。 关键字:单片机 遥控 客房灯光 前言:酒店原有的智能控制系统较周边新开张酒店相比,已跟不上潮流,失去竞争能 力。例如原来酒店客房灯光控制系统均采用 TCL2.0 系列产品,房间的电视、台灯、地灯、 鱼缸照明、夜灯、廊灯、吧台灯等开关与床头灯调光开关均集中安装在床头柜处(如图 1)。由于开关较多且固定在床头柜侧面,客人想开灯时必须先看清开关下面的标记才能正 确开灯,有时为开一盏灯竟把所有的开关都按了一遍,使用时极为不便。现在大多数星级 酒店都采用微动开关轻触式集中控制面板,安装在床头柜的正上方。虽然较以前直观,但 是开关多且固定仍不是十分方便。本人采用 8051 系列单片机将原来固定的机械式开关改用 遥控控制,这样一个遥控器就可以控制整个房间的灯光开启,电源控制箱可以放在床头柜 内;遥控器在放置在床头柜上,可以任意移动,还可以在遥控面板中间加装一液晶时钟 (如图 2 所示)。美观且实用即大方便客人的使用。 图 1 老式控制柜 图 2 新式遥控发射器 一 硬件电路的设计 1、 遥控发射电路 如图 3 所示,为该系统遥控发射器电原理图,其中 P1 口作为键盘扫描端口,具有 16 个操作键,可分别控制单片机发出 16 种不同脉冲,执行 16 种操作。第 9 脚为单片机的复 位脚,采用 RC 上电复位电路;15 脚作为红外线遥控码的输出口,用于输出 38KHz 载波编 码。脉冲经 9013 放大然后由红外发射管输出;18、19 脚接 12M 晶振。P1.4P1.7 需接上 拉电阻。 图 3 遥控发射电路图 2、 遥控接收电路 如图 4 所示,为该系统遥控接收电原理图,其中 P1.0P1.2 口作为数码管的二进制 数据输出,显示数字为“0 7”,“0”表示最暗,“7”表示最亮,采用带锁存功能的七 段译码电路 74HC4511 集成块译码显示数值。4511 的 LE 端接 8051 的 30 脚(地址锁存允许 控制); P0.0P0.7 以及 P2.2P2.7 作为 14 个电器的电源控制输出,接口用继电器隔离输出。 P2.0 口为调光脉冲输出,输出脉冲由三极管 9012 放大后经光电耦合器 MOC3021 驱动双向可 控硅控制负载;P3.0 口为交流 50Hz 同步检测输入。系统对市电进行变压、整流、并经施 密特触发器整形后得到 100Hz 的方波(周期 10ms),作为发送调光脉冲的同步信号,系统 采用 10ms 为一个“单位时间”的长度,灯的亮度越高,则可控硅导通时间的占空比越大; P3.1 口为红外遥控码输入,采用集成红外线接收路 SFH506-38,此集成元件体积小、抗干 扰性好、灵敏度高、并且价格低廉。它仅有三个脚,分别是电源正极、电源负极以及信号 输出端,其工作电压为 5V 左右,它的主要功能包括放大、选频、解调几大部分,要求输入 是已经被调制的信号,经过它的接收放大和解调会在输出端直接输出原始信号至 P3.1 脚。 这款红外线接收电路接收距离可以达 8 米左右,完全可以满足客房内的遥控距离(一般客 房标准间都在 30 平米左右);P3.2 脚为外部中断 0 输入脚,采用下降沿触发,当有信号 时,第一位码的低电平启动中断程序,实时接收数据帧。第 9 脚为单片机的复位脚,采用 RC 上电复位电路;18、19 脚接 12M 晶振。 图 4 遥控接收电路图 二 系统的遥控功能实现方法 1、 遥控编码格式 该遥控器采用脉冲个数编码,不同的脉冲个数代表不同的码,最小为 2 个脉冲,最大 为 17 个脉冲。为了使接收可靠,第一位码宽为 3ms,其余为 1ms,遥控数据帧间隔大于 10ms,如 图 5 所示。 图 5 遥控脉冲编码图 2、 遥控码的发射 当某个操作键按下时,单片机先读出该键值,然后根据键值设定的遥控脉冲个数,再 调制成 38KHz 的方波由红外线发射管发射出去。P3.5 端口的输出调制波如图 5 所示。 3、 数据帧的接收处理 当红外线接收器输出脉冲帧数据时,第一位码的低电平将启动中断程序,实时接收数 据帧。在数据接收时,先对第一位(起始位)码的码宽进行验证。若第一位低电平码的脉 宽小于 2ms,将作为错误码处理;否则认为是起始码,累加器 A 加 1。当间隔位的高电平大 于 3ms 时,结束接收,然后根据累加器 A 中的脉冲个数,执行相应的输出操作。图 6 为红 外线接收器输出的一帧遥控码波形图。 图 6 一帧遥控码波形图 三 遥控发射及接收控制程序流程图 1、 遥控发射程序控制流程图 图 7 遥控发射控制流程图 2、 遥控接收程序控制流程图 图 8 遥控接收控制流程图 四 主要程序分析 1、 键盘扫描程序 本电路采用 44 矩阵式键盘电路,共 16 个按健开关可发送 16 种编码指令。首先将 立即数#0F0H 送至 P1 口,再读入 P1 口值与#0F0H 相比较,相等则说明没有键按下,返回。 不相等则表示有键按下,再调用延时消抖程序,确认有键按下。转至行扫描程序确认按键 所在的行,并将 R2 赋行号初值,然后调用列扫描程序确认按键所在例号。例号与行号初值 相加即得按键号(送寄存器 A)。 KEYWORK: MOV P1,#0F0H ;置 P1 口输入状态 MOV A,P1 ;读入 P1 口值 MOV B,A ;P1 口值暂存 B 中 CJNE A,#0F0H,KEYHIT ;不等于#0FFH,转 KEYHIT(有键按下) KEYOUT: RET ;没有键按下返回; KEYHIT: LCALL DL10MS ;延时去抖动 MOV A,P1 ;再读入 P1 口值至 A CJNE A,B,KEYOUY ;A 不等于 B(是干扰),子程序返回 SETB P1.1 ;有键按下,找键号开始,查 0 行 SETB P1.2 SETB P1.3 MOV A,P1 ;读入 P1 口值 CJNE A,#0FEH,KEYVAL0 ;P1 不等于#0FEH,按下键在第 0 行 SETB P1.0 ;不在第 0 行,开始查 1 行 CLR P1.1 MOV A,P1 ;读入 P1 口值 CJNE A,#0FDH,KEYVAL1 ;P1 口不等于#0FDH,按下键在第 1 行 SETB P1.1 ;不在第 1 行,开始查 2 行 CLR P1.2 MOV A,P1 ;读入 P1 口值 CJNE A,#0FBH,KEYVAL2 ;P1 口不等于#0FBH,按下键在第 2 行 SETB P1.2 ;不在第 2 行,开始查 3 行 CLR P1.3 MOV A,P1 ;读入 P1 口值 CJNE A,#0F7H,KEYVAL3 ;P1 口不等于#0F7H,按下键在第 3 行 LJMP KEYOUT ;不在第 3 行,子程序返回 KEYVAL0: MOV R2,#00H ;按下键在第 0 行,R2 赋行号初值 0 LJMP KEYVAL4 ;跳到 KEYVAL4 KEYVAL1: MOV R2,#04H ;按下键在第 1 行,R2 赋行号初值 4 LJMP KEYVAL4 ;跳到 KEYVAL4 . . KEYVAL4: MOV DPTR,#KEYVALTAB ;翻译成连续数字 MOV B,A ;P1 口值暂存 B 内 ANL B,#0F0H ;取高四位 MOV R0,#0 ;清 R0 KEYVAL5: MOV A,R0 ;查列号开始,R0 数据放入 A SUBB A,#04H ;A 中数减 4 JNC KEYOUT ;借位 C 为 0,查表出错,返回 MOV A,R0 ;查表次数小于 4,继续查, MOVC A,A+DPTR ;查列号表 INC R0 ;R0 加 1 CJNE A,B,KEYVAL5 ;查得值和 P1 口值不等,转 KEYVAL5 再 查 DEC R0 ;查得值和 P1 口值相等,R0 减 1 MOV A,R0 ;放入 A(R0 中数值即为列号值) ADD A,R2 ;与行号初值相加成为键号值(0-15) KEYVALTAB: DB 0E0H,0D0H,0B0H,07H ;列号对应数据表 ;对应列号: 0 1 2 3 2、 键号处理程序 根据寄器 A 中的键号,首先执行 A3 程序,(因为以下所执行的长跳转指令 “LJMP”为 3 字节指令)然后使用散转指令“JMP A,A+DPTR”跳到相应的程序标号。各 键号相应的程序标号均为一条长跳转指令,各跳转指令均指向与之相应的红外线脉冲赋值 程序,最后跳转至脉冲发送程序,发出与键号相对应的脉冲。 MOV B,A ;键号乘 3 处理用于 JMP 散转指令 RL A ;键号乘 3 处理用于 JMP 散转指令 ADD A,B ;键号乘 3 处理用于 JMP 散转指令 MOV DPTR,#KEYFUNTAB ;取散转功能程序(表)首址 JMP A+DPTR ;散转至对应功能程序标号 KEYFUNTAB: LJMP KEYFUN00 ;跳到键号 0 对应功能程序标号 LJMP KEYFUN01 ;跳到键号 1 对应功能程序标号 . . . LJMP KEYFUN15 ;跳到键号 15 对应功能程序标号 RET KEYFUN00: MOV A,#02H ;发 2 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN01: MOV A,#03H ;发 3 个脉冲 LJMP REMOTE ;转发送程序 RET . . . KEYFUN15: MOV A,#11H ;发 17 个脉冲 LJMP REMOTE ;转发送程序 RET 3、38KHz 载波及编码脉冲发射程序 本系统所用的红外线接收集成电路 SFH506-38 的解调中心频率为 38KHz,故发射频率也 采用 38KHz,通过定时器中断程序实现,每次溢出中断时对 P3.5 取反,输出 38KHz 载波。 计算得周期为 26.3us,则定时器设定为模式 2,初值为(256-13)=0F3H。利用 1ms 与 3ms 延时程序控制定时器的启停,从而控制 P3.5 发出相应的脉冲。并根据寄存器 A 中的脉 冲个数确定发送次数。 MOV IE,#00H ;关所有中断 MOV TMOD,#20H ;8 位自动重装初值模式 MOV TH1,#0F3H ;定时为 13 微秒初值 MOV TL1,#0F3H SETB EA ;开总中断允许 INTT1: CPL P3.5 ;38kHZ 红外线遥控信号产生 RETI ;中断返回 REMOTE: MOV R1,A ;装入发射脉冲个数 LJMP OUT3 ;转第一个码发射处理 OUT: MOV R0,#64H ;1MS 宽低电平发射控制数据 OUT1: SETB ET1 ;开 T1 中断 SETB TR1 ;开启定时器 T1 NOP ;延时 NOP NOP NOP NOP DJNZ R0,OUT1 ;时间不到转 OUT1 再循环 MOV R0,#3CH ;1MS 高电平间隙控制数据 OUT2: CLR TR1 ;关定时器 T1 CLR ET1 ;关 T1 中断 CLR P3.5 ;关脉冲输出 NOP ;空操作延时 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DJNZ R0,OUT2 ;时间不到转 OUT2 再循环 DJNZ R1,OUT ;脉冲未发完,转 OUT 再循环发射 LCALL DL500MS RET OUT3: MOV R0,#0FFH ;装发谢 3MS 宽控制数据 LJMP OUT1 ;转 OUT1 4、遥控接收及处理程序 采用中断接收,经过红外线接收集电路 SFH506 接收处理后的脉冲信号送至 P3.1 与 P3.2(中断输入脚,采用低电平触发),当接收到第一个低电平时将启动中断程序,实时 接收数据帧,接收程序首先采用 8us 循环计时程序对第一位码(起始码)的码宽进行验证, 当计时大于 82552040us 时则认为是起始码,开始对输入的脉冲进行计数与校验,将计 数值送到累加 A 中。脉冲高电位大于设定时间 5136=3072us 时则结束接收,然后根据累 加器中的脉冲个数,跳转至相应的操作子程序。215 个脉冲所对应程序分别控制每盏 灯的开关,通过将相应输出端口取反方法,从而控制了灯的亮灭,系统上电时所有输出 I/O 口均为“1”(高电平)外接晶体管均无输出,当某个按键按下时,程序将相应端口取 反,输出为“0”(低电平)外接晶体管放大后,驱动继电器继合亮灯。再次按下该键时, 程序再次将该相应端口取反,输出为“1”关灯,如此便控制了每一路灯的亮、灭。16、17 个脉冲为亮度调整信号,接收到该脉冲信号时,将 P1 口加“1”(调亮)或减“1”(调暗) ,然后再调亮度调整程序,亮度调整程序根据 P1 口的值确定灯的亮度。 INTEX0: CLR EX0 ;关外中断 JNB P3.1,READ1 ;P3.1 口为低电平转 READ1 READOUTT0: SETB EX0 ;P3.1 口为高电平开中断(系干扰) RETI ;退出中断 READ1: CLR A ;清 A MOV DPH,A ;清 DPTR MOV DPL,A HARD1: JB P3.1,HARD11 ;P3.1 变高电平转 HARD11 INC DPTR ;用 DPTR 对低电平计数 NOP ;1 微秒延时 NOP NOP AJMP HARD1 ;转 HARD1 循环(循环周期为 8 微秒) HARD11: MOV A,DPH ;DPTR 高 8 位放入 A JZ READOUTT0 ;为 0(脉宽小于 8*255=2 毫秒)退出 CLR A ;不为 0,说明是第一个宽脉冲(3 毫秒) READ11: INC A ;脉冲个数计 1 READ12: JNB P3.1,READ12 ;低电平时等待 MOV R1,#06H ;高电平宽度判断定时值 READ13: JNB P3.1,READ11 ;变低电平时转 READ11 脉冲计数 LCALL DELAY ;延时(512 微秒) DJNZ R1,READ13 ;6 次延时不到转 READ13 再延时 DEC A ;超过 3 毫秒判为结束,减 1 DEC A ;减 1 JZ FUN0 ;为 0 执行 FUN0(2 个脉冲) DEC A ;减 1 . . . FUN0: CPL P0.0 ;P0 口各端口开关输出控制 LJMP READOUTT0 ;转中断退出 FUN1: CPL P0.1 LJMP READOUTT0 . . . FUN14: INC P1 MOV A,P1 CJNE A,#00H,OUTT0 ;不等转 OUTT0(显示值大于 7) MOV P1,#0FFH ;放回 P1(显示值为 7) OUTT0: LCALL LOOP ;亮度调整 LJMP READOUTT0 ;中断退出 FUN15: DEC P1 ;P1 口值减 1 MOV A,P1 ;移入 A CJNE A,#0F7H,OUTT1 ;不等转 OUTT1(显示值小于 0) MOV P1,#0F8H ;放回 P1(显示值为 0) OUTT1: LCALL LOOP ;亮度调整 LJMP READOUTT0 ;中断退出 . . . 5、 调光程序 系统调光电路采用双向可控硅,利用它的“过零自动关闭”特性,AT89C51 只需在每 个交流信号的 1/2 周期(10ms)内控制可控硅打开的时刻,由于交流电过零点时可控硅自 动关断,即间接控制了灯光的亮度。上电时,首先调用调光程序,根据 P1 口值设定延时值 并放在寄存器 B 中。再根据 P3.0 输入的交流同步信号,确定调光脉冲的发送时间,当交流 信号过零时调用调光程序,调光程序根据寄存器 B 中的值确定延时次数(每次延时 512us)从而确定调光脉冲的发送时间,延时到 P2.0 置“0”经过外接晶体管反向放大后经 光电耦合器隔离驱动双向可控硅导通的时间,当交流信号再次过零时,双向可控硅自动关 闭,再次调用调光程序。这样便控制了双向可控硅的导通时间,从而达到调光的目的。 START: LCALL CLEARIO ;上电初始化 LCALL LOOP ;调用调光控制程序 MAIN: JB P3.0,MAIN ;50HZ 交流电未过零转 MAIN LCALL DLX ;过零点时调用延时子程序(延时可变) CLR P2.0 ;发调光脉冲 LCALL DELAY ;持续 512 微秒 SETB P2.0 ;关调光脉冲 LJMP MAIN ;转 MAIN 循环 DLX: MOV R2,B ;置延时初值 DLX1: LCALL DELAY ;调 512 微秒延时子程序 DJNZ R2,DLX1 ;循环控制 RET ;返回 LOOP: MOV A,P1 ;读入 P1 口值 SUBB A,#0FFH ;比较 JZ LOOP7 ;值为#0FFH(显示 7)时转 LOOP7 MOV A,P1 SUBB A,#0FEH JZ LOOP6 ;值为#0FEH(显示 6)时转 LOOP6 MOV A,P1 . . . RET LOOP7: MOV B,#01H ;设置延时值#01H(最亮) RET ;返回 LOOP6: MOV B,#02H ;设置延时值#02H(次亮) RET ;返回 LOOP5: MOV B,#04H . . . RET 6、 延时子程序 采用循环结构实现 513 微秒、10 微秒、500 微秒延时功能。 DELAY: MOV R2,#0FFH ;513 微秒延时程序 DELAY1: DJNZ R2,DELAY1 RET DL10MS: MOV R3,#14H ;10 毫秒延时程序 DL10MS1: LCALL DELAY DJNZ R3,DL10MS1 RET DL500MS: MOV R4,#32H ;500 毫秒延时程序 DL500MS1: LCALL DL10MS DJNZ R4,DL500MS1 RET 五、系统调试 上电,测试发送板单片机各 IO 口电平,P3.5、P1.0、P1.1、P1.2、P1.3 均为低电平, 其余均为高电平,表明单片机上电复位正常,且程序运行正常。然后用万用表毫伏档测量 红外线发射管两端,同时按各输入键,表针应有左右摆动现像,则表明键扫描程序与红外 线发射程序运行正常,且在发射红外线脉冲。 接收电路上电时,数码管显示“7”各继电器及可控硅均无输出。遥控信号输入脚 P3.1 应 高电平。则表明单片机上电复位正常,外围电路接线正确。然后将发射板红外线发射管对 准接收电路,按压输入键,同时用万用表测量 P3.1 脚,应有轻微摆动。红外脉冲接收正常。 且相应输出继电器应动作,或调光电路应正确动。如无动作或万用有针无摆动,可以稍为 改动发射脉冲频率,将定时器初值改为(0FFH-12)=0F4H 对应发射频率为 41.7KHz 或 (0FFH-13)=0F3H 对应发射频率为 38.5KHz,因为红外线发射与接收电路的中心频率相差 1KHz 时大都能正常遥控,相差 2KHz 以上会出现遥控失灵现象。大多晶振或接收电路都有 一定的频率偏差,我们可以调整定时器的初值来稍为改动发射频率或换用 12M 晶振,直到 能够接收为止。调光程序调试,按调光键,调至显示“0” ,此时灯为最暗,应熄灭。否则 可以改变调光程序中寄存器 B 中的值,加长或减少延时时间,使灯能在最低亮度时能正常 熄灭,最高亮度时能达最大亮度。按本程序中的值,实测数据如下。 延时子程序为 512us,电源交流电压 227V 灯光亮度显示 负载电压(60W) 灯光亮度显示 负载电压(60W) 0 2V 4 102V 1 20V 5 135V 2 47V 6 168V 3 73V 7 216V 六、结束语 通过此次改造,利用单片机遥控控制房间灯光取得了良好的效果,使酒店的硬件服务 水平提高了一个台阶。同时也应总结经验,逐步完善客房灯光智能控制,例如可以增加房 间灯具的自动巡检与电脑联网功能,灯具故障即可自动发出报修信号,服务人员可以通过 主服务器方便的了解各个房间电气设备工作情况,即提高了工作效率又方便管理。也体会 到我的知识面还是很狭窄,作为从事电气工作的技术人员,在学好本专业的基础前提下, 还要不断的学习其他领域的科学技术知识,拓宽自己的知识面,才能胜任新设备、新技术 的工作,更好发挥本专业的作用。 本人因水平、经验有限,文中难免有错漏以及不足之处,恳请专家、教授及同行批评 指正。 七、附录 1、 遥控发射电路原理图 附图一 遥控发射电路原理图 2、遥控接收电路原理图 附图二 遥控接收电路原理图 3、遥控发送控制器程序 ORG 0000H ;程序执行开始地址 AJMP START ;跳至 START 执行 ORG 001BH ;定时器 T1 中断入口地址 LJMP INTT1 ;跳至 INTT1 中断服务程序 CLEARIO: MOV P0,#0FFH ;P0-P3 口置 1 MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH CLR P3.5 ;关遥控输出 CLEARMEM: MOV SP,#70H ;设堆栈基址为 70H MOV IE,#00H ;关所有中断 MOV TMOD,#20H ;8 位自动重装初值模式 MOV TH1,#0F3H ;定时为 13 微秒初值 MOV TL1,#0F3H SETB EA ;开总中断允许 RET ;返回 START: LCALL CLEARIO ;调用初始化子程序; MAIN: LCALL KEYWORK ;主体程序。调用查键子程序 LJMP MAIN ;转 MAIN 循环 NOP ;PC 值出错处理 NOP NOP LJMP START ;重新初始化 INTT1: CPL P3.5 ;40kHZ 红外线遥控信号产生 RETI ;中断返回 KEYWORK: MOV P1,#0F0H ;置 P1 口输入状态 MOV A,P1 ;读入 P1 口值 MOV B,A ;P1 口值暂存 B 中 CJNE A,#0F0H,KEYHIT ;不等于#0FFH,转 KEYHIT(有键按下) KEYOUT: RET ;没有键按下返回; KEYHIT: LCALL DL10MS ;延时去抖动 MOV A,P1 ;再读入 P1 口值至 A CJNE A,B,KEYOUY ;A 不等于 B(是干扰),子程序返回 SETB P1.1 ;有键按下,找键号开始,查 0 行 SETB P1.2 SETB P1.3 MOV A,P1 ;读入 P1 口值 CJNE A,#0FEH,KEYVAL0 ;P1 不等于#0FEH,按下键在第 0 行 SETB P1.0 ;不在第 0 行,开始查 1 行 CLR P1.1 MOV A,P1 ;读入 P1 口值 CJNE A,#0FDH,KEYVAL1 ;P1 口不等于#0FDH,按下键在第 1 行 SETB P1.1 ;不在第 1 行,开始查 2 行 CLR P1.2 MOV A,P1 ;读入 P1 口值 CJNE A,#0FBH,KEYVAL2 ;P1 口不等于#0FBH,按下键在第 2 行 SETB P1.2 ;不在第 2 行,开始查 3 行 CLR P1.3 MOV A,P1 ;读入 P1 口值 CJNE A,#0F7H,KEYVAL3 ;P1 口不等于#0F7H,按下键在第 3 行 LJMP KEYOUT ;不在第 3 行,子程序返回 KEYVAL0: MOV R2,#00H ;按下键在第 0 行,R2 赋行号初值 0 LJMP KEYVAL4 ;跳到 KEYVAL4 KEYVAL1: MOV R2,#04H ;按下键在第 1 行,R2 赋行号初值 4 LJMP KEYVAL4 ;跳到 KEYVAL4 KEYVAL2: MOV R2,#08H ;按下键在第 2 行,R2 赋行号初值 8 LJMP KEYVAL4 ;跳到 KEYVAL4 KEYVAL3: MOV R2,#0CH ;按下键在第 3 行,R2 赋行号初值 12 LJMP KEYVAL4 ;跳到 KEYVAL4 KEYVAL4: MOV DPTR,#KEYVALTAB ;翻译成连续数字 MOV B,A ;P1 口值暂存 B 内 ANL B,#0F0H ;取高四位 MOV R0,#0 ;清 R0 KEYVAL5: MOV A,R0 ;查列号开始,R0 数据放入 A SUBB A,#04H ;A 中数减 4 JNC KEYOUT ;借位 C 为 0,查表出错,返回 MOV A,R0 ;查表次数小于 4,继续查, MOVC A,A+DPTR ;查列号表 INC R0 ;R0 加 1 CJNE A,B,KEYVAL5 ;查得值和 P1 口值不等,转 KEYVAL5 再 查 DEC R0 ;查得值和 P1 口值相等,R0 减 1 MOV A,R0 ;放入 A(R0 中数值即为列号值) ADD A,R2 ;与行号初值相加成为键号值(0- 15) MOV B,A ;键号乘 3 处理用于 JMP 散转指令 RL A ;键号乘 3 处理用于 JMP 散转指令 ADD A,B ;键号乘 3 处理用于 JMP 散转指令 MOV DPTR,#KEYFUNTAB ;取散转功能程序(表)首址 JMP A+DPTR ;散转至对应功能程序标号 KEYFUNTAB: LJMP KEYFUN00 ;跳到键号 0 对应功能程序标号 LJMP KEYFUN01 ;跳到键号 1 对应功能程序标号 LJMP KEYFUN02 ;跳到键号 2 对应功能程序标号 LJMP KEYFUN03 ;跳到键号 3 对应功能程序标号 LJMP KEYFUN04 ;跳到键号 4 对应功能程序标号 LJMP KEYFUN05 ;跳到键号 5 对应功能程序标号 LJMP KEYFUN06 ;跳到键号 6 对应功能程序标号 LJMP KEYFUN07 ;跳到键号 7 对应功能程序标号 LJMP KEYFUN08 ;跳到键号 8 对应功能程序标号 LJMP KEYFUN09 ;跳到键号 9 对应功能程序标号 LJMP KEYFUN10 ;跳到键号 10 对应功能程序标号 LJMP KEYFUN11 ;跳到键号 11 对应功能程序标号 LJMP KEYFUN12 ;跳到键号 12 对应功能程序标号 LJMP KEYFUN13 ;跳到键号 13 对应功能程序标号 LJMP KEYFUN14 ;跳到键号 14 对应功能程序标号 LJMP KEYFUN15 ;跳到键号 15 对应功能程序标号 RET KEYVALTAB: DB 0E0H,0D0H,0B0H,07H ;列号对应数据表 ;对应列号: 0 1 2 3 RET KEYFUN00: MOV A,#02H ;发 2 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN01: MOV A,#03H ;发 3 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN02: MOV A,#04H ;发 4 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN03: MOV A,#05H ;发 5 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN04: MOV A,#06H ;发 6 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN05: MOV A,#07H ;发 7 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN06: MOV A,#08H ;发 8 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN07: MOV A,#09H ;发 9 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN08: MOV A,#0AH ;发 10 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN09: MOV A,#0BH ;发 11 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN10: MOV A,#0CH ;发 12 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN11: MOV A,#0DH ;发 13 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN12: MOV A,#0EH ;发 14 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN13: MOV A,#0FH ;发 15 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN14: MOV A,#10H ;发 16 个脉冲 LJMP REMOTE ;转发送程序 RET KEYFUN15: MOV A,#11H ;发 17 个脉冲 LJMP REMOTE ;转发送程序 RET REMOTE: MOV R1,A ;装入发射脉冲个数 LJMP OUT3 ;转第一个码发射处理 OUT: MOV R0,#64H ;1MS 宽低电平发射控制数据 OUT1: SETB ET1 ;开 T1 中断 SETB TR1 ;开启定时器 T1 NOP ;延时 NOP NOP NOP NOP DJNZ R0,OUT1 ;时间不到转 OUT1 再循环 MOV R0,#3CH ;1MS 高电平间隙控制数据 OUT2: CLR TR1 ;关定时器 T1 CLR ET1 ;关 T1 中断 CLR P3.5 ;关脉冲输出 NOP ;空操作延时 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DJNZ R0,OUT2 ;时间不到转 OUT2 再循环 DJNZ R1,OUT ;脉冲未发完,转 OUT 再循环发射 LCALL DL500MS RET OUT3: MOV R0,#0FFH ;装发谢 3MS 宽控制数据 LJMP OUT1 ;转 OUT1 DELAY: MOV R2,#0FFH ;513 微秒延时程序 DELAY1: DJNZ R2,DELAY1 RET DL10MS: MOV R3,#14H ;10 毫秒延时程序 DL10MS1: LCALL DELAY DJNZ R3,DL10MS1 RET DL500MS: MOV R4,#32H ;500 毫秒延时程序 DL500MS1: LCALL DL10MS DJNZ R4,DL500MS1 RET END ;程序结束 4、遥控接收控制器程序 ORG 0000H ;程序开始地址 LJMP START ;跳至 START 执行 ORG 0003H ;外中断 0 中断入口 LJMP INTEX0 ;跳至 INTEX0 执行中断服务程序 CLEARIO: MOV P0,#0FFH ;P0-P3 口置 1 MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH CLEARMEM: MOV IE,#00H ;关所有中断 SETB EX0 ;开外中断 SETB EA ;总中断允许 RET ;子程序返回 START: LCALL CLEARIO ;上电初始化 LCALL LOOP ;调用调光控制程序 MAIN: JB P3.0,MAIN ;50HZ 交流电未过零转 MAIN LCALL DLX ;过零点时调用延时子程序(延时可变) CLR P2.0 ;发调光脉冲 LCALL DELAY ;持续 512 微秒 SETB P2.0 ;关调光脉冲 LJMP MAIN ;转 MAIN 循环 NOP ;PC 值出错处理 NOP LJMP START ;出错时重新初始化 ;采用中断接收 INTEX0: CLR EX0 ;关外中断 JNB P3.1,READ1 ;P3.1 口为低电平转 READ1 READOUTT0: SETB EX0 ;P3.1 口为高电平开中断(系干扰) RETI ;退出中断 READ1: CLR A ;清 A MOV DPH,A ;清 DPTR MOV DPL,A HARD1: JB P3.1,HARD11 ;P3.1 变高电平转 HARD11 INC DPTR ;用 DPTR 对低电平计数 NOP ;1 微秒延时 NOP NOP AJMP HARD1 ;转 HARD1 循环(循环周期为 8 微秒) HARD11: MOV A,DPH ;DPTR 高 8 位放入 A JZ READOUTT0 ;为 0(脉宽小于 8255=2 毫秒)退出 CLR A ;不为 0,说明是第一个宽脉冲(3 毫秒) READ11: INC A ;脉冲个数计 1 READ12: JNB P3.1,READ12 ;低电平时等待 MOV R1,#06H ;高电平宽度判断定时值 READ13: JNB P3.1,READ11 ;变低电平时转 READ11 脉冲计数 LCALL DELAY ;延时(512 微秒) DJNZ R1,READ13 ;6 次延时不到转 READ13 再延时 DEC A ;超过 3 毫秒判为结束,减 1 DEC A ;减 1 JZ FUN0 ;为 0 执行 FUN0(2 个脉冲) DEC A ;减 1 JZ FUN1 ;为 0 执行 FUN1(3 个脉冲) DEC A JZ FUN2 ;为 0 执行 FUN2(4 个脉冲) DEC A JZ FUN3 ;为 0 执行 FUN3(5 个脉冲) DEC A JZ FUN4 ;为 0 执行 FUN4(6 个脉冲) DEC A JZ FUN5 ;为 0 执行 FUN5(7 个脉冲) DEC A JZ FUN6 ;为 0 执行 FUN6(8 个脉冲) DEC A JZ FUN7 ;为 0 执行 FUN7(9 个脉冲) DEC A JZ FUN8 ;为 0 执行 FUN8(10 个脉冲) DEC A JZ FUN9 ;为 0 执行 FUN9(11 个脉冲) DEC A JZ FUN10 ;为 0 执行 FUN10(12 个脉冲) DEC A JZ FUN11 ;为 0 执行 FUN11(13 个脉冲) DEC A JZ FUN12 ;为 0 执行 FUN8(114 个脉冲) DEC A JZ FUN13 ;为 0 执行 FUN9(15 个脉冲) DEC A JZ FUN14 ;为 0 执行 FUN10(16 个脉冲) DEC A JZ FUN15 ;为 0 执行 FUN11(17 个脉冲) NOP NOP LJMP READOUTT0 ;出错退出 FUN0: CPL P0.0 ;P0 口各端口开关输出控制 LJMP READOUTT0 ;转中断退出 FUN1: CPL P0.1 LJMP R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论