微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机双机通信带奇偶校验位问题

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都可以接收并显示
跪求原因!


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top