单片机通过串口发送0x00,为什么串口接收后显示为80呢

是不是十六进制数据发送前还要处理吗
就是说我通过串口助手发送00给单片机,单片机接收后通过串口发送,串口助手接收后应显示为00,为什么显示为80呢
#include <reg52.h>
#define uint unsigned int;
#define uchar unsigned char;
#define ufloat unsigned float
uint flag,a,b;
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SM0=0;
SM1=1;
TR1=1;
REN=1;
ES=1;
EA=1;
while (1)
{
if (flag==1)
{
flag=0;
ES=0;
SBUF=P2;
while(!TI);
TI=0;
ES=1;

}

}
}

void ser() interrupt 4
{
RI=0;
P2=SBUF;
flag=1;
}

这是晶振的误差造成的,校准波特率后才能正常通信。波特率9600所对应的应该是11.0592MHz的晶振,如果是12M就会出现这个问题,我在protues仿真中把晶振频率改为11.0592M后,正常通信,没有出现错误了!这应该能帮到你!
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-10-03
你的程序收到PC的数后输出到P2,然后再读P2送到PC,P2是I/O口,不能保证你收到和发送的数据原样不动。
第2个回答  2011-10-04
在中断服务程序中,PC发向单片机发出的数据,应该为P2=SBUF - 48,这里减去48是因为从电脑中发送过来的数据是ASCII码。。。需要转换一下,希望对你有所帮助
第3个回答  2013-04-01
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SM0=0;
SM1=1;
TR1=1;
REN=1;
ES=1;
EA=1;

这几个的顺序调整下。
调整成
TMOD=0x20;//T1计数器工作在模式2
TH1=0xfd;//T1初始值装载,波特率为9600;
TL1=0xfd;
TR1=1;//启动T1
SM0=0;//编程SCON寄存器,使其工作在工作方式1中
SM1=1;
REN=1;//允许接收
ES=1;//串口中断开
EA=1;//总中断开
第4个回答  2021-05-19
你的晶振是不是不对,改成11.0592

单片机通过串口发送0x00,为什么串口接收后显示为80呢
这是晶振的误差造成的,校准波特率后才能正常通信。波特率9600所对应的应该是11.0592MHz的晶振,如果是12M就会出现这个问题,我在protues仿真中把晶振频率改为11.0592M后,正常通信,没有出现错误了!这应该能帮到你!

AVR单片机我无论给串口什么值,串口都返回80
一般是波特率不匹配吧,你在下载程序的时候注意配置一下熔丝位,CKSEL[3..0]

51单片机串口通信收到乱码
单片机发送的是ASCII码,所以,串口助手接收时,要显示字符型,即十六进制显示的选项不要打勾。

单片机向串口发送数据,发送0x03串口调试助手接收到的数据位83,与发送的...
串口通信时,要注意波特率、串口电平转换,也就是说,MCU电平是TTL 5V,需将PC串口信号转成TTL 5V

单片机发送字符串给串口助手 但是串口助手接收乱码为什么?发A接收A1...
检查一下串口线,其他通信参数是否正确。或者更换一个其他串口软件验证一下,如SSCOM、格西烽火等都不错。

51单片机串口发出与接受数据不一致?
你是要测试十六进制数据的发送和接收,所以串口软件里面的HEX显示和HEX发送都要勾上!要不然你点一次发送就是14个字节出去了!

单片机通过UART向PC发送两字节数据,有时接收到的高低字节顺序会颠倒_百 ...
PC机串口一般不会出这种错误的,我觉得有两种情况:1、发送端错误;2、收发配合错误,可能中间丢了数据,比如两个08之间是否有数据丢了?你可以检查以下。

单片机串口通信 波特率已经相同了 为什么接收有差错?
从数据很明显看到出错的都是最高位,也就是帧内最后一个数据位,所以这是波特率误差累积导致的。检查你两边通讯的波特率设置参数,检查你的串口波特率计算过程和结果,检查你的单片机的时钟精度。

串口调试助手发数据单片机接收不对
串口中断函数中应避免有使用串口发送的语句SBUF=xx,这样容易产生嵌套中断,或者使程序发生错误,我想可能是中断函数的问题导致你接收错误

急急急!!!单片机串口通讯问题,返回发送数据,但是返回数据和发送的数据不...
嘿嘿,我试过了,把晶振换成11.0592的就行了

相似回答