51单片机和计算机串口通信,不断收到乱码如何解决?

/**********程序功能*****************///51单片机往语音模块写入一条指令的源码实例。//此程序下载到单片机中会自动发送播放“play,000... /**********程序功能*****************/
//51单片机往语音模块写入一条指令的源码实例。
//此程序下载到单片机中会自动发送播放“play,0001,$”文件的指令,语音模块会播放“0001.wav”

/*********接线方法******************/
//单片机RXD(P3.0)-------语音模块TXD
//单片机TXD(P3.1)-------语音模块RXD
//GND-------GND
//语音模块请从+5V端口输入5V电压供电

#include <at89x51.h>
#include <intrins.h>
#include <stdio.h>

#define uchar unsigned char
#define uint unsigned int
typedef unsigned char u8;
typedef unsigned int u16;

//sbit busyO=P3^7;

void SendString(unsigned char *pt);
void Send_Char(unsigned char DATA);
void delay2ms(void);
void ConfigUART(u16 buad);
void delay(uint i);

void Send_Hex(unsigned char c)
{
ES = 0; //关串口中断
SBUF = c;
while(TI!=1); //等待发送完成 //----------这里开始没有执行
TI = 0; //清除发送中断标志位
ES = 1; //开串口中断
}

void main()
{
/*TMOD=0x20;//定时器1使用初值自动重装方式,方式2
TH1=0xfd;
TL1=0xfd;//9600波特率初值,11.0592mhz晶振时
TR1=1;//允许定时器计数
SM0=0;//设置为串口工作方式1
SM1=1;//设置为串口工作方式1
REN=1; //不允许串口接收,此程序不需要接收数据。*/
// busyO=1;
//播放“0001.wav”文件,注意此句是关键,发送命令都这样发的
//就算后面的看不明白,你只要对着这个照抄就行了。
// SendString("play,0002,$");//播放“0002.wav”文件...以此类推
// SendString("pap,$");//播放或者暂停
// SendString("stop,$");//停止
// SendString("previous,$"); //上一曲
// SendString("next,$"); //下一曲
// SendString("vol+,$");//音量+
// SendString("vol-,$");//音量-
// SendString("vol,5,$"); //设置音量为5
// SendString("reset,$"); //复位模块
// SendString("baud,9600,$");//修改模块的波特率为9600

ConfigUART(9600);

while(1)
{
Send_Hex(0x0d);
Send_Hex(0x0a);
SendString("play,0001,$");
Send_Hex(0x0d); //----------这里开始没有执行
Send_Hex(0x0a); //----------这里开始没有执行
delay2ms();
//----------这里开始没有执行

}

}
void SendString(u8 *pt)//串口发送一个字符串
{
while(*pt)
{
Send_Char(*(pt++)); //---------------------------延时函数没有执行
delay(5);
}
}

void Send_Char(u8 DATA)//串口发送一个字节
{
ES=0;//关闭串口中断
TI=0;
SBUF=DATA; //将数据发送出去,可以用电脑打开串口助手接收观察
while(!TI);//如果TI一直是0,就一直执行空白语句等待数据发送完毕,数据发送完毕之后,T1会置1----------这里开始没有执行
TI=0; //清零发送数据中断标志位TI
ES=1; //重新允许串口中断
}

void inter() interrupt 4
{
uchar a;
if(!RI)
{
a=SBUF;
}
else TI = 0;
}

void delay2ms(void) //误差 0us
{
unsigned char a,b;
for(b=4;b>0;b--)
for(a=248;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}

void ConfigUART(u16 buad)
{
SCON = 0x50;
TMOD &= 0X0F;
TMOD |= 0x20;
TH1 = 256 - (11059200/12/32)/buad;
TL1 = TH1;
ET1 = 0;
TR1 = 1;
}

void delay(uint i)
{
while(i--);
}
展开
 我来答
zhxiufan
2017-08-07 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38381
国家科技进步奖

向TA提问 私信TA
展开全部
如果收到乱码很频繁,应该是波特率误差太大所致,这有两方面原因。
1、单片机和电脑设置的波特率不一致。
2、晶振性能较差,其频率很不稳定,导致波特率误差过大。
zQ...M@21cn.com
2017-08-06 · TA获得超过110个赞
知道答主
回答量:174
采纳率:0%
帮助的人:53.6万
展开全部
波特率,校验位。最后,你懂得了~~~,给不给就看你了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式