单片机串口通信中由晶振频率导致的定时器溢出误差所引发的通信失败

单片机:STC89C52 开发板:普中科技HC6800-ES V2.0 串口调试助手:sscom32烧录软件:STC
  第一次进行串口通信的时候烧录的程序参照的是买板子时送的资料的例程,虽然最后助手界面显示PC机接收到单片机传来的信 ,但是PC机向单片机发送了好几次数据才出现了一次单片机向PC机的通信反馈。     今天我又重新上机调试,找出了导致通信失败的原因,那就是定时器的溢出误差所导致的波特率误差使得通信失败。          首先,在没有把程序烧录进板子前先不要打开串口调试助手sscom32,这样做调试助手并不能识别出串口 。不过如果打开了也没关系,只要在把程序烧录进板子的操作前把调试助手软件先关闭即可(助手检测到串口后便会占用串口,导致无法烧录)。生成hex文件(由下方的第一段源码生成)并写入板子就可以打开串口助手了(下图是还没有烧录就先打开调试助手所显示的界面)

接下来用这段源代码所生成的hex文件烧录进板子,并打开调试助手,设置其中的波特率为9600bps,在字符串输入框中输入一个字符(例如b),然后点击发送,就可以看到产生了错误:

发送了10次,每一次发送上位机上接收到的都是乱码,说明通信失败了。

原因在于:调试助手软件选择的通信波特率为9600bps,而实际上单片机的实际波特率并不是9600bps,而是有着8.51%的误差,这样波特率不匹配,就无法成功地通信。
接着可以多调试一些别的波特率,或者改变SMOD的状态来减小误差(串口方式1的波特率=((2^SMOD)/32)×(T1的溢出率) ),下面我再编程用4800bps的波特率和SMOD=1(只需要修改定时器1的初值和在初始化中添加指令PCON=0x80即可),误差降低为0.16%,试试看能否成功通信:

  看到上位机发送了5次数据,每一次都能得到单片机的反馈,说明通信已经成功了。

  再调试一次300bps,SMOD=0的情况,这种情况下波特率误差几乎为0,可以忽略不计。
   效果如下:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年3月15日
下一篇 2018年3月16日

相关推荐