求助各位大佬

2019-07-21 01:45发布

向各位大佬求助求助:一个超声波液位传感器,传感器资料附件,想让它与STM32单片机进行数据传输,该怎么写代码呢?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
www88988
2019-07-21 01:50
这个也太简单了吧,就是个串口通信。把线接对了,把USART1配置好
VCC -> 5V     GND -> GND    TX  -> STM_A10     RX -> NC(不接,因为不用发送)

u8  USART1_In,USART1_Out;
u8  USART1_RX_BUF[100];

void uart_init()
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       
  GPIO_Init(GPIOA, &GPIO_InitStructure);
     
  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;       
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       
  NVIC_Init(&NVIC_InitStructure);       
  
  USART_Init(USART1, &USART_InitStructure);
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  USART_Cmd(USART1, ENABLE);      
}

void USART1_IRQHandler(void)
{
   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
   {
     USART1_RX_BUF[USART1_In++] = USART_ReceiveData(USART1);
     if(USART1_In>=100) USART1_In=0;                       
   }
}
u16 GetData(void)
{
    union
    {
       u8   c[2];
       u16  x;
     }tp;
    tp.x=0;
    if(USART1_Out != USART1_In)
    {
      tp.c[0]=USART1_RX_BUF[USART1_Out++];
      if(USART1_Out>=USART_REC_LEN) USART1_Out=0;
      tp.c[1]=1;      
     }        
    return tp.x;
}

u16 ReadDs1603(void)
{
   union
    {
       u8   c[2];
       u16  x;
     }tp;
   u16 value=0;
   u8  dataH=0;
   u8  dataL=0;
   u8  sum=0;
   u8  i=0;
   u8  data[4]={0};
   tp.x=GetData();
   if((1==tp.c[1])&&(0xff==tp.c[0]))
   {
      data[0]=tp.c[0];
      i=1;
      while(i<4)
      {
         tp.x=GetData();
         if(tp.c[1])
         {
            data[i++]=tp.c[0];
            tp.x=0;
          }
       }
     sum=(data[0]+data[1]+data[2])&0x00ff;
     if(sum==data[3])
     {
        value = data[1]*256 + data[2];
      }
    }
   return value;
}
int main(void)
{
   u16 value=0;
......
  while(1)
  {
      value=ReadDs1603();
      if(value!=0)
      {
         //你的处理代码 value就是测得的液面距离value毫米
       }
   }
......
}

一周热门 更多>