电子开发 | 基础入门 | 电路原理图 | 梯形图实例 | PLC基础   《如果喜欢本站,请按 Ctrl+D 手动收藏!感谢您的支持》一起学习一起进步,电子开发王欢迎您!.

电子开发网

电子开发网电子设计 | 电子开发网Rss 2.0 会员中心 会员注册

★电路公式手册,最新版《电子电路公式计算器》,电路公式查询手册 电路公式计算器【电子从业人员必备手册】
☆十天学会单片机实例100 c语言 chm格式。资料内容详细,覆盖例子多,内容广【电子从业人员必备手册】
搜索: 您现在的位置: 电子开发网 >> 电子开发 >> 单片机 >> 正文

单片机红外遥控解码器

作者:佚名    文章来源:本站原创    点击数:1913    更新时间:2010/8/20
 你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电器甚至让它遥控您的电脑呢?那好,跟我一起做这个“红外遥控解码器”。
     该小制作所需要的元件很少:单片机TA89C2051一只,RS232接口电平与TTL电平转换心片MAX232CPE 一只,红外接收管一只,晶振11.0592MHz,电解电容10uF4只,10uF一只,电阻1K1个,300欧姆左右1个,瓷片电容30P2个。发光二极管8个。价钱不足20元。

电路原理:
    主控制单元是单片机AT89C2051,中断口INT0跟红外接受管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.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置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相继的两次显示的编码,记录每个按键的编码,形成编码表,即遥控器编码的解码完毕。码表确定之后,以后接收到遥控器的编码之后,就与码表比较,找到匹配的码项,并把该码项对应的顺序号输出到P0口,同时也把顺序号向串行口输出到电脑,电脑接收该数据后由串口软件决定如何处理。
     程序不长,下面是完整的程序和注释:(先看流程图)
 
keydata equ 30h ;//该地址和31H地址用来存放遥控器按键编码。
org 00h
main:
 mov keydata,#0 ;// 清零
 mov tmod ,#09h       ;//设置定时0方式1,GATE=1
      mov  r7,#0  ;//计数器,用来计数是否满8位
 mov  r6,#0  ;//计数器,用来计数是否满2字节(解16位编码)
 jb p3.2,$  ;//是否为低电平
again:    ;//如果为低,继续往下面执行
 mov tl0,#0  ;//清零TL0
 mov th0,#0  ;//清零TH0
 setb tr0  ;//开启定时器0
 jnb p3.2,$  ;//等待高电平到来
 jb p3.2,$ ;//高电平到来,此时开始计数
 clr tr0 ;//高电平结束,停止计数
 mov a,th0 ;//读取th0 值,TL0忽略不计 
 clr c  ;//
 subb a,#12 ;//
 jc again ;//th0<12则转,即小于3.4ms,你可以算一下这个时间
 mov a,#14 ;//
 clr c  ;//
 subb a,th0 ;//和14比较,如果TH0>14则大于3.8ms
        jc again    ;//大于3.8ms,从新再检测
nextbit:  ;//起始位找到了,然后下一位
 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.2ms则转,再判断是否大于0.84ms
 mov a,#10 ;//再跟10比较
 clr c  ;//
 subb a,th0 ;//
 jc again ;;;;;;;//若 >2.7ms,则放弃,从新检测
 mov a,keydata ;// 符合大于2.2ms 小于2.7ms,即为“1”
 setb c        ;//C = 1
 rrc a  ;//把1移位进A
 mov keydata,a ;//保存
 inc r7  ;//计数器加1
 cjne r7,#8,nextbit ;//是否满8位
 inc r6   ;//计数加1
 cjne r6,#2,last8 ;//是否满两字节
 sjmp seach  ;//不满两字节,再新采集
last8:    ;//满1字节,再接下来第二字节
 mov keydata+1,a ;//把第一字节编码数据保存到31h里
 mov r7,#0  ;//计数器R7清零
 sjmp nextbit  ;//继续采集数据
