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中仿真的,本人菜鸟,搞了一天了,就是不行,还请高手指点,急等,谢谢! 展开
本人初学单片机,写了一段程序想实现串口通信,结果发现发送的数据和接收到的不一样,程序如下:
上位机:
#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中仿真的,本人菜鸟,搞了一天了,就是不行,还请高手指点,急等,谢谢! 展开
4个回答
展开全部
1 T1时钟初值都没配置,复位默认为0,也就是说波特率都没有配置,幸运的是两片单片机都没配置,也就是波特率刚好相等。
2 单片机程序最基本运行程序就是错的,没有死循环,程序只执行了一遍,然后就胡乱运行,怎么可能按你的要求运行。
建议不要改程序,还是重新学写程序,
买块开发板,按照附带的例程 理解后再写
2 单片机程序最基本运行程序就是错的,没有死循环,程序只执行了一遍,然后就胡乱运行,怎么可能按你的要求运行。
建议不要改程序,还是重新学写程序,
买块开发板,按照附带的例程 理解后再写
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.下位机IDR=SBUF;这一句为什么不是放在接收中断函数里?
2. 用proteus 学单片机很方便,特别对于新手来说,但是proteus用得久的人都知道毕竟是“仿”真,有很多地方仿得不够真的。其中串口就是其中之一。仿真数字逻辑还好点,模拟电路就差远了。
2. 用proteus 学单片机很方便,特别对于新手来说,但是proteus用得久的人都知道毕竟是“仿”真,有很多地方仿得不够真的。其中串口就是其中之一。仿真数字逻辑还好点,模拟电路就差远了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
串口通信检查一下波特率是不是一致的,在串口通讯的时候要先发 0x02检测是否相通。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
proteus仿真串口,很好用的,特别是用来调试时。
波特率对吗?
波特率对吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询