51单片机串行通信接收到乱码

来源:百度知道 编辑:UC知道 时间:2024/09/22 07:09:15
我用STC89C52RC单片机进行串行通信的实验,但是电脑上串口调试助手上接受到的全是乱码,不知道是硬件哪里出了问题还是程序的问题,希望大家帮忙看看,谢谢了,程序很简单,就是向电脑串行接收端发送“Welcome”一个单词,如下:#include <reg51.h>
#include <intrins.h>

unsigned char key_s, key_v, tmp;

char code str[] = "Welcome";

void send_str();
bit scan_key();
void proc_key();
void delayms(unsigned char ms);
void send_char(unsigned char txd);

sbit AN1 = P3^2;

main()
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;

SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增

TR1 = 1; // 启动定时器1
IE = 0x0; // 禁止任何中断

while(1)
{
if(scan_key()) // 扫描按键
{
delayms(10); // 延时去抖动
if(scan_key()) // 再次扫描
{
key_v = key_s; // 保存键值
proc_key(); // 键处理
}
}
if(RI) // 是否有数据到来
{
RI = 0;
tmp = S

晶振一定要用11.0592的,不然9600波特率的时候会有8.51%的误差,会传输错误,你一定要用12M的话采用2400波特率,只有0.21%(好像忘了)。可以凑合,一定是这样的,相信我,我很有体会!

PCON &= 0xef; // 波特率不倍增 最好是PCON&=0x6f 不过不知道你为什么这样写
延时子程序 11.0592M 延时1ms
void delay(void) //误差 -0.651041666667us
{
unsigned char a,b;
for(b=102;b>0;b--)
for(a=3;a>0;a--);
}
还有你的晶振频率是12m吗 如果是的话9600的波特率就会出现乱码

接受方式有没设置 是文本接受还是二进制接受?