自制电视红外遥控器
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
flag=0; count=0; TR0=1; while(count<set_count); TR0=0; ircode=ircode>>1; } }
/******************************************* 发送 2 位红外数据 *******************************************/ void sendcode_2(void)// 前 26 位系统码最后两位 { uchar i; for(i=0;i<2;i++) { set_count=28; flag=1; count=0; TR0=1; while(count<set_count); TR0=0; if(ircode&0x01) { set_count=120; } else { set_count=38; } flag=0; count=0; TR0=1; while(count<set_count); TR0=0; ircode=ircode>>1; } }
while(count<set_count); TR0=0; set_count=330;//间隔 4.5ms flag=0; count=0; TR0=1; while(count<set_count); TR0=0; set_count=30;//发送 0.56ms 38k 红外波(编码中的 0.56ms 低电平) flag=1; count=0; TR0=1; while(count<set_count); TR0=0; ir=1; }
实物图
用自制遥控器调节音量,本遥控器最远试过 5 米之外也可以控制,为了拍摄方便才放这么近
┃参考┃ 用A T89S51 单片机制作红外电视遥控Βιβλιοθήκη Baidu 作者:易劲松
51 单片机应用开发大全所含 100 个范例代码及电路图 : http://mxroom.com/forum.php?mod=viewthread&tid=1820&extra=page%3D1 单片机超级精华包: http://mxroom.com/forum.php?mod=viewthread&tid=1687&extra=page%3D1 推荐] 初学单片机的 30 多个小实验,硬件简单,对初学者有好处: http://mxroom.com/forum.php?mod=viewthread&tid=1962&extra=page%3D1 [分享] 用单片机制作的 mp3: http://mxroom.com/forum.php?mod=viewthread&tid=1701&extra=page%3D1 [分享]新手写的多功能电子: http://mxroom.com/forum.php?mod=viewthread&tid=1679&extra=page%3D1 LCD 显示汉字和数字,适用于初学者(C 语言加 protues 电路仿真): http://mxroom.com/forum.php?mod=viewthread&tid=1960&extra=page%3D1 谱中单片机程序烧录工具(STC): http://mxroom.com/forum.php?mod=viewthread&tid=1682&extra=page%3D1 史上最全的 KEIL 中文学习资料! (有好东西要记得分享: http://mxroom.com/forum.php?mod=viewthread&tid=1729&extra=page%3D1 吉林大学《单片机技术》赵宏伟 32 讲: http://mxroom.com/forum.php?mod=viewthread&tid=1693&extra=page%3D1 学林电子最新图文教程(含 28 个单片机实例流程图)下载: http://mxroom.com/forum.php?mod=viewthread&tid=1959&extra=page%3D1 郭天祥 十天学会单片机和 C 语言视频教程: http://mxroom.com/forum.php?mod=viewthread&tid=1692&extra=page%3D1 [51 单片机] 单片机 C 语言 100 例教程: http://mxroom.com/forum.php?mod=viewthread&tid=1700&extra=page%3D1 单片机 C 语言程序设计实训 100 例--基于 AVR+PROTEUS 仿真: http://mxroom.com/forum.php?mod=viewthread&tid=1695&extra=page%3D1 [分享] 51 控制步进马达 自带程序 C 与汇编都有: http://mxroom.com/forum.php?mod=viewthread&tid=1963&extra=page%3D2
keyscan(); if(keyflag)//若有新按键 { delay(10); sendcode();//发送 红 外 编 码 delay(500); keyflag=0;//按键标志清零 } } }
/******************************************* 定时器中断 *******************************************/ void timer0(void) interrupt 1 { count++; if(flag==1) { irout=~irout; } else { irout=1; } ir=irout; }
1
1
用 AT89S52 自制电视红外遥控器
红外遥控器发送数据时,是将二进制数据调制成一系列的脉冲信号红外发射管发射出去,红外载波为频率 38KHz 的方波,红外接收端在收到 38KHz 的载波信号时,会输出低电平,否则输出高电平,从而可以将 “时断时续”的红外光信 号解调成一定周期的连续方波信号,再经过 1838 一体化红外接收头解调便可以恢复出原数据信号。如图 1 所示
/******************************************* 发送红外数据 *******************************************/ void sendcode(void) { set_count=575;//发送 9ms 38K 红外光 flag=1; count=0; TR0=1; while(count<set_count); TR0=0; set_count=320;//间隔 4.5ms flag=0; count=0; TR0=1; while(count<set_count); TR0=0; ircode=irsys[0];//发送 26 位系统码的前 1-8 位 sendcode_8(); ircode=irsys[1];//发送 26 位系统码的前 9-16 位 sendcode_8(); ircode=irsys[2];//发送 26 位系统码的前 17-24 位 sendcode_8(); ircode=irsys[3];//发送 26 位系统码的前 24-26 位 sendcode_2(); ircode=irdata;// 发 送 8 位数据码 sendcode_8(); ircode=~irdata; //发送 8 位数据反码 sendcode_8(); set_count=28;//发送 0.56ms 38k 红外波(编码中的 0.56ms 低电平) flag=1; count=0; TR0=1; while(count<set_count); TR0=0; ir=1; delay(23);//延时 23ms(编码中的 23ms 高电平) set_count=575;//发送 9ms 38k 红外波 flag=1; count=0; TR0=1;
/******************************************* 定时器初始化 *******************************************/ void init_timer() { EA=1; TMOD=0X02;//8 位自动重载模式 ET0=1; TH0=0XE8;//定时 13us,38K 红外波,晶振 22.1184 TL0=0XE8; } /******************************************* 主函数 *******************************************/ void main(void) { init_timer(); count=0; flag=0; irout=1; while(1) {
*****************************************以下是遥控完整程序*********************************************** /********************************************* **项目: 自制红外电视遥控器(EE01 学习板演示程序) **作者:一线工人 **网站:电子工程师之家 www.eehome.cn **转贴请保持代码的完整性 *********************************************/
#include <reg52.h> #define uint unsigned int #define uchar unsigned char bit irout;//红外管状态 sbit ir=P1^7;//红外发射管控制脚 uint count, set_count;//中断计数,设定中断次数 bit flag,keyflag;//红外发送标志,按键标志位 uchar irsys[4]={0x1a,0xa1,0xdc,0x03};//26 位系统码,最后一个字节只用 2 位 uchar ircode,irdata; /********************************************** 延时 1ms ***********************************************/ void delay(uint z)//延时 1ms,晶振 22.1184M { uint x,y; for(x=z;x>0;x--) for(y=225;y>0;y--); } /********************************************** 按键扫描 **********************************************/ void keyscan(void) { uchar keytemp; P3=0xff; keytemp=P3&0x0f;
图1 红外接收头解调过程如图 2 所示
图2 解调后的“0”和“1”波形及单片机编码图 3 图 4 所示
图3 38K 方波 图 4
1
了解了红外接收头解调及遥控编码下面就可以对照图 5 编写编码程序了, 图 5 是遥控按键 1 的一段实际编码
由 9ms 低电平 4.5ms 高电平的启始码, 26 位系统码,及 8 位数据码、8 位数据反码、 23ms 高电平及结束码组成 电路图
} } /******************************************* 发送 8 位红外数据 *******************************************/ void sendcode_8(void) { uchar i; for(i=0;i<8;i++) { set_count=28;//发送 0.56ms 38k 红外波(编码中的 0.56ms 低电平) flag=1; count=0; TR0=1; while(count<set_count); TR0=0; if(ircode&0x01)//判断红外编码最低位,1 宽的高电平,0 窄的高电平 { set_count=120; } else { set_count=38; }
if(keytemp!=0x0f) { delay(20); keytemp=P3&0x0f; if(keytemp!=0x0f) keyflag=1;// 有按键标志 switch(keytemp) { case 0x0e:irdata=27;break;//按键 1 对应该遥控器 P+的键值 case 0x0d:irdata=26;break;//按键 2 对应该遥控器 P-的键值 case 0x0b:irdata=31;break;//按键 3 对应该遥控器 VOL+的键值 case 0x07:irdata=30;break;//按键 4 对应该遥控器 VOL-的键值 }