求助各位大佬

2019-07-21 01:45发布

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

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
www88988
1楼-- · 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毫米
       }
   }
......
}
十一和一百一十
2楼-- · 2019-07-21 03:42
可以有偿帮你写。QQ:1035966084
245925587
3楼-- · 2019-07-21 05:00
 精彩回答 2  元偷偷看……
南风过境蜻蜓飞
4楼-- · 2019-07-21 10:05
245925587 发表于 2019-5-8 17:15
为什么感觉好像我之前帮人写过这个传感器的程序

大佬能给个思路方法吗
245925587
5楼-- · 2019-07-21 14:55
 精彩回答 2  元偷偷看……
xiedonghui258
6楼-- · 2019-07-21 15:30
本帖最后由 xiedonghui258 于 2019-5-8 19:29 编辑

TIM图片20190508185923.png
这里貌似已经写的很清楚了吧。。
首先,你将这个线的Tx和你板子的Rx相连接。如串口1(USART1)
然后,配置好USART1,和上面的一致,数据位 8位,停止位1位,无奇偶校验,波特率为9600.
开启串口接受中断。
然后,在你的接受中断中,
uint8_t usartRXStatus = 0;
uint8_t resBuf[4] = {0};
uint16_t distance = 0;

void USART1_IRQHandler(void)
{
   uint8_t res = 0;
   if(USART_GetITStatus( RS485_USART, USART_IT_RXNE ) != RESET)
   {
       USART_ClearITPendingBit(RS485_USART,USART_IT_RXNE);
       res = USART_ReceiveData( RS485_USART );
       resBuf[usartRXStatus] = res;
       if(usartRXStatus == 0)
       {
           usartRXStatus = (0xFF != res)?0:usartRXStatus+1;
       }
       else if (usartRXStatus>0)
       {
           usartRXStatus++;
           if(usartRXStatus == 4)
           {
               usartRXStatus = 0;
               if(resBuf[3] == (resBuf[0]+resBuf[1]+resBuf[2])&0xff)
               {
                    distance = resBuf[1]*256+resBuf[2];
               }
           }
       }
   }
}

大概 应该是这样了吧、、






一周热门 更多>