关于红外通信,网上有很多关于解码的单片机代码和视频,发射编码部分并不好找。写发射部分代码花费了不少时间,拿出来与大家分享一下。下面是我在网上找到的资料:
一、NEC 协议特征:
1. 8 位地址和 8 位命令长度
2. 每次传输两遍地址(用户码)和命令(按键值)
3. 通过脉冲串之间的时间间隔来实现信号的调制(PPM)
4. 38Khz 载波
5. 每位的周期为 1.12ms(低电平)或者 2.25ms(高电平)

二、NEC 协议的典型脉冲链:
用户码和数据码中的‘0’和‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲 位置调制方式(PPM)。
其中位 0 首先为 0.56ms 的高电平,然后是 0.565ms 的低电平;位 1 首先是 0.56ms的高电平,然后是 1.69ms 的低电平。
五、编程注意事项
1.红外接收头引脚信号是相反的电平。 以上电平是从发射头角度来看,红外接收头引脚输出的是相反的电平。 如图,即没有数据传输时,P3.2 引脚保持为高电平,当接收到数据时,首先是引导 码,9ms 的低电平和 4.5ms 的高电平,然后是 32 位数据和 1 位停止位。一般来说, P3.2 与单片机的某中断引脚相连,当接收数据时,低电平会触发中断。
2.数据从 LSB(低位)开始发送,所以选择右移方式接收数据。 四个字节的数据都是先发送 D0,最后发送 D7。所以接收到 1 位数据后,给变量的 最高位赋值,右移。或者先右移,再给变量的最高位赋值。
3.可以用一个数组保存 32 个数据的持续时间,用于后面判断高低电平。 用定时器对两个数据(中断)之间的时间计时,并保存这个持续时间用于以后判断 是位 1 还是位 0。
4.可以用 2 字节,4 字节变量存储 32 个数据,以节省代码空间。
可以用两个 16 位的 int 型变量存储数据,第一个 int 变量存储用户码,第二个存储数 据码和数据反码。也可以用一个 32 位 long 型的变量存储所有数据。
5.判断停止位。 接收到停止位后可以屏蔽红外引脚的中断,防止后面数据的干扰,解码成功后在开 启中断。
|