《单片机原理与应用 51单片机设计的红外线遥控器电路图de谔谔 工作原理》由会员分享,可在线阅读,更多相关《单片机原理与应用 51单片机设计的红外线遥控器电路图de谔谔 工作原理(6页珍藏版)》请在金锄头文库上搜索。
1、51 单片机设计的红外线遥控器电路图及工作原理你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电 器甚至让它遥控您的电脑呢?那好,跟我一起做这个“红外遥控*器” 。该小制作所需要的元件很少:单片机 TA89C2051 一只,RS232 接口电平与 TTL 电平 转换心片 MAX232CPE 一只,红外接收管一只,晶振 11.0592MHz,电解电容 10uF4 只, 10uF 一只,电阻 1K1 个,300 欧姆左右 1 个,瓷片电容 30P2 个。发光二极管 8 个。价钱 不足 20 元。电路图及原理:主控制单元是单片机 AT89C2051,中断口 INT0 跟红外接
2、受管 U1 相连,接收红外信号 的脉冲,8 个发光二极管作为显示*输出(也可以用来扩展接其他控制电路) ,U3 是跟电脑 串行口 RS232 相连时的电平转换心片,9、10 脚分别与单片机的 1、2 脚相连, (1 脚为串 行接收,2 脚为串行发送) ,MAX232CPE 的 7、8 脚分别接电脑串行口的 2(接收)脚、 3(发送脚) 。晶振采用 11.0592MHz,这样才能使得通讯的波特率达到 9600b/s,电脑一般 默认值是 9600b/s、8 位数据位、1 位停止位、无校验位。电路就这么简单了,现在分析具体的编程过程吧。如图所示,panasonic 遥控器的波形是这样的(经过反复测试
3、的结果) 。 http:/ 3.6ms 低电平然后是 3.6ms 高电平,然后数据表示形式是 0.9ms 低电平 0.9ms 高电平周期为 1.8ms 表示“0” , 0.9ms 低电平 2.4ms 高电平周期为 3.3ms 表示“1” ,编写 程序时,以大于 3.4ms 小于 3.8ms 高电平为起始位,以大于 2.2ms 小于 2.7ms 高电平表示“1” ,大于 0.84ms 小于 1.11ms 高电平表示“0” 。因此,我们主要用单片机测量高电平的 长短来确定是“1”还是“0”即可。定时器 0 的工作方式设置为方式 1:mov tmod,#09h, 这样设置定时器 0 即是把 GATE
4、 置 1,16 位计数器,最大计数值为 2 的 16 次方个机器周 期,此方式由外中断 INT0 控制,即 INT0 为高时才允许计数器计数。比如: jnb p3.2,$ jb p3.2,$ clr tr0 这 3 条指令就可以测量一个高电平,接下来读取计数值 TH0,TL0 就可以分辨是起始位还是“1”或“0” 。在确定码表之前,您可以使用 P0 口的 8 个发光二极管来显示编码,16 位编 码分两次显示: mov p0,keydata acall delay_1s ;/1ms 延时子程序 mov p0,keydata+1 ljmp main 根据 P0 相继的两次显示的编码,记录每个按键的
5、编码,形成编码表,即遥控器编码的*完 毕。码表确定之后,以后接收到遥控器的编码之后,就与码表比较,找到匹配的码项,并 把该码项对应的顺序号输出到 P0 口,同时也把顺序号向串行口输出到电脑,电脑接收该 数据后由串口软件决定如何处理。程序不长,下面是完整的程序和注释:(先 看流程图)、keydata equ 30h ;/该地址和 31H 地址用来存放遥控器按键编码。 org 00h main:mov keydata,#0 ;/ 清零mov tmod ,#09h ;/设置定时 0 方式 1,GATE=1mov r7,#0 ;/计数器,用来计数是否满 8 位mov r6,#0 ;/计数器,用来计数是
6、否满 2 字节(解 16 位编码)jb p3.2,$ ;/是否为低电平 again: ;/如果为低,继续往下面执行mov tl0,#0 ;/清零 TL0mov th0,#0 ;/清零 TH0setb tr0 ;/开启定时器 0jnb p3.2,$ ;/等待高电平到来jb p3.2,$ ;/高电平到来,此时开始计数clr tr0 ;/高电平结束,停止计数mov a,th0 ;/读取 th0 值,TL0 忽略不计 clr c ;/subb a,#12 ;/jc again ;/th014 则大于 3.8msjc again ;/大于 3.8ms,从新再检测 nextbit: ;/起始位找到了,然后
7、下一位mov tl0,#0 ;/mov th0,#0 ;/setb tr0 ;/启动定时器jnb p3.2,$ ;/等待高电平jb p3.2,$ ;/高电平到来,此时开始计数clr tr0 ;/高电平结束,停止计数mov a,th0 ;/读取计数值,TL0 忽略不计clr c ;/subb a,#8 ;/th0 和 8 比较jc next ;/若 2.7ms,则放弃,从新检测mov a,keydata ;/ 符合大于 2.2ms 小于 2.7ms,即为“1”setb c ;/C = 1rrc a ;/把 1 移位进 Amov keydata,a ;/保存inc r7 ;/计数器加 1cjne
8、r7,#8,nextbit ;/是否满 8 位inc r6 ;/计数加 1cjne r6,#2,last8 ;/是否满两字节sjmp seach ;/不满两字节,再新采集 last8: ;/满 1 字节,再接下来第二字节mov keydata+1,a ;/把第一字节编码数据保存到 31h 里mov r7,#0 ;/计数器 R7 清零sjmp nextbit ;/继续采集数据 next: ;/小于 2.2ms 时转到这里mov a,th0 ;/读取计数值 TH0swap a ;/高 4 位与低 4 位对换mov r1,a ;/保存到 R1anl tl0,#0f0h ;/取 TL0 高 4 位,低
9、 4 位忽略不计mov a,tl0 ;/clr c ;/rrc a ;/rrc a ;/rrc a ;/rrc a ;/add a,r1 ;/mov r1,a ;/subb a,#30 ;/以上几行是把 TH0 的低 4 位和 TL0 的高 4 位合并为 1 字节作为计数值jc nextbit ; /判断是否 64 表示采样值 1.11ms 放弃mov a,keydata ;/否则 ,符合位“0”clr c ;/C = 0rrc a ;/把零右移进 Amov keydata,a ;/保存inc r7 ;/计数器加 1cjne r7,#8,nextbit ;/是否满 8 位inc r6 ;/计数
10、器加 1cjne r6,#2,last_8 ;/是第一字节已经满sjmp seach ;/ last_8: ;/如果为第二字节mov keydata+1,a ;/则保存第一字节到 31hmov r7,#0 ;/清零 R7sjmp nextbit ;/ seach: ;/匹配按键编码mov r0,#-2 ;/按键编码字节个数计数器mov r1,#-1 ;/按键顺序计数器 seach1: ;/inc r0 ;/ seach2: ;/inc r0 ;/inc r1 ;/cjne r1,#29,compare ;/是否 R1=29 sjmp exit0 ;/ compare: ;/开始匹配mov a,
11、r0 ;/mov dptr,#keycode ;/地址指针指向码表首址movc a,a+dptr ;/取码cjne a,keydata,seach1 ;/比较inc r0 ;/R0+1,再比较下一字节(每个按键编码为 2 字节)mov a,r0 ;/;mov dptr,#keycode ;/movc a,a+dptr ;/比较cjne a,keydata+1,seach2 ;/是否匹配,不匹配则继续跟下一字节比较mov p1,r1 ;/如果匹配,把按键顺序号输出到 p1 send: ;/mov tmod,#20h ; /设置 timer 1,mode 2mov tl1,#0fdh ;/设置定时
12、器初值mov th1,#0fdh ;/mov scon,#01010000b;/以上设置,即设置串口波特率系数为:9600,8,1,0setb tr1 ;/启动定时器 1 loop_s: ;/mov sbuf,r1 ;/把 R1(按键顺序号)输出到串口jnb ti,$ ;/等待是否发送完毕clr ti ;/发送完毕,清零 TI exit0: ;/ ljmp main ;/循环keycode: ;/每两字节代表一个按键的编码 db 11111000b,00000000b, 11111100b,00000000b, 11111001b,11000000b db 11111100b,11000000
13、b, 11111010b,00000000b, 11111010b,00100000b db 11111010b,01000000b, 11111010b,01100000b, 11111010b,10000000b db 11111010b,10100000b, 11111010b,11000000b, 11111010b,11100000b db 11111011b,00000000b, 11111011b,00100000b, 11111011b,01000000b db 11111011b,01100000b, 11111111b,01100000b, 11111111b,101000
14、00b db 10001100b,10001110b, 10001101b,11101110b, 10001100b,10101110b db 10001101b,11001110b, 11111000b,11100000b, 11111100b,10000000b db 11111100b,01000000b, 11111001b,10100000b, 11111100b,10100000b db 11111100b,01100000b end - 各种遥控器编码不同,如果你采用的是其他遥控器,修改几个参数即可(当然按键的编码 表肯定不同了) ,即计数器的值不同,不过有的遥控器有机器码(机器码每个按键都是一样 的) ,此时可以跳过机器码的采集。最后有一点想提一下的是,刚开始不知道遥控器的编码 是比较麻烦的,笔者在“双龙电子“网站下载了个声卡示波器,用他可以一目了然观看遥 控器的波形,测量其脉冲宽度,有了它确实方便很多,该软件可以到双龙公司网站 http:/ 受串行口应用软件,或者你可以直接下载使用 Girder 这个软件,该软件是专门为串口遥控 器做的,很好用,下载地址为:http:/www.girder.nl/,你可以利用这个软件定义遥控器来遥 控你电脑移动鼠标、键盘操作、上网浏览、打开播放器、关机等。本文来自: DZ3W.COM 原文网址:http:/