51单片机串口通讯字符错位 80C

程序设定波特率4800,单片机输出的是3c 38 38 38 38 38 38 38 38,但是串口显示的却是D8 EC EC EC EC EC EC EC 00,程序上实在找不到错误,更改代码切到9600也是这样,显示的错位字符都一样。个人认为不像是乱码,乱码应该很乱,接收到的字符不规律,这个非常规律,接收到的全都是D8 EC EC EC EC EC EC EC 00,几乎都不会错。硬件上已经换了两个单片机,重新焊了一块版。此外将该程序烧在之前做的一些板上都正常输出。以下是代码

#include
#define uchar unsigned char
#define uint unsigned int
void PORT_Init (void)
{
P0MDOUT = 0x17;
XBR0 = 0x01;
XBR1 = 0xC1;
}
void UART0_Init (void)
{
SCON0 = 0x50;
//TH1 = 0x64;
TMOD = 0x20;
CKCON = 0x01;
TH1 = 0x60;
TL1 = TH1;
TR1 = 1;
TI0 = 1;
}
void main()
{
char g;
int z;
PCA0MD &= ~0x40;
OSCICN = 0x81;
PORT_Init();

UART0_Init();
while(1)
{
g = 0x3c;
SBUF0=g;
while(TI0==0);
TI0=0;
for(z = 0;z < 8; z++){
g = 0x38;
SBUF0=g;
while(TI0==0);
TI0=0;
}
delay(50000);
}
}

跪求大佬帮忙……折磨半个月了……

15个回答

串口调试助手看下,检查单片机程序、连线有没有连好,波特率、停止位、校验位的设置等。

串口通信字符错误,一般是这两个问题:一个是配置问题,程序的配置必须要跟串口调试助手配置一致:一个是晶振问题,如果你程序设定的是11.0592MHZ,用的却是12MHZ的板子,也会造成错误

你的51晶振频率是多少Hz?

byhunpo
byhunpo 内部晶振24.5MHz
一年多之前 回复

用示波器打下单片机的TX管脚,看看波特率是否正确

byhunpo
byhunpo 请问波特率与频率的换算公式是什么,找过了也没弄懂,我量的9600大概是320hz
一年多之前 回复

换台电脑试试,最好是win7的。

不如换一种配置方式,
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器

程序没有问题
看串口芯片 附近的电容 或者芯片

直接用示波器量测TX管脚波形,看看是否是配置有偏差,导致波特率异常。
示波器的上找一个最小的脉宽,然后卡下时间。每个比特位的时间为:1/波特率

这种一个是时钟频率不匹配导致的。你的延时函数式怎么实现的?你原来的板子用的可能不是内部时钟,所以时钟频率不一样,导致延时出问题,你可以用示波器看一下输出的波形,看是不是符合你的波特率设置以及起始位、数据位、停止位设置

考虑先看看你的系统中时钟是否准确,使用开启定时器在定时器中加上IO口翻转,使用示波器抓取翻转时间间隔如果没问题,那就考虑板上连线已经旁路电容影响,IO口输入输出也会有影响看看是否设置输入输出是不是对的,可以考虑直接在串口脚上断开外部电路直接焊线用串口工具调试试一下,如果这样没问题那就考虑后面板上连线问题和其他元件影响了

共15条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!