关于51单片机串行口通信问题。。为什么发送10,收到的是1,发送21,收到的是2?

#include <reg52.h>
unsigned char code bottom[] = {"I get "};
unsigned char a;
unsigned char flag;
void init(){
TMOD = 0x20;//设定定时器的工作方式 00100000,方式2,8位自动重装定时器
TH1 = 0xfd;
TL1 = 0XFD;//定时器装入初值
TR1 = 1; //启动定时器
REN = 1;//允许串行接受数据
SM0 = 0;//设置串行口工作方式为1, 0 1;10位异步收发通信
SM1 = 1;
EA = 1;//开全局中断
ES = 1; //开串行中断
}

void main(){
unsigned char i;
init();
while(1){
if(flag == 1){
ES = 0;//关闭串行中断,防止无限次发送数据,让程序跑飞
for(i = 0;i < 6;i++){
SBUF = bottom[i];
while(!TI){
} //检测数据是否发送完毕,如果发送完毕,TI会硬件置1,
TI = 0; //软件将发送中断标志位置0,为下一次发送做准备
}
SBUF = a;
while(!TI){
}
TI = 0;
ES = 1; //打开中断,初始化flag,为下一次收发做准备
flag = 0;
}

}
}

void sre() interrupt 4{
RI = 0; //接受数据中断标志位,需要软件置0,以便进行下一次数据接受,进入中断程序
a = SBUF;//
flag = 1;//标记,确认数据是否接受完毕
}
为什么只能接受个位数呢????发送10只能收到1,还有要怎么接受汉字??

你的程序可以接收,波特率要设置为9600,串口设置为十六进制接受和发送,前面六个是发送的字符串,后面一位是自己输入的十六进制数,发送汉字要用取模软件,例如16X16汉字取模为32字节的十六进制数,for(i = 0;i <32;i++){SBUF = bottom[i];数组里存入取模的32个十六进制数,接收先定义一个数组变量:uchar buf[32];中断里边buf[num]=SBUF;追问

恩。谢了

温馨提示:答案为网友推荐,仅供参考
相似回答