使用51单片机与pc串口通信中数据不一致问题
我用51单片机与pc机进行串口通讯,上位机软件用的是出口调试助手3.0,下位机是我自己编的,主要目的是pc向单片机发个数据,单片机接收后向p2口输出,之后再把接收到的数据发给pc。但是我发现pc上发出与收到的数据总是不一致。例如,我用pc输出字符“123”,经单片机传回的字符就变成了“pp?p滎”。不知道是什么原因,还请各位高手赐教。
这使我编的下位机程序:
ORG 00
AJMP MAIN
ORG 23H
LJMP RECEIVE
MAIN:
mov p2,#21h
LCALL URTINIT
AJMP $
RECEIVE:
MOV A,SBUF ;将缓冲区的数据送到A
MOV P2,A
MOV SBUF,a ;将A的数据发回到电脑
JNB TI,$ ;等待数据发送完毕
CLR TI ;清发送中断标志
CLR RI ;清接收中断标志
RETI ;中断返回
URTINIT:
MOV SCON,#50H ;设置成串口1方式
MOV TMOD,#20H ;波特率发生器T1工作在模式2上
MOV TH1,#0FBH ;预置初值 9BTL=2^SMOD/32*FOSC/12/(256-TH1)
MOV TL1,#0FBH ;波特率9600
SETB TR1;启动定时器T1
SETB EA ;CPU所有中断开(IE最高位MSB)
SETB ES ;串口中断标志位
RET
end
这使我编的下位机程序:
ORG 00
AJMP MAIN
ORG 23H
LJMP RECEIVE
MAIN:
mov p2,#21h
LCALL URTINIT
AJMP $
RECEIVE:
MOV A,SBUF ;将缓冲区的数据送到A
MOV P2,A
MOV SBUF,a ;将A的数据发回到电脑
JNB TI,$ ;等待数据发送完毕
CLR TI ;清发送中断标志
CLR RI ;清接收中断标志
RETI ;中断返回
URTINIT:
MOV SCON,#50H ;设置成串口1方式
MOV TMOD,#20H ;波特率发生器T1工作在模式2上
MOV TH1,#0FBH ;预置初值 9BTL=2^SMOD/32*FOSC/12/(256-TH1)
MOV TL1,#0FBH ;波特率9600
SETB TR1;启动定时器T1
SETB EA ;CPU所有中断开(IE最高位MSB)
SETB ES ;串口中断标志位
RET
end
...全文
相关推荐
51_PC串口通信
**设置波特率**:确保PC端的串口设置与51单片机的UART波特率一致,以便正确接收和发送数据。3.
基于51单片机的串口通信(PC发字符)
串口通信 选用芯片:AT89S52 函数功能:见代码 /******************************************************************* 函数功能:PC机发送数据给单片机,每次发送3个字节(每字节为8位)的数据, 每个字节的内容为0~99无符号整数中的一个;单片机接收PC机串口发送过来的 这3个字节数据,并将它们依次以十进制方式显示在6位数码管中(每两个数码管 显示一个字节数据,例如发送数据为11,9,70,则数码管上显示11 09 70); 显示采用共
51_PC串口通信仿真
为了实现51单片机与PC的通信,我们需要设置相同的波特率、数据位、奇偶校验位和停止位,确保双方的通信协议一致。接下来,我们将探讨串口通信的发送和接收过程。
基于51单片机的按键识别和串口通信设计(内有程序)
- **电平转换**:由于RS232标准与TTL标准的电平不一致,需要使用MAX232芯片进行电平转换,以便单片机与PC之间能正确通信。
PC与单片机串口通信LCD显示其接收字符.doc
而PC与单片机之间的串口通信,单片机通常采用TTL电平,而PC采用的是RS232电平。因为电平标准的不一致,所以需要使用电平转换芯片,例如MAX232,来将两者电平匹配以保证通信正常进行。


单片机/工控
