51单片机双机通信带奇偶校验位问题
时间:10-02
整理:3721RD
点击:
我写的程序不知道哪里出错了,发送的八位数据只有符合 偶校验时让P=1,才能接收到数据并显示
发送机程序:
//===========================================================
//向串口发送字符串
//===========================================================
void putchar(uchar c) //采取偶校验 要求送出的数据都为偶校验成功的 即偶数个1
{
ACC = c;TB8 = P; //默认如果ACC中“1”的个数为偶数,硬件置P=0。 即偶校验
LED2 = ~P; //当P = 1时LED亮 ,即偶校验中P =1 ,输入有奇数个1
SBUF = c;
while(TI==0) ;
TI = 0;
}
void main()
{
uchar num;//按键次数
SCON = 0xf0; //方式3
TMOD = 0x20;
TH1=TL1=0xfd;
PCON = 0x00;
TI = 0;
TR1= 1;
// IE=0x90;
while(1)
{
if(K1==0) //K1来控制ABCD,K2 1234 ,
{
while(K1==0);
num = (num+1)%4;
}
switch(num)
{
case 1 :putchar(0x00) ; LED1 = 0;break;
case 2 :putchar(0x01) ; LED1 = 1;break;
case 3 : putchar(0x02) ;LED1 = 0;break;
case 0 :putchar(0x04) ; LED1 = 1;break;
}
delayms(100);
}
}
接收机程序
void main()
{
uchar dat;
init_lcd();
SCON = 0xf0; //方式3,并允许接收
TMOD = 0x20;
TH1=TL1=0xfd;
PCON = 0x00;
RI = 0;
TR1= 1;
while(1)
{
while(RI==0);
RI = 0;
dat = SBUF;
ACC = dat;
if (RB8 == 1)
switch(dat)
{
case 0x00: set_lcd_pos(0x00) ; write_lcd_data('A');LED1 = 0;break;
case 0x01: set_lcd_pos(0x00) ; write_lcd_data('B');LED1 = 1;break;
case 0x02: set_lcd_pos(0x00) ; write_lcd_data('C');LED1 = 0;break;
case 0x04: set_lcd_pos(0x00) ; write_lcd_data('D');LED1 = 1;break;
}
delayms(100);
}
}
即上述的0X00中P = 0就不显示 其余的P=1都可以接收并显示
跪求原因!
发送机程序:
//===========================================================
//向串口发送字符串
//===========================================================
void putchar(uchar c) //采取偶校验 要求送出的数据都为偶校验成功的 即偶数个1
{
ACC = c;TB8 = P; //默认如果ACC中“1”的个数为偶数,硬件置P=0。 即偶校验
LED2 = ~P; //当P = 1时LED亮 ,即偶校验中P =1 ,输入有奇数个1
SBUF = c;
while(TI==0) ;
TI = 0;
}
void main()
{
uchar num;//按键次数
SCON = 0xf0; //方式3
TMOD = 0x20;
TH1=TL1=0xfd;
PCON = 0x00;
TI = 0;
TR1= 1;
// IE=0x90;
while(1)
{
if(K1==0) //K1来控制ABCD,K2 1234 ,
{
while(K1==0);
num = (num+1)%4;
}
switch(num)
{
case 1 :putchar(0x00) ; LED1 = 0;break;
case 2 :putchar(0x01) ; LED1 = 1;break;
case 3 : putchar(0x02) ;LED1 = 0;break;
case 0 :putchar(0x04) ; LED1 = 1;break;
}
delayms(100);
}
}
接收机程序
void main()
{
uchar dat;
init_lcd();
SCON = 0xf0; //方式3,并允许接收
TMOD = 0x20;
TH1=TL1=0xfd;
PCON = 0x00;
RI = 0;
TR1= 1;
while(1)
{
while(RI==0);
RI = 0;
dat = SBUF;
ACC = dat;
if (RB8 == 1)
switch(dat)
{
case 0x00: set_lcd_pos(0x00) ; write_lcd_data('A');LED1 = 0;break;
case 0x01: set_lcd_pos(0x00) ; write_lcd_data('B');LED1 = 1;break;
case 0x02: set_lcd_pos(0x00) ; write_lcd_data('C');LED1 = 0;break;
case 0x04: set_lcd_pos(0x00) ; write_lcd_data('D');LED1 = 1;break;
}
delayms(100);
}
}
即上述的0X00中P = 0就不显示 其余的P=1都可以接收并显示
跪求原因!