next:      ;//小于2.2ms时转到这里
 mov a,th0  ;//读取计数值TH0
 swap a   ;//高4位与低4位对换
 mov r1,a  ;//保存到R1
 anl tl0,#0f0h  ;//取TL0高4位,低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 ; //判断是否 <0.84ms,是则放弃,继续采集
 mov a,r1 ;//否
 clr c  ;//
 cjne a,#64,continue   ;//跟64比较
continue:  ;//
 jnc nextbit ;  //a>64表示采样值 >1.11ms  放弃
 mov a,keydata  ;//否则 ,符合位“0”
 clr c          ;//C  = 0
 rrc a   ;//把零右移进A
 mov keydata,a  ;//保存
 inc r7   ;//计数器加1
 cjne r7,#8,nextbit ;//是否满8位
 inc r6   ;//计数器加1
 cjne r6,#2,last_8 ;//是第一字节已经满
 sjmp seach  ;//
last_8:    ;//如果为第二字节
 mov keydata+1,a ;//则保存第一字节到31h
 mov r7,#0  ;//清零R7
 sjmp 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,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 2
 mov tl1,#0fdh  ;//设置定时器初值
 mov th1,#0fdh  ;//
 mov scon,#01010000b;//以上设置,即设置串口波特率系数为:9600,8,1,0
 setb 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,11000000b,    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,10100000b
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://www.sl.com.cn/免费下载使用。如果你想用遥控器遥控电脑,你可以自己编写一个接受串行口应用软件,或者你可以直接下载使用Girder这个软件,该软件是专门为串口遥控器做的,很好用,下载地址为:http://www.girder.nl/,你可以利用这个软件定义遥控器来遥控你电脑移动鼠标、键盘操作、上网浏览、打开播放器、关机等。


Tags:单片机,红外解码器  
责任编辑:admin
请文明参与讨论,禁止漫骂攻击,不要恶意评论、违禁词语。 昵称:
1分 2分 3分 4分 5分

还可以输入 200 个字
[ 查看全部 ] 网友评论
    没有任何评论
