简单51单片机串口程序

程序如下,但接收为乱码,请大家帮忙看看:
#include<reg51.h>#define uchar unsigned char
uchar txt[]="hello";
uchar i=0;
void main(void)
{
PCON=0X00;
SCON=0X50;
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
EA=1;
ES=1;
TR1=1;

while(1) {
if(i==6)
i=0;
if(TI==1)
TI=0;
if(RI==1)
RI=0;
}
}
void uart() interrupt 4
{
SBUF=txt[i++];

}

就是想用串口在电脑上显示,hello,但是就是乱码;

试试下列程序,这时用中断发送的。

#include<reg51.h>
#define uchar unsigned char
uchar txt[] = "hello";
uchar i = 0;
void main(void)
{
PCON = 0X00;
SCON = 0X50;
TMOD = 0X20;
TH1 = 0XFD;
TL1 = 0XFD;
TR1 = 1;
EA = 1;
ES = 1;
TI = 1;
while(1) {
if(i == 6) {
i = 0;
TI = 1;
}
}
}
void uart() interrupt 4
{
if(RI == 1) RI = 0;
if(TI == 1) {SBUF = txt[i++]; TI = 0;}
}

本程序,可以用串口助手接收。收到的是:hellohellohellohellohello....追问

  原来是做而论道兄啊,久仰久仰,我是你的粉丝哦;但是我把你修改的程序烧进去依然是乱码。

  还有不解:if(i == 6)

  {   i = 0;

  TI = 1;  }

  它不是自己装载一帧数据,共十位嘛,装完之后,硬件自动将TI置位。但你把i==6时,就让TI=1,从而产生中断,信息会不会不完整啊?因为当我发第一个字母 h 时,一个字节8位,刚好装完发送,TI置1,因此我把TI=0这句删了,但是依然显示不正确;

追答

#include
#define uchar unsigned char
uchar txt[] = "hello";
uchar i = 0;
bit Sended;
void main(void)
{
PCON = 0X00;
SCON = 0X50;
TMOD = 0X20;
TH1 = 0XFD;
TL1 = 0XFD;
TR1 = 1;
EA = 1;
ES = 1;
Sended = 1;
while(1) {
if(Sended) {
Sended = 0;
i = 0;
TI = 1;
}
}
}
void uart() interrupt 4
{
if(RI == 1) RI = 0;
if(TI == 1) {
TI = 0;
if (txt[i] != '\0') SBUF = txt[i++];
else Sended = 1;
}
}

写上了结尾检测功能,增加了一个结束标志。

在需要发送的时候,只要令 TI = 1; 即可持续发送到字符串的末尾。
发送到 '\0' 时,就不发送了。

主函数,不必等待每个字符的发送过程,工作效率可大大提高。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-11
#include<reg51.h>#define uchar unsigned char
uchar txt[]="hello";
uchar i=0;
void main(void)
{
PCON=0X00;
SCON=0X50;
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
EA=1;
ES=1;
TR1=1;
SBUF=txt[0];
while(1)
{
}
}
void uart() interrupt 4
{
if(RI==1)
RI=0;

if(i==6)
{
i=0;
return;
}
if(TI==1)
{
TI=0;
SBUF=txt[i++];
}
}
另外,波特率多少,晶振频率多少?追问

波特率为9600,晶振为11.0952的,我把你修改的程序烧进去,却没有什么显示了,麻烦你帮忙看看,谢谢了

本回答被网友采纳
第2个回答  2012-11-11
发送的话用查询方式就好了,稍微改一下:
...
while(1) {
if(i==6)
i=0;
while(!TI);
TI = 0;
SBUF = txt[i++];
}
}追问

那串口中断是不是就没用了?

追答

我一般都是查询发送,中断接收。

第3个回答  2018-09-09
波特率没设置好