【记录】一次51单片机串口乱码问题排查

【记录】一次51单片机串口乱码问题排查

  • 项目场景
  • 问题描述
  • 原因分析
  • 解决方案
  • 结语

项目场景

在51串口收发仿真实验中使用两个单片机互相通信,程序设定A上电1s后通过串口以16进制给B发送AA,直到B收到AA后回复BB,当A机确认收到AA后开始发送数据,若接受过程中出现错误,B给A发送FF,A确认收到后重新发送。


问题描述

前几天,老师发给我一份实验文件让我帮助排查一个问题,实验目的如项目场景介绍,但在Proteus中仿真遇到乱码问题。


原因分析

解压文件后,我将整个工程备份后直接打开Proteus仿真软件(这里我电脑上使用的是Proteus 8 )直接运行,观察现象如图:
【记录】一次51单片机串口乱码问题排查_第1张图片

可见,串口监视器接收到的数据,明显发生偏差,出现乱码。停止仿真后,检查各元件配置,因为程序设定通信数据为16进制,串口通信波特率为9600,监视器数据模式对应设置为16进制如图:
【记录】一次51单片机串口乱码问题排查_第2张图片

确定保存配置参数,重新点击运行按钮,问题发生变化。即,原来乱码不变为数据简介乱码,发现A循环发送的数据不管是否正确,如图监视器显示为16进制了:
【记录】一次51单片机串口乱码问题排查_第3张图片

此时尚未检查程序,于是打开keil 编辑器,检查程序,在大体上并未发现什么明显问题,但发现串口波特率配置是12MHz晶振模式下的9600。于是返回仿真软件,点开单片机配置界面,发现晶振配置也是12MHz,如此一来似乎并没有什么逻辑上的错误。陷入一阵沉思,想了想是不是老师也是看到这里才问我的呢?

顿悟: 正当我起身伸懒腰的时候,想到了STC ISP这个软件,因为恰好在老师发来文件的前一刻,正好在他们官网看有没有什么新品,于是想到使用它生成串口配置程序,在重写一个完成任务。
但是,当我选好参数,12MHz 、9600、8为数据,选用定时器1做波特率发生器,点击生成C代码后,看到了误差百分数,,,,,顿感不妙。
果然,当我将程序编译添加到仿真后,串口监视器打印不稳定。到这前面的问题也就算是解决了,只需要稍作修改。


解决方案

将A、B两个单片机晶振频率改为11.0592,因为这个频率是最常用的,用它来产生的串口波特率误差较小。
【记录】一次51单片机串口乱码问题排查_第4张图片
知道了,原因,返回程序将串口配置一改,然后将仿真单片机晶振改为11.0592即可:
【记录】一次51单片机串口乱码问题排查_第5张图片
改完后,添加修改后的程序,重新进行仿真,结果如下,问题解决。

【记录】一次51单片机串口乱码问题排查_第6张图片


结语

我们在使用各单片机的时候总会遇到问题,无论是学习还是做项目的过程其实都是在不断积累经验,不断成长,有时候可能就是一个和很简单或很小的问题,但如果你没有意识到或者自认为没有问题,就像一开始排查,检查程序的仿真软件配置都没有问题,最后却是因为误差。。。
最后,欢迎留言交流。

你可能感兴趣的:(STC,51/52单片机,单片机,51单片机)