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--);
} 展开
//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--);
} 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询