程序设定波特率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);
}
}
跪求大佬帮忙……折磨半个月了……
串口调试助手看下,检查单片机程序、连线有没有连好,波特率、停止位、校验位的设置等。
你的51晶振频率是多少Hz?
用示波器打下单片机的TX管脚,看看波特率是否正确
换台电脑试试,最好是win7的。
不如换一种配置方式,
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
程序没有问题
看串口芯片 附近的电容 或者芯片
串口通信字符错误,一般是这两个问题:一个是配置问题,程序的配置必须要跟串口调试助手配置一致:一个是晶振问题,如果你程序设定的是11.0592MHZ,用的却是12MHZ的板子,也会造成错误
直接用示波器量测TX管脚波形,看看是否是配置有偏差,导致波特率异常。
示波器的上找一个最小的脉宽,然后卡下时间。每个比特位的时间为:1/波特率
这种一个是时钟频率不匹配导致的。你的延时函数式怎么实现的?你原来的板子用的可能不是内部时钟,所以时钟频率不一样,导致延时出问题,你可以用示波器看一下输出的波形,看是不是符合你的波特率设置以及起始位、数据位、停止位设置
考虑先看看你的系统中时钟是否准确,使用开启定时器在定时器中加上IO口翻转,使用示波器抓取翻转时间间隔如果没问题,那就考虑板上连线已经旁路电容影响,IO口输入输出也会有影响看看是否设置输入输出是不是对的,可以考虑直接在串口脚上断开外部电路直接焊线用串口工具调试试一下,如果这样没问题那就考虑后面板上连线问题和其他元件影响了
你这个发送速度太快了,考虑做两个数据间延时一点点,不要直接放循环中,加一个延时就像这样
++a;
if(a>20)
{
a=0;
SBUF=g;
}
我之前遇到过,是485的NP脚弄反了
停止位或校验位不匹配导致
检查一下单片机串口程序的数据位数,有没校验位;与上位机串口助手的设置是否一致。
会不会是硬件电路问题呢,比如说如果发送端和接收端没有共地,也有可能会有类似的问题