红外遥控是一种无线、非接触控制的技术。具有看干扰能力强,信息传输可靠,功耗低,成本低的优点。
红外遥控的编码目前广泛使用的是:NEC Protocol的PWM(脉冲宽度调制)和Philips RC-5Protocol的PPM(脉冲位置调制)
红外接收头(单总线的通信方式),凸出的面对我们,引脚依次是:OUT,GDN,3.3V
-----------------------------------------------------------------------------
NEC协议特征
1.8位地址和8位指令长度;
2.地址和命令2次传输(确保可靠性)
3.PWM脉冲宽度调制,以发射红外载波的占空比代表0和1
4.载波频率为38KHZ
5.位时间位1.125ms或2.25ms
NEC码位的定义:一个脉冲对应的是560us的连续载波,而一个逻辑1传输需要2.25ms(560us的脉冲和1680us的低电平)。一个逻辑0需要1.12ms(560us的脉冲和560us的低电平)。由于红外接收头在接受到脉冲时为低电平,未接受到脉冲的时候为高电平,所以接受到的逻辑0和1正好和之前的相反。
NEC遥控指令的数据格式为:同步码,地址码,地址反码,控制码,控制反码。
同步码是由9ms的低电平和4.5ms的高电平构成。
其他几种码都是8位数据格式,低位在前,高位在后。
连发码:9ms的低电平,2.5ms的高电平,560us的低电平和97.94ms的高电平。
-----------------------------------------------------------------------------
程序设计思路:捕获电平,计算出大约的时间,判断出是什么码。
若频率为1MHZ,从装载值为10000,那么一个周期为10ms
若捕获的值在300-800之间就是逻辑0,若捕获的值在1400-1800之间就是逻辑1
若捕获的值在2200-2600之间就是连续码,若捕获的值在4200-4700之间就是同步码
-----------------------------------------------------------------------------
在写程序的时候我遇到了一个问题:if语句和switch语句中间不加延时的话,在按键按下后,它会存储我按下的那个按键的值在某个地方。当第一次按下后,它会先存储再发送到串口。当我输入第二个值的时候,它会先发出之前存储的值然后再把我输入的第二个值又存储到相同的地方并且覆盖原有的第一个值的数据,后面的输入就重复以上过程。若有人能解决,或需要看代码的请联系我。
代码如下:
while(1)
{
key=Scanf_key();
if(key)
{
delay_ms(10);
switch(key)
{
......
}
}
}
转载:https://blog.csdn.net/Flash1by1/article/details/101032019