首页 红外线接收程序

红外线接收程序

举报
开通vip

红外线接收程序红外线接收程序 /*红外线接收程序,本程序运行在NEC制下的遥控器下,市面上的遥控器大部份都是NEC制的,运行程序,按遥控器 在数码管上显示相应的地址码-控制码(以16进制显示)分四段,前两段是地址码,后两段为控制吗,根据NEC编码不同, 有的是前8位为数据码,后8位为数据据码的反码,有的是16位编码,就没有反码了*/ #include #include sbit hwx=P3^3; //定义红外接收脚, code unsigned char table[]= {0x3f,0x06,0x5b,0...

红外线接收程序
红外线接收程序 /*红外线接收程序,本程序运行在NEC制下的遥控器下,市面上的遥控器大部份都是NEC制的,运行程序,按遥控器 在数码管上显示相应的地址码-控制码(以16进制显示)分四段,前两段是地址码,后两段为控制吗,根据NEC编码不同, 有的是前8位为数据码,后8位为数据据码的反码,有的是16位编码,就没有反码了*/ #include #include sbit hwx=P3^3; //定义红外接收脚, code unsigned char table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71,0x40}; //共阴数码管 0-9 a-f - 表 unsigned char l_tmpdate[8]={0,0,0,0,0,0,0,0};//显示管数据 unsigned char l_lhj[66]; //定义66位数组变量来存储接收的时间参数 void delay();//延时子函数 void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数 void main(void) //入口函数 { EA=1; //首先开启总中断 EX1=1; //开启外部中断 1 IT1=1; // 设置成 下降沿触发方式 while(1){ //循环显示,接收都由 display(l_tmpdate,8); } } void display(unsigned char *lp,unsigned char lc)//显示 { unsigned char i; //定义变量 P2=0; //端口2为输出 P1=P1&0xF8; //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管 for(i=0;i0x7f) P2+=0x80; delay(); //延时 P2=0; //清0端口,准备显示下位 if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据 break; P1++; //下一位数码管 } } void delay(void) //空5个指令 { unsigned char i=13; while(i) i--; } void hongwai(void) interrupt 2 //外部中断 1 ,INT1(P3^3)连接红外线接收IC 数据脚 { unsigned char i,j,tmp; unsigned int tmp2; EX1=0; // hwx=1; j=33; //传送一组数包括引导码1位,地址码8位加反码8位,指令码8位加反码8位,总共33位 i=0; //从第一维数组开始 tmp2=0; while(!hwx){ //NEC制红外波形引导码低电平开始 tmp2++; //低电平延时记数 if(tmp2==1000) //NEC制引导码判断,防止其它干扰波形进入 break; } if(tmp2<1000){ //小于1000个记数的判断为干扰退出接收 EX1=1; return; } //P2=0x76; //数码管输出显示H,作为红外接收的指示 while(j){ //循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平时间常数,只接低电平常数就 //可以判断1或0了,在这里我们都接收 //还有一点要知道,接收波形是反向,在没有接收时端口为高电平 tmp=0; l_lhj[i]=1; //时间量从1开始 while(!hwx){ //检测高低电平的变化 l_lhj[i]++; //没变继续加1 delay(); //加入延时,是因为我们采用8位二进来存储,如果不加延时,时间量将计满 tmp++; //此变量为防止干扰带来的死循环 if(tmp==250) break; } i++; tmp=0; l_lhj[i]=1; //时间量从1开始 while(hwx){ //检测高低电平的变化 l_lhj[i]++; //没变继续加1 delay(); //同上 tmp++; if(tmp==250) break; } i++; j--; } i=255; //加入循环延时,处理数据 while(i){ tmp=255; while(tmp){ P2=0XF0; tmp--; } i--; } tmp=0; //这里显示了全部的四段码,包括地址位两段,控制位两段,每段用点分开 for(i=3;i<19;i++,i++){ //处理地址位前8位,这是3是因为去掉前面的引导码。 对低电平时间数据的数理, tmp>>=1; //右移一位,接收低电平在前 if(l_lhj[i]>30) //检测低电平时间超过30就确认为1 tmp+=0x80; } l_tmpdate[0]=tmp/16; //分开2位以16进制显示 l_tmpdate[1]=tmp%16+0x80; //0x80为加入小数点,目的是分开四段好看些 tmp=0; for(i=19;i<35;i++,i++){ //同上,这里处理地址位后8位 tmp>>=1; if(l_lhj[i]>30) tmp+=0x80; } l_tmpdate[2]=tmp/16; l_tmpdate[3]=tmp%16+0x80; tmp=0; for(i=35;i<51;i++,i++){ //同上,这里处理控制位前8位 tmp>>=1; if(l_lhj[i]>30) tmp+=0x80; } l_tmpdate[4]=tmp/16; l_tmpdate[5]=tmp%16+0x80; tmp=0; for(i=51;i<67;i++,i++){ //同上,这里处理控制位后8位 tmp>>=1; if(l_lhj[i]>30) tmp+=0x80; } l_tmpdate[6]=tmp/16; l_tmpdate[7]=tmp%16+0x80; EX1=1; } //朋友们,到这里,你是否有想过用遥控接收的指令码当键盘码来处理别的呢~ //比如按下了某个键的指令码去处理继电器的打开、关闭,哈哈,这个就你们自己来发辉下 了
本文档为【红外线接收程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_773238
暂无简介~
格式:doc
大小:19KB
软件:Word
页数:7
分类:工学
上传时间:2017-10-17
浏览量:97