为什么我用两个
单片机做实验,一个很简单的程序,让甲发送信息(0x60)给乙,在没收到乙的反馈信息(0x50)前,甲一直发送数据,而乙接收到数据后就发送个反馈信息给甲。为什么乙每次都能收到甲的信息,但乙的反馈信息却传不回甲处?极少数情况能传回甲处。
另外,不知我的奇校验子程序是否有问题呢?能提供个串口
通信带奇偶校验例程吗?!
这是我的程序:
甲单片机:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit start=P0^0;//发光二极管,用来检测数据是否在发送
unsigned char a=0xff,i=100,b,jieshou;
void delay(unsigned int m) //延时程序
{
unsigned int i,j;
for(i=0; i<m; i++)
for(j=0; j<110; j++);
}
bit jiaoyan(uchar m)//奇校验
{
int i;
bit tmp;
for(i=0;i<8;i++)
{
tmp=tmp^m&0x01;
m>>=1;
}
tmp=~tmp;
return tmp;
}
void main()
{
SCON=0xd0;//串口通信方式3
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;//开计数器
EA=1;
ES=1;//开串口中断
ti=0;
RI=0;
while(jieshou!=0x50)
{
TB8=jiaoyan(0x60);
SBUF=0x60;
delay(1100);
start=0;
delay(1100);
start=1;
}
start=0;
while(1);
}
void ser0() interrupt 4//串口中断
{
uchar temp;
ES=0;
if(TI==1)
{ TI=0;
}
if(RI==1)
{
temp=SBUF;
if(RB8==jiaoyan(temp))
{
jieshou=temp;
}
// else
// {jieshou=0xff;}
RI=0;
}
ES=1;
}
乙单片机:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit start=P0^0;//发光二极管,用来检测数据是否在发送
unsigned char a=0xff,i=100,b,jieshou,xh=1;
void delay(unsigned int m) //延时程序
{
unsigned int i,j;
for(i=0; i<m; i++)
for(j=0; j<110; j++);
}
bit jiaoyan(uchar m)//奇校验
{
int i;
bit tmp;
for(i=0;i<8;i++)
{
tmp=tmp^m&0x01;
m>>=1;
}
tmp=~tmp;
return tmp;
}
void main()
{
SCON=0xd0;//串口通信方式3
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;//开计数器
EA=1;
ES=1;//开串口中断
TI=0;
RI=0;
while(jieshou!=0x60);
while(jieshou==0x60)(这个语句总是判断不到,当接收到甲的信号后,就直接跳到下一个语句停在while(1);处了,而不是进行循环发送,而我如果改成while(i--);就能进行循环,但要在发送几十次后才能成功让甲单片机收到信号)
{
TB8=jiaoyan(0x50);
SBUF=0x50;
start=0;
delay(2200);
start=1;
delay(1100);
}
start=0;
while(1);
}
void ser0() interrupt 4//串口中断
{
uchar temp;
ES=0;
if(TI==1)
{ TI=0;
}
if(RI==1)
{
temp=SBUF;
if(RB8==jiaoyan(temp))
{
jieshou=temp;
}
// else
// {jieshou=0xff;}
RI=0;
}
ES=1;
}
if(RB8==jiaoyan(temp)) 这句话改掉试试看
评分
查看全部评分
一周热门 更多>