51单片机串行通行时 接收到的数据和发送的数据不一致

高手请进本人初学单片机,写了一段程序想实现串口通信,结果发现发送的数据和接收到的不一样,程序如下:上位机:#include<stdio.h>#include<reg52.... 高手请进
本人初学单片机,写了一段程序想实现串口通信,结果发现发送的数据和接收到的不一样,程序如下:
上位机:
#include<stdio.h>
#include<reg52.h>
unsigned short int str[7];
unsigned short int IDR[6]={212,122,123,124,125,126};
void main()
{
int i,k;
SCON=0X80;
PCON=0X80;
TI=0;
for(k=0;k<6;k++)
{
SBUF=IDR[k];
while(TI==0);
TI=0;
for(i=0;i<7;i++)
{
RI=0;
REN=1;
while(RI==0);
str[i]=SBUF;
RI=0;
}
if(k==5)
k=0;
}
}
下位机:
#include<stdio.h>
#include<reg52.h>
unsigned short int str[7]={0x11,0x34,0x24,0xa5,0xf3,0x3e};
void main()
{
short i,k ;
unsigned short int IDR;
SCON=0x80;
PCON=0X80;
RI=0;
REN=1;
EA=1;
ES=1;
PCON=0X81;
IDR=SBUF;
P1=IDR;
ES=0;
while(IDR==212)
{
for(i=0;i<7;i++)
{
TI=0;
SBUF=str[i];
while(TI==0);
TI=0;
k=1;
while(k!=0)
k--;
}
}
}
void D_accept(void)interrupt 4
{
RI=0;
}
运行程序时发现上位机输出的是212,没错,可是下位机运行时,P1口输出的却是252,改变RDI[0]的值为21,上位机输出是21,下位机P1口输出的是248,程序是在proteus中仿真的,本人菜鸟,搞了一天了,就是不行,还请高手指点,急等,谢谢!
展开
 我来答
塞千山057
2010-06-02 · TA获得超过263个赞
知道小有建树答主
回答量:158
采纳率:0%
帮助的人:188万
展开全部
1 T1时钟初值都没配置,复位默认为0,也就是说波特率都没有配置,幸运的是两片单片机都没配置,也就是波特率刚好相等。
2 单片机程序最基本运行程序就是错的,没有死循环,程序只执行了一遍,然后就胡乱运行,怎么可能按你的要求运行。

建议不要改程序,还是重新学写程序,
买块开发板,按照附带的例程 理解后再写
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
顿邦us
2010-05-24 · 超过24用户采纳过TA的回答
知道答主
回答量:51
采纳率:0%
帮助的人:53.7万
展开全部
1.下位机IDR=SBUF;这一句为什么不是放在接收中断函数里?
2. 用proteus 学单片机很方便,特别对于新手来说,但是proteus用得久的人都知道毕竟是“仿”真,有很多地方仿得不够真的。其中串口就是其中之一。仿真数字逻辑还好点,模拟电路就差远了。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
miniappFlLggxkoNJGVm
2010-05-24 · TA获得超过513个赞
知道小有建树答主
回答量:447
采纳率:0%
帮助的人:324万
展开全部
串口通信检查一下波特率是不是一致的,在串口通讯的时候要先发 0x02检测是否相通。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
47okey
2010-05-24 · TA获得超过1.2万个赞
知道大有可为答主
回答量:5900
采纳率:75%
帮助的人:2379万
展开全部
proteus仿真串口,很好用的,特别是用来调试时。
波特率对吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式