1 / 34
文档名称:

单片机应用小技巧.pdf

格式:pdf   页数:34
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

单片机应用小技巧.pdf

上传人:机械CAD论坛 2011/11/23 文件大小:0 KB

下载得到文件列表

单片机应用小技巧.pdf

文档介绍

文档介绍:第二章单片机应用小技巧
进入本章,我想你已经具备了基本的单片机功底,最基本的要求是指可以用某种单片机进行一
些简单程序开发。通过本章内容的学习,一定会让你在产品开发方面的思维得到一些启迪,当你看
完本章后不妨回过头去看看自己以前的产品或程序,如果你很容易就从以前的程序或产品中找出自
己之前存在的不足,那恭喜你,再做两个项目你就可以向老板要求加薪。
本章内容大都是以实际工作经验为基础总结而得,内容多少不一,有的章节可能颇费纸墨,有
的却可能只是寥寥数语,存在这种差异的原因是有些例子技巧性主要体现在实现的细节方面,而有
的却只要找到方法就算成功。
. 用 IO 模拟接口
有时选用的单片机并不提供外围器件所需的接口,这时可以用 IO 来模拟所需接口,只要 IO 口
能满足接口规定的时序,就能用 IO 模拟的接口来和外围器件进行通讯。
用 IO 口模拟接口的方法对于大家我相信是一点就明,但要使 IO 口模拟的接口工作更加可靠稳
定并不简单,往往需要在一些细节上多加处理才能做好,接下来我会通过用 IO 模拟 UA RT 和 I2C 来
告诉大家,应该通过哪些细节展现你的技术功底。

IO 模拟 UART
模拟 UART 非常简单,一条 IO 模拟发送的 TX,一条 IO 模拟接收的 RX,另外将地 GND 引出就可
以实现 UA RT 功能。在硬件上基本不用考虑太多,只需要注意 IO 口上下拉电阻的选择,如果 I O 口
内部可以选择设置上下拉电阻,必须设为上拉电阻,如果 IO 口不提供内部上下拉电阻控制最好在
外部连上 10k~51k 的上拉电阻。有了上拉电阻,就可以确保 TX 能可靠输出高低电平,RX 即使没有
和另外的设备相连也能保证读到的状态是 1,这样是为了和 UART 通讯时序中用 1 来表示空闲的要求
一致。
删繁就简-单片机入门到精通
图 .-1 IO 模拟 UART 示意图

要用 IO 软件模拟 UART,就需要用软件在 IO_TX 脚输出满足 UART 通讯时序的波形,还能检测出
IO_RX 脚上的波形是否与 UART 通讯时序一致并将数据正确读回。UART 可以设置成多种工作状态,
限于篇幅这里只选用最常见的“9600/8/N/1”设置进行讲述。
“9600/8/N/1”表示波特率为 9600,这个速率收发一个位大约耗时 104us,8 位数据位,无校
验位,1 位停止位。
IO_TX 的控制比较简单,先将对应 IO 设置成输出,然后输出 1 表示当前没有数据发送。当需要
发送数据的时候,先输出一个 104us 宽的低电平做为起始位 0,然后按 104us/位的宽度按照先低位
后高位的顺序依次输出所发数据的各个位,最后将输出 104us 宽的高电平做为停止位 1。这样一个
字节的发送过程就全部完成,如果还有数据需要发送,按同样的方法操作即可。
IO_TX 发送过程最关键的地方是保证每个位宽为 104us。最简单的方法是用代码实现延时,在
发送过程中最好关闭所有中断以保证延时准确。如果不想去数代码有多少周期也可以用定时中断来
实现,让单片机产生一个 104us 的定时中断,然后在中断程序被调用后的同一时刻依次输出所有位,
这个定时中断需要最高的优先级,否则其它中断会导致时间不准。
IO_RX 的控制要复杂一些,将对应 IO 设置成输入,然后需要让程序不停的检测 IO_ RX 上有没有
收到 0,一旦检测到 0 则表示一个数据开始传送,需要启动接收过程。接收程序最好是 IO_RX 刚从
1 变为 0 就能立刻检测到,这样才能保证接收过程 104us 间隔的时间基点准确。
检测数据开始传送的方法基本上为这三种:
① IO_RX 支持负跳变触发中断用中断检测。,
②程序用不超过 52us 的定时中断程序定时检测。
③程序在主程序中循环检测。
这三种方法中负跳变中断的方法最好,时间基点可以控制得非常准,后两种方法时间基点误差
相对都比较大。
检测到 IO_RX 从 1 变为 0 后就需要严格按照通讯时序来读取数据的各个位,我个人认为最好的
方法如下:
①在检测到数据开始传送后 26us/52us/78us 三个点读 IO_RX 状态,要求这三点必须全为 0,否
则错误退出。
②然后在 52+104*N us 位置读得 8 个数据位。
③再在 104*9+26us/52us/78us 三个点读 IO_RX 状态,要求这三点必须全为 1,否则错误退出。
●注:计算时间需要将中断响应时间考虑进去
不管是 IO_TX 还是 IO_RX,实际上都很难准确无误