用示波器调试模拟串口

        串口是单片机与外部联系的主要通道,一般地,单片机都会设置有标准的串口。但是,在实际工作时往往会发现,由于通信的通道数多于原有的标准串口,开发者不得不用普通的I/O口模拟标准串口以满足实际工作的需要。用普通的I/O口模拟标准串口最重要的关键是数据传输的速度要与系统要求的波特率同步才能正确地识别传送的信息,这样单片机才能在正确的指令下正常地工作。

        用普通的I/O口模拟标准串口网上有很多教程和实例,看起来似乎很简单,但真正的做到稳定地工作却很难,难点在于单片机的发送口和接收口不容易与波特率同步。大多数例子都是通过计算并设置单片机计时器的初始值以获得与波特率同步的动作,然而,理论上根据波特率计算的计时器初始值在实际运行时与预期的波特率会有一定的相差别,造成这个差别的因素有很多,比如,单片机内置的时钟电路的精度、单片机自身性能的稳定性、单片机执行指令的多少都可能会影响接收或发送信息的时间间隔,使得单片机执行指令的时间有额外的开销,从而使得计时器的预设值不准,造成波特率也产生漂移,发送或者接收到的信息不准确。当模拟串口接收到的信息与预期的有差别时,调试是很困难的,原因就是无法知道调整的方向和程度,你根本不知道计数器的预设值是往大调还是往小调,需要调多少。本文介绍了一种基于示波器的调整方法,它完全克服了上述缺点,能够快速的调试模拟串口,并稳定的工作。

        笔者使用过一款STC15F(L)104W单片机,它只有8只脚,体积小,性能稳定,价格便宜。但它的缺点全片没有一个标准串口,如果要使用它与外围通信,必须模拟串口。现在笔者就用这款单片机介绍模拟串口调试的全过程。

        首先,确定要实现的波特率,只为说明这个方法,波特率就定为4800吧,在这个波特率下,传送每一位数据的时间开销是1/4800秒,也就是208.3微秒左右,一个字节是8位,再加上起始位和结束位,一个字节一共要传送10位2进制数据,共需要10*208.3=2083微秒,约等于2.08毫秒,这个就是字节传送的周期值,我们采用定时器0中断来拟合这个时间。其次,确定一个字节的传送的数据,本文的这个数据是0x2C,这个是随意选取的,不过,要说明的是,在调试模拟串口时,必须循环传送这个数据,因为要测量周期值,只有相同的数据循环才容易判断周期的起始点和结束点。在STC的ISP中,已经有计算出来的4800波特率的计数器初值,我们从这个初值开始调试:

        根据公式BAUD=65536-FOSC/3/BAUDRATE/M计算出来的4800波特率的计数器初始值为0xFD00,其中,FOSC是11.0292MHZ,在1T的情况下M=1。实际上本文介始的调试方法无需进行这个计算,只需要知道4800波特率时,一个字节传送的总时间为2.08ms就行了。那么当计数器初始值为0xFD00时的效果是怎样的呢?全部的代码如下:

      由上图可见,标注得比较详细,几乎每条语句的含义都明确了。这段代码执行的结果见下图:

      显然,串口助手收到的信息不是传送的信息0x2C,其差别肯定是传送的时间与4800波特率要求的时间未同步,我们把示波接到单片机的TXB口看看数据传送的周期:

        这是个虚拟示波器,分析本文的内容足够了。从图上能看到波形是很规整的方波,并根据波形的周期性测量出了TXB脚的传送数据的周期值为ΔX=733.93微秒,小于4800波特率要求的2.08ms,因此,可以确定计数器的初始值偏大,必须往小的方向进行调整:

      这次将计数器初始值调到0xF300,其他的代码不变,执行的结果如下:

 

串口助手收到的信息仍然不正确,此时的示波器测量的图如下:

如上图可见,调整后的周期值为3.04ms,比4800波特率需要的字节周期值又大了,因此,要把计数器初始值往大的方向调整,就这样,经过几轮的调整,最后调整的计数器初始值:

在这个计数器初始值下串口助手收到的信息是:

由图可见,串口很准确收到单片机发送的信息,再看看此时的字节传送周期值:

从图上看出,周期值也很准确,ΔX=2.08ms,周期值与4800波特率要求的相同了,才能收到正确的数据。

        以上就是用示波器调试模拟串口的全过程。此方法的优点于1、准确地把传送数据或接收数据的字节周期调整到波特率要求周期值,模拟串口精度高;2、调试时清楚地知道计数器初始的调整方向,可操作性好;3、调试过程时间短,调试效率高;4、调试方式独立性强,适用于各种单片机。本文附有源代码,在STC15L104W单片机上调试通过,可下载参考。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值