我的单片机串行口为什么乱码?

来源:百度知道 编辑:UC知道 时间:2024/06/25 19:47:39
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar idata trdata[10]={'I','a','m',' ','g','s',0x0d,0x0a,0x00};

main()
{
uchar i;
uint j;
TMOD=0x20;//确定定时器1的工作方式 定时器1中M1==1 M2==0 处于方式2
//注意这里定时器1为8位自动装入的 将TH初值重装TL
TL1=0xfd;
TH1=0xfd;
SCON=0xd8;//11011000 SM0==1 SM1==1串行口为方式3 波特率由定时器控制
//REN==1 允许串行口接收 TB8==1 为发送的第九位数据 也可作为就校检位
//TI==0 发送条件 软件初始值置0
PCON=0x00;//SMOD==0 方式1和3 波特率=2的SMOD次方*(定时器1的溢出频率)/32
//方式2 波特率=2的SMOD次方*(fosc/64) 这样方式3的波特率为9600
TR1=1; //定时器1开始计数 波特率在方式3中依赖定时器的值

while(1)
{
i=0;
while(trdata[i]!=0x00)
{
SBUF=trdata[i];//SBUF是一个一次能够接收一字节的缓冲器
while(TI==0)//硬件置位
{ ;}//发送一个后有一段时间TI仍旧==0 循环过后 TI==1 发送完毕
TI=0;//软件置0 执行下一次的发送
i++;
}
for(j=0;j<12500;j++)
{

你单片机设置的是方式3,有奇偶校验,PC设置校验位为无,不是乱码才奇怪呢,调试你可以输出ASCII码,一般的串口调试助手都有选项的,是按16进制显示还是按ASCII码显示。

能这么做
如 trdata="abcdefg";
那么会依次发送 abcdefg的asc2码

也可以在调试中显示 字母
右键 把方式改成ASC2模式