51单片机怎么编制C51程序,实现双机通讯,9位数据传输,发送方和接收方将数据显示在P1口,利用第九位控制蜂鸣器。

编制C51程序,实现双机通讯,9位数据传输,发送方和接收方将数据显示在P1口,利用第九位控制蜂鸣器。

img

双机怎么连接

既然是串口通讯,当然是接TXD RXD,交叉接,再接个公共的地线
如果不是特殊要求,建议用8位数据模式传两次,这样方便用电脑调试,电脑不支持9位数据模式。
单片机之间直接用9位模式也行,你只要知道去哪里读第九个bit就可以了

建议采用模拟SPI
下面是其他芯片例程,其实原理一样
接线图

img

#define   SCK3_L         GPIOB->PBC  =  GPIO_PIN_3
#define   SCK3_H         GPIOB->PBSC =  GPIO_PIN_3 

#define   CSN3_L          GPIOB->PBC  =  GPIO_PIN_4
#define   CSN3_H          GPIOB->PBSC =  GPIO_PIN_4 

#define   MOSI3_L          GPIOB->PBC  =  GPIO_PIN_6
#define   MOSI3_H          GPIOB->PBSC =  GPIO_PIN_6 

#define   MISO3          (GPIOB->PID & GPIO_PIN_5) 



//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/
//函数名:SpisendByte(INT8U dat)
//输入:
//输出:无
//功能描述:
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/
u8 SpiTxRxByte3(u8 dat)
{
    u8 i,temp;
    temp = 0;
    
    SCK3_L;
    for(i=0; i<8; i++)
    {
        if(dat & 0x80)
        {
            MOSI3_H;
        }
        else MOSI3_L;
        dat <<= 1;

        SCK3_H; 
        delay_us(50);

        temp <<= 1;
        if(MISO3!=0) temp++; 
        SCK3_L;
        delay_us(50);    
    }
    return temp;
}


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/
//函数名:void halSpiReadBurstReg3(u8 addr, u8 *buffer, u8 count) 
//输入:
//输出:无
//功能描述:从机取数据
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/
void halSpiReadBurstReg3(u8 addr, u8 *buffer, u8 count) 
{
    u8 i;
    
    CSN3_L;
    delay_us(50);
    
    while (MISO3!=0);
 
    for (i = 0; i<count; i++) 
    {
        buffer[i] = SpiTxRxByte3(0X55);
    }
    CSN3_H;
}

//从机读取数据
 halSpiReadBurstReg3(0x55,spiTab,9); 
 printf("spiTab[0]=%x",spiTab[0]);        
 printf("  spiTab[1]=%x",spiTab[1]);       
 printf("  spiTab[2]=%x",spiTab[2]);    
....................................................    
 printf("  spiTab[8]=%x\r\n",spiTab[8]);