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