NEC协议的红外遥控程序(任意IO口)(共5页).doc
-
资源ID:13699993
资源大小:63KB
全文页数:5页
- 资源格式: DOC
下载积分:20金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
NEC协议的红外遥控程序(任意IO口)(共5页).doc
精选优质文档-倾情为你奉上/*NEC_INF_S.h用于NEC协议的遥控器与51单片机结合的驱动程序,可用任意IO口,不占用中断资源。用户码8位,分布于2-17个脉冲;按键码8位,分布于18-33个脉冲。皆为前8原码,后8反码,并且接收数据时低位在前,高位在后。主控器为51单片机,晶振频率为11.0592MHz。注意:由于未用中断,所以信号的接收是靠查询方式的,可能会漏掉若干次红外信号。*/#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define N 5000/用于在while()中循环时超时跳出的数的上限,可小刀sbit nec_dat=P33;/任意IO口,用到哪个自己改哪个uchar nec_id2=0;/遥控器的编码号,第一个为原码,第二个为反码uchar nec_data2=0;/遥控器的命令号,第一个为原码,第二个为反码uchar nec_status=0;/遥控器的按键状态信息。0:无按键;1:一次按键;2:连续按键uchar nec_actflag=0;/用于带到主函数里的按键响应标志。0:不动作;1:动作#ifndef NEC_INF_S_h#define NEC_INF_S_hvoid nec_init();/初始化函数,注意一定要拉高,拉低就错误了void nec_delay();/延时0.8ms左右,要求要非常精确,这是正确读数的关键void nec_pulsedat();/读第2到第32个脉冲,第一个脉冲已判定void nec_getdat();/扫描式读遥控器的数据,可能有时会扫描不到#endifvoid nec_init()/初始化函数,注意一定要拉高,拉低就错误了nec_dat=1;void nec_delay()/延时0.8ms左右,要求要非常精确,这是正确读数的关键uchar i;for(i=0;i<245;i+);/*void nec_act()/按键响应程序,根据自己需要写nec_getdat();/先扫描一遍红外信号if(nec_actflag=1)/如果是正确的红外信号才处理,否则跳过if(nec_data0=nec_data1)/验证所接收数据是否正确switch(nec_data0)/自己写所需要的程序段case 69:/*点亮二极管,让蜂鸣器发声,什么都行,写在这里*/ break;case 70: /*以下都一样,对应的遥控器按键见图1-1*/ break;case 71: break;case 68:break;case 64:break;case 67:break;case 7:break;case 21:break;case 9:break;case 22:break;case 25:break;case 13:break;case 12:break;case 24:break;case 94:break;case 8:break;case 28:break;case 90:break;case 66:break;case 82:break;case 74:break;nec_actflag=0;*/void nec_pulsedat()/读第2到第32个脉冲,第一个脉冲已判定uchar i=0;uint num=0;for(i=1;i<32;i+)num=0;while(nec_dat=0)&&(num<N)num+;nec_delay();if(nec_dat=1)if(i>=1)&&(i<=7)nec_id0=nec_id0|(0x01<<i);if(i>=8)&&(i<=15)nec_id1=nec_id1|(0x01<<(i-8);if(i>=16)&&(i<=23)nec_data0=nec_data0|(0x01<<(i-16);if(i>=24)&&(i<=31)nec_data1=nec_data1|(0x01<<(i-24);num=0;while(nec_dat=1)&&(num<N)num+;elseif(i>=1)&&(i<=7)nec_id0=nec_id0&(0x01<<i);if(i>=8)&&(i<=15)nec_id1=nec_id1&(0x01<<i-8);if(i>=16)&&(i<=23)nec_data0=nec_data0&(0x01<<i-16);if(i>=24)&&(i<=31)nec_data1=nec_data1&(0x01<<i-24);void nec_getdat()/扫描式读遥控器的数据,可能有时会扫描不到uint num=0;if(nec_dat=1)num=0;while(nec_dat=1)&&(num<N)num+;nec_delay();if(nec_dat=0)nec_delay();if(nec_dat=0)nec_delay();if(nec_dat=0)nec_delay();if(nec_dat=0)nec_status=1;num=0;while(nec_dat=0)&&(num<N)num+;num=0;while(nec_dat=1)&&(num<N)num+;if(nec_status=1)num=0;while(nec_dat=0)&&(num<N)num+;nec_delay();if(nec_dat=1)nec_delay();nec_delay();nec_delay();if(nec_dat=1)nec_status=2;else nec_id0=0x01;nec_pulsedat();elsenec_id0=0x00;nec_pulsedat();nec_actflag=1;/一次按键的响应程序if(nec_status=2)/持续按键的响应程序nec_status=0;/必须归零,非常重要图1-1 红外遥控器按键对应的接收码 图1-2 本程序使用的遥控器注意:本程序适用于NEC协议的红外遥控器,但是每一款遥控器的按键码可能不同,需要自己找到自己手头上遥控器的按键码资料来对程序进行改动。本程序没有占用单片机的中断资源,但是直接导致的问题就是单片机不一定能接收到每次遥控器发来的信号,即其相应的灵敏度大打折扣了,不过对于一般小程序来说妨碍不大,建议在较大的程序中或者遥控部分非常重要的程序中使用带中断的红外驱动。记得把nec_act();这个函数放在主函数中的大循环中,要不断查询才能接收到红外信号的。专心-专注-专业