完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
**
下面先提供一段芯片手册 ** HT6221/2解码手册 下面我们对这个遥控器编写一个解码程序, 依照模块化设计的思想,逐个函数进行编写 因为波形是与时间相关联的,我们先编写延时函数 //函数功能 : 延时函数,i=1时,大约延时10us void delay(unsigned int i) { while(i--); } 定义全局变量 ***it IRIN=P3^2;把红外接收器接在这个引脚(之所以使用这个管脚是因为P3.2口具有外部中断0的功能) 对红外端口初始化,并打开外部中断 void IrInit() { IT0=1;//下降沿触发 EX0=1;//打开中断0允许 EA=1; //打开总中断 IRIN=1;//初始化红外端口 } 在触发中断后,通过对照数据手册中的波形图(注意由于单片机上管脚默认高电平,所以发射波与接受波正好相反), 我们可以编写中断函数把红外管发射的数据读取出来; 首先把一些重要数据定义成全局变量: unsigned char IrValue[4];//用于存储数据码,对应前两个是地址位,后两个是数据位和校验位 unsigned char Time;//计时变量, bit ture //校验变量,表示是否校验通过,如果不能成功校验,很可能发生了错误 void ReadIr() interrupt 0 { unsigned char j,k;//循环控制变量 unsigned int err; Time=0; delay(700); //7ms if(IRIN==0) //确认是否真的接收到正确的信号;与开关消抖类似 { err=1000; //1000*10us=10ms,超过说明接收到错误的信号. //这里10ms是大于9ms的,这么做更保险一点,下面的做法类似 //读取数据的头,即开始信号 while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去 { delay(1); err--; } if(IRIN==1) //开始信号校验成功 { err=500; //500*10us=5ms; while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去 { delay(1); err--; } for(k=0;k<4;k++) //共有4组数据 { for(j=0;j<8;j++) //接收一组数据 { err=60; //校验上限600us while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去 { delay(1); err--; } err=500; while((IRIN==1)&&(err>0)) //计算高电平的时间长度。 { delay(10); //0.1ms Time++; err--; if(Time>30) //超时太久时退出 { return; } } IrValue[k]>>=1; //k表示第几组数据 if(Time>=8) //如果高电平出现大于565us,那么是1 //注意这里高电平理论时间长是1680us,低电平的是560us //取Time大于6来检验当然就可以了,但不太保险,网上各类教程都是娶了一个中间值8 { IrValue[k]|=0x80;//在最高为写1,通过按位与运算实现 //如果不写默认是0; } Time=0; //用完时间要重新赋值 } } } //下面要对数据进行校验,校验的方式位判断第四位数据是否位第三位数据吗的反码 if(IrValue[2]!=~IrValue[3]) { ture=1; } else { ture=0; } } } 得到了红外管发送的数据,我们就可以随心所欲的实现我们想要的功能了,像按键指令一样,可以任意编写,开灯,放音乐,等等。 |
|
|
|
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1083浏览 2评论
700浏览 1评论
452浏览 0评论
193浏览 0评论
328浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 01:10 , Processed in 1.213630 second(s), Total 81, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号