打印

串口跟PC机通信的D4和D5位数据异常!第17章实验2

[复制链接]
2140|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gdqinci|  楼主 | 2010-5-30 21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gdqinci 于 2010-6-1 11:43 编辑

#include <REG51.H>
#define uchar unsigned char
#define uint unsigned int
uchar a=0xff,b;
//-------------------------------------
void init(void)
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
TR1=1;
ES=1;
EA=1;
}
//-------------------------
void delay(uint k)
{
uint data i,j;
for(i=0;i<k;i++)
    {
  for(j=0;j<121;j++)
     {;}
}
}
//===============
void main(void)
{
delay(2);
init();
while(1)
{
  P1=a;
  if(RI)
  {
   RI=0;
   SBUF=b;
   while(!TI);
111
   TI=0;
   EA=1;
   }
  }
}
//======================
void serial_serve(void) interrupt 4
{
a=SBUF;
b=a;
EA=0;
}

这样的串口通信程序数据投到P0口用8*LED显示出来的D4D5不正确

比如我用串口软件在PC上发1到单片机,然后在P0口显示收到的数据
正常情况下应该是#00000001B 才对
但P0口显示的数据却是#00110001B

如果我用串口软件在PC上发3到单片机,
正常情况下应该是#00000011B 才对
但P0口显示的数据却是#00110011B

不知道为什么总是多了D4D5这两个位??

相关帖子

沙发
ayb_ice| | 2010-5-31 09:16 | 只看该作者
重点查波特率

使用特权

评论回复
板凳
gdqinci|  楼主 | 2010-5-31 09:25 | 只看该作者
波特率是9600
用定时器T1工作模式2
串口软件那边的波特率也是9600
PC机系统的串口波特率要不要调呢???

使用特权

评论回复
地板
ayb_ice| | 2010-5-31 09:26 | 只看该作者
是要去验证,不是理论上

使用特权

评论回复
5
gdqinci|  楼主 | 2010-6-1 11:38 | 只看该作者
可以通讯啊,但就是为什么收到的数据不是发送过来的那个
比如发送:0x01    即相当于#00000001B
收到的是:0x31    即相当于#00110001B

第4和第5位莫名其妙地变成1

使用特权

评论回复
6
gdqinci|  楼主 | 2010-6-1 11:40 | 只看该作者
书里面的给出的程序例子也是这么写,每次收到数据后都先送去0x30

也就是说书里面预先就知道了收到的数据会多出0x30的,但这是为什么呀???

使用特权

评论回复
7
ayb_ice| | 2010-6-1 11:41 | 只看该作者
不奇怪的
波特率相差很大<甚至几倍>,都可能可以通信,但数据接收一般是错的,这取决于具体数据

使用特权

评论回复
8
gdqinci|  楼主 | 2010-6-1 11:42 | 只看该作者
如果是波特率不正确的话那应该是连通讯都不正常的了,但现在是连原书作者都知道收到的数据会多出
0x30  但是为什么会多他在书中就没说了

使用特权

评论回复
9
冷漠| | 2010-6-1 13:09 | 只看该作者
本帖最后由 冷漠 于 2010-6-1 13:11 编辑

嗨!闹了半天,原来你用串口软件发送的是ASCII码!ASCII码:
0=0x30;
3=0x33;
1=0x31....

不信你发个a,或者b /c/d / f  看看收到得是什么,或者你在PC串口助手软件发送端设定16进制发送。

使用特权

评论回复
10
gdqinci|  楼主 | 2010-6-2 08:43 | 只看该作者
谢谢,我去看一看

使用特权

评论回复
11
gdqinci|  楼主 | 2010-6-2 09:47 | 只看该作者
没错那个软件传送的是ASCII码,而0在ASCII码中排位048写成16进制就是0x30

所以传送完成后要显示出来的话必须先减去0x30

使用特权

评论回复
12
shangken| | 2010-6-2 13:07 | 只看该作者
建议用示波器看一下,你发的数据,然后计算一下波特率,还有就是电平是否正确,你的电平是TTL,计算机的不是,要有转换电平芯片的.

使用特权

评论回复
13
shibao21ic| | 2010-6-2 15:44 | 只看该作者
我也做过类似的实验,后来也发现是ASCII码问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

341

帖子

2

粉丝