您好,欢迎来到刀刀网。
搜索
您的当前位置:首页《匠人手记》24《用单片机IO口实现单线单工通讯》

《匠人手记》24《用单片机IO口实现单线单工通讯》

来源:刀刀网
更多精彩文章,尽在《匠人的百宝箱》。网址:http://cxjr.21ic.org

《匠人手记》之二十四

用单片机IO口实现单线单工通讯

作者:程序匠人

1. 前言

许多便宜的单片机都没有标准的串行通讯口。因此,我们常用单片机的IO口来模拟串

行通讯。下面,匠人给出一个简单的通讯方案。

在这个方案中,从机平时处于睡眠状态。主机处于工作状态。在需要的时候,由主机通过通讯口唤醒从机。从机被唤醒后接受通讯数据并进行解读,执行相关功能。然后再次进入睡眠,等待下次唤醒。

出处:《匠人的百宝箱》

2. 硬件连接示意图

主机 通讯线 从机 GND

3. 单线单工通讯协议

通讯线平时空闲时处于低电平,由一个100ms的高电平作为引导码来唤醒从机。然后发

送一个字节串行数据。完毕后通讯线恢复到空闲状态的低电平。对于从机来说,接受完8位数据,或检测到一个连续5t的低电平(结束码)即可认为通讯结束。

100ms 1t 3t 1t 1t >=5t 引导码 BIT0 BIT1 BIT7 结束码 空闲状态时,通讯线电平为低。引导码为一个持续100ms左右的高电平,用于唤醒从机。 数据码共8位(低位bit0先发);每位数据码由一个低电平和一个高电平组成;低电平时间固定=1t;高电平时间=1t代表逻辑“0”,=3t代表逻辑“1”;(注:t=100us);本例中,数据码定义为A5H(10100101B)。 结束码为一个持续时间>=5t的低电平。检测到结束码后通讯结束。 如果你的‘芯’是一座作坊,我愿做那不知疲倦的程序匠……

更多精彩文章,尽在《匠人的百宝箱》。网址:http://cxjr.21ic.org

4. 关于波特率自适应的处理

在本例中,从机的振荡源是RC。因此存在一个频率误差的问题,当系统频率变化时,

可能无法正确实别“t”值。为了能够消除该误差,可以考虑采用波特率自适应技术。

实现方法:在引导码之后,数据码之前,增加一位波特率校准位。该校准位由一个低电平和高电平构成,低电平和高电平分别=1t。在从机被唤醒后,检测到引导码结束后,先对校准位进行时间测量。为后续数据码的识别提供标准时间(“t”值)。

修改后的波形图如下:

100ms 1t 1t 1t 3t 1t 1t >=5t 引导码 校准位 数据码 结束码在引导码之后,数据码之前,增加一位波特率校准位,用于实现波特率的自适应。

5. 从机通讯接收程序流程图

说明:

z 从机在被高电平唤醒后,调用接收程序。

z 通讯接收程序包括以下几个部分:

1、 等待引导码结束 2、 检测校准位,求t值 3、 检测数据位

4、 检测结束码,退出

z 当发生以下情况时,判为通讯失败:

1、 除引导码之外的任何一个低电平或高电平计时超时; 2、 数据位的高电平计时值≠1t,也≠3t;

3、 8位数据位接收完毕后,再次检测到高电平。

z 通讯完毕后,接收到的数据被存储在接收寄存器中,供上级程序使用。当通讯失败

时,接收寄存器=0:

z 关于实时性的问题:在本例中,从机的功能比较单一。所以,没有考虑实时性的问

题。当通讯失败时,必须等通讯线释放后才会退出接收程序。如果从机还需要执行其它功能,则这种程序安排会导致系统假死(当机)。这将是致命的错误。应该考虑更合理的方式。

如果你的‘芯’是一座作坊,我愿做那不知疲倦的程序匠……

更多精彩文章,尽在《匠人的百宝箱》。网址:http://cxjr.21ic.org

流程图如下:

