1、软件模拟串口
软件模拟串口就是按照标准RS232时序来发送与接收数据,从而模拟实现单片机的UART功能。
RS232标准:反逻辑
-3V ~ -15V —— “1”
+3V ~ +15V —— “0”
即低电平代表1,高电平代表0。
而单片机的UART与RS232遵循的是同一个协议,只不过是电平标准不同而已,由于这一点,它们之间的通信需要进行电平转换,MAX232芯片的作用就在于此。
RS232时序:先发起始位(0),再发8位数据(低位在先),最后发停止位(1)。
模拟串行口就必须要计算出每个位的时间,以波特率9600为例:每秒发9600个位,所以每个位占用的时间为(1/9600)s,大约是104us,然后我们就是要做一个精确的延时,来满足数据发送与接收的时序要求。
规定:当没有通信信号发生时,通信线路保持高电平。
具体实现:
我们用定时器来实现精准的延时。
接收:当接收到起始位时,便给定时器赋初值、启动定时器、标志位置低,然后等待,当定时器溢出后在中断内部置高标志位,等过起始位,就读取第一位数据,重复上述步骤,等待读取第二位数据......最后得到8位数据。
发送:发送时先发起始位,再从低位开始,与接收时类似,只要保证电平时间要求依次发送数据就行了。
这里采用ACC来做为发送与接收的缓冲器,发送时先把值给ACC,再依次发ACC的低位,次低位......,接收时同样把先接收到的数据放在ACC的低位。
具体代码请参考附件:软件模拟串口.txt
2、红外通信
红外接收头参数: 频率:38KHZ静态输出:高电平
红外发送协议:引导码 + 客户码1 + 客户码2 +操作码+ 操作反码 (用户真正需要的就只有操作码。)
各种编码的作用
v1引导码:就是一把钥匙,单片机只有检测到了引导码出现了才确认接收后面的数据 ,保证数据接收的正确性.
v2 客户码:为了区分各红外遥控设备,使之不会互相干扰.
v3操作码:用户实际须要的编码,按下不同的键产生不同的操作码,待接收端接收到后根据其进行不同的操作.
v4 操作反码:为操作码的反码,目的是接收端接收到所有数据之后,将其取反与操作码比较,不相等则表示在传输过程中编码发生子变化,视为此次接收的数据无效,可提高接收数据的准确性.
引导码定义:一般的红外发射芯片,比如日本NEC的uPD6121G,定义的引导码为9ms的高电平 + 4.5ms的低电平(4.5ms的低电平也叫结果码).如下图示:
引导码
客户码&操作码定义:
客户码和操作码都为8位的二进制编码
日本NEC的uPD6121G定义的'0'、'1'如下:
0: 0.56ms的高电平 + 0.565ms的低电平
1: 0.56ms的高电平 + 1.685ms的低电平
如下图示:
客户码&操作码
红外接收头的特性:
v.当接收到38KHz的红外线时其输出低电平
v.静态时其输出为高电平
1、由上图可以看出,红外发光管发出的信号经过红外接收头后已经进行了解调,并且将信号进行了反向.
2、同时还可以看出'0' 、 '1' 码只是低电平时的时间不同,既然这样我们就可以通过计算电平时间长度来判断是 '0' 码还是 '1' 码.
具体实现:
当引导码出现时会产生一个下降沿,所以我们就利用中断来检测这个下降沿,在检测到下降沿后,就开始计时,直到下一个下降沿出现,则第一位编码接收完毕,然后根据这位编码的时间长度来判断它是否为引导码,若为引导码,则继续接收,若否,则在下一次下降沿到来时重新判断是否为引导码。
当我们接收完33位编码,就去掉第1位的引导码,剩下的32位数据分别用4个字节的空间来保存,然后读取第3个字节(操作码)的数值,再与红外遥控器键码值比对,从而可以判断出是按下了哪个键。