注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
天涯思君的个人空间 https://home.eeworld.com.cn/space-uid-671392.html [收藏] [复制] [分享] [RSS]
日志

软件模拟串口+红外通信

已有 3846 次阅读2016-3-28 18:07 | 通信信号, 单片机, 波特率, 定时器, 高电平

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个字节(操作码)的数值,再与红外遥控器键码值比对,从而可以判断出是按下了哪个键。

具体代码请参考附件:红外接收-中断法.txt


评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章