高电平唤醒后,调用该程序……串行通讯接收程序位计数器=8;接收寄存器=00H等待引导码结束(电平变低)当电平变低当计时超时计时器清零,对低电平计时当电平变高(波特率检测)计时器清零,对高电平计时当电平变低获取计时值(t=计时值)当计时超时当计时超时计时器清零,对低电平计时当电平变高当计时超时计时器清零,对高电平计时当电平变低获取计时值,并判断。当计时值≈1t,数据位=0;当计时值≈3t,数据位=1。将该数据位压入接收寄存器N位计数器-1,=0?Y(检测结束码)计时器清零,对低电平计时当计时值≠1t,也≠3t当电平再次变高检测结束码(计时≥5t的低电平)当检测到结束码当检测到结束码(计时值≥5t)通讯成功通讯失败RET接收寄存器=00H

如果你的‘芯’是一座作坊,我愿做那不知疲倦的程序匠……

更多精彩文章,尽在《匠人的百宝箱》。网址:http://cxjr.21ic.org

6. 相关地址连接

z 《匠人的百宝箱》主站:http://cxjr.21ic.org z 《匠人的百宝箱》副站:http://cxjr.mcublog.com z 《匠人手记》系列原创文章:

http://www.mcublog.com/blog/blog2006/cxjr/archives/2006/19158.html

z 《匠人夜话》系列原创文章:

http://www.mcublog.com/blog/blog2006/cxjr/archives/2006/19156.html

z 串行通讯相关文章:

http://www.mcublog.com/blog/blog2006/cxjr/archives/2006/18047.html

z 《匠人手记》14《串口七日之创世纪篇》:

http://blog.21ic.com/user1/349/archives/2006/11787.html

《匠人手记》版权声明

《匠人手记》系列文章都为匠人原创或精心整理,其中耗费了匠人的诸多心血。这些文

章推出以来,一直受到网友的欢迎。也有许多网站给予转载和推荐,匠人对此由衷感谢。 但是,最近我们发现,有些网站故意将《匠人手记》的内容拆开来发表,不但隐去了作者和出处等信息,而且还贴上他们自己网站原创的标签。匠人觉得这是一种不尊重原作者的行为。

在此,匠人特声明如下:《匠人手记》的正式发布版本均为PDF格式。匠人欢迎各位收藏或转载。但是,匠人要求转载者必须也以PDF格式提供。并且,转载者不得对PDF格式的《匠人手记》文件内容进行修改。转载者不得利用《匠人手记》谋取经济利益。

大伙能到《匠人的百宝箱》来做客,都是匠人的朋友。希望不要做伤害朋友的事情了。

如果你的‘芯’是一座作坊,我愿做那不知疲倦的程序匠……

更多精彩文章,尽在《匠人的百宝箱》。网址:http://cxjr.21ic.org

7. 附录:《匠人手记》系列原创文章列表

访问地址:http://www.mcublog.com/blog/blog2006/cxjr/archives/2006/19158.html z 《匠人手记》01《分段线性插值法》

z 《匠人手记》02《用普通IO口检测AD值的方法(采集温度)》 z 《匠人手记》03《一阶滤波方法》

z 《匠人手记》04《镍镉_NiCd_ 镍氢_NiMh_电池的充放电特性》 z 《匠人手记》05《手机锂电池充电特性要求》 z 《匠人手记》06《几种充电电池性能比较》

z 《匠人手记》07《巧用移位法进行多字节乘除法计算》 z 《匠人手记》08《巧用移位法进行数制转换》 z 《匠人手记》09《移相控制与过零检测》 z 《匠人手记》10《复位电路集锦》 z 《匠人手记》11《按键漫谈》

z 《匠人手记》12《单个按键多次击键的检测方法》 z 《匠人手记》13《解读TL494制作的降压电路》 z 《匠人手记》14《串口七日之创世纪篇》 z 《匠人手记》15《MC68HC908应用手记》

z 《匠人手记》16《天梯——MSP430之学习札记_第1部_》 z 《匠人手记》17《天梯——MSP430之学习札记_第2部_》 z 《匠人手记》18《天梯——MSP430之学习札记_第3部_》 z 《匠人手记》19《天梯——MSP430之学习札记_第4部_》 z 《匠人手记》20《天梯——MSP430之学习札记_第5部_》 z 《匠人手记》21《多种击键类型的处理流程图》 z 《匠人手记》22《梦幻时钟摇摇棒大揭秘》 z 《匠人手记》23《单片机入门知识与基本概念》 z 《匠人手记》24《用单片机IO口实现单线单工通讯》

如果你的‘芯’是一座作坊,我愿做那不知疲倦的程序匠……

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务