电子开发网:汇集综合各类电子制作与电路图的网站,plc工控技术,模电数电知识,单片机EDA等等!荟萃电路图网站精华,为工程师创造价值。欢迎关注微信公众号:电子开发网!
资料包下载
 [闂佸憡顨嗗ú婊勬櫠閺嶎厼瀚夊Δ锕佹硶閵堫偊鏌¢崒锔藉]闂佸憡銇炵粈渚€濡垫径灞稿亾濞戝磭绱扮紒鍙樺嵆瀹曪繝寮撮悩宸毈闂佸搫鐗嗛幖顐︽偪閸曨剛鐟归柨鐕傛嫹100 c闁荤姴娴勯幏锟�
 [闁哄鍎愰崹顖氣枎閵忋垻灏甸柨鐕傛嫹]婵炴垶鎸搁ˇ瀹犮亹缁€鐑睠闁诲孩鍐荤紓姘卞姬閸曨剛顩烽悹鎭掑妽閸╁倿寮堕悜鍡楃仧婵炲棭鏁-TR
 [闂佹椿婢€缁插鎯岄悙顒傤浄閻犳亽鍔嶉崺鍌炴偣娴g懓绀冩い鎿勬嫹]LM324闁哄鏅滈崝鏍棘閿燂拷4~20mA闁哄鍎戦幏锟�1~5V闂佹眹鍨归悘姘辩矈閿燂拷
 [闂佹椿婢€缁插鎯岄悙顒傤浄閻犳亽鍔嶉崺鍌炴偣娴g懓绀冩い鎿勬嫹]LM386婵$偛婀辩划顖炴倵椤掍焦濯撮柟鎹愵嚙椤斿﹪鏌涜箛鎿冨剶妞ゃ儲鎹囧銊╁箚瑜嬫禍锝夋煕閿濆啫濡奸悽顖ゆ嫹
 [闂佹椿婢€缁插鎯岄悙顒傤浄閻犳亽鍔嶉崺鍌炴偣娴g懓绀冩い鎿勬嫹]936闂佺粯甯掗敃銈堛亹閹绢喗鍋ㄥù锝呭暟閻斿懘鏌涘Ο鐓庢灁闁诡喖锕畷鍫曟晸閿燂拷
 [闂佸憡顨嗗ú婊勬櫠閺嶎厼瀚夊Δ锕佹硶閵堫偊鏌¢崒锔藉]闁烩剝甯掗幊搴ㄦ晬閹邦兘鏋栭柕蹇ョ磿閵堟挳鎮归悮瀛樺+濠电偞鎸撮弲娑氣偓鐧告嫹+闂佺缈伴崕鎾敆閻斿吋鍎嶉柛鏇ㄥ亜缁€锟�
 [闂備緡鍋呭銊╁极閵堝鍋ㄩ梻鍫熺〒閹藉秹鎮规担鐟扮妞ゆ挸鎲″ḿ顏堫敍濞嗘劦鍋�]S7-200PLC闂佹眹鍔岀€氼亞鎸掗姀銈嗗剳闁绘梹妲掗幏顐⒚归悪鍛 S7_2
 [闁哄鍎愰崹顖氣枎閵忋垻灏甸柨鐕傛嫹]S7-200闁圭厧鐡ㄩ幐濠氬几閸愨晝顩烽悹浣告贡缁€鍕煕韫囷絿鍘滅紒鎲嬫嫹,STEP7
 [闁哄鍎愰崹顖氣枎閵忋垻灏甸柨鐕傛嫹]ModbusPoll闂佸憡绮岄鐖媎busSalve闂佺ǹ楠忛幏锟�
 [闁哄鍎愰崹顖氣枎閵忋垻灏甸柨鐕傛嫹]STEP7濠碘槅鍨崜婵堚偓姘懇閺屽矁绠涢弬璺ㄦ▌婵炲濮伴崐鏇犺姳閿燂拷 Smart_
 [闁哄鍎愰崹顖氣枎閵忋垻灏甸柨鐕傛嫹]Modbus闁荤姴顑呴崯鎶芥儊椤栨粌鍨濋柛鎾楀倻瑙� v1.024 缂傚倷绶ら幏锟�
 [闁哄鍎愰崹顖氣枎閵忋垻灏甸柨鐕傛嫹]Modscan32闂佸憡绮岄鐖媎sim32,modb
 [闂佹椿婢€缁插鎯岄悙顒傤浄閻犳亽鍔嶉崺鍌炴偣娴g懓绀冩い鎿勬嫹]89c51闂佺ǹ绻愰ˇ閬嶆偟濞戙垹妫橀梺顐g闂嗗綊鏌i鍡楁珢缂佽鲸鐛otues
 [闂佹椿婢€缁插鎯岄悙顒傤浄閻犳亽鍔嶉崺鍌炴偣娴g懓绀冩い鎿勬嫹]婵炴垶鎸稿ú銈夊礋妤e啫鍌ㄩ柛鐐村Оotues婵炲濮惧▔鏇烇耿閿涘嫮鐭欓悗锝庝簽绾板秵绻濊閸旀鎮ラ敓锟�
 [闂佹椿婢€缁插鎯岄悙顒傤浄閻犳亽鍔嶉崺鍌炴偣娴g懓绀冩い鎿勬嫹]51闂佸憡顨嗗ú婊勬櫠閺嶎厼瀚夐柛婵嗗閸у﹦绱掔€h埖瀚� protues婵炲濮惧▔鏇烇耿閿燂拷
最新文章

三菱PLC软件 GX Wor

西门子200smartPLC选

模拟量转换工程量转

简述555定时器工作原

三菱FX3U系列—高速

三菱/信捷 PLC PLSR
 简单三极管逆变器
 TL494制作50HZ逆变
 80W简单的功放电路
 555制作的简易电子
 850热风枪电路图原
 直流12v荧光灯电路
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 在线帮助 - 文章列表
返回顶部
刷新页面
下到页底
晶体管查询