OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2167|回复: 10

求助各位大佬

[复制链接]

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2019-4-29
在线时间
34 小时
发表于 2019-5-8 16:36:29 | 显示全部楼层 |阅读模式
1金钱
向各位大佬求助求助:一个超声波液位传感器,传感器资料附件,想让它与STM32单片机进行数据传输,该怎么写代码呢?

DYP-RD-产品规格书(DS1603L V1.0)-180115-A0.pdf

1.14 MB, 下载次数: 5

最佳答案

查看完整内容[请看2#楼]

这个也太简单了吧,就是个串口通信。把线接对了,把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_APB2Peri ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

79

帖子

0

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2016-5-27
在线时间
91 小时
发表于 2019-5-8 16:36:30 | 显示全部楼层
这个也太简单了吧,就是个串口通信。把线接对了,把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毫米
       }
   }
......
}
回复

使用道具 举报

7

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
342
金钱
342
注册时间
2019-4-28
在线时间
177 小时
发表于 2019-5-8 16:40:26 | 显示全部楼层
可以有偿帮你写。QQ:1035966084
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2019-5-8 17:15:50 | 显示全部楼层
为什么感觉好像我之前帮人写过这个传感器的程序
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2019-4-29
在线时间
34 小时
 楼主| 发表于 2019-5-8 17:20:53 | 显示全部楼层
245925587 发表于 2019-5-8 17:15
为什么感觉好像我之前帮人写过这个传感器的程序

大佬能给个思路方法吗
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2019-5-8 17:43:50 | 显示全部楼层
南风过境蜻蜓飞 发表于 2019-5-8 17:20
大佬能给个思路方法吗

就是串口通讯解析呀
回复

使用道具 举报

8

主题

206

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-4-6
在线时间
234 小时
发表于 2019-5-8 19:28:24 | 显示全部楼层
本帖最后由 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];
               }
           }
       }
   }
}

大概 应该是这样了吧、、






回复

使用道具 举报

0

主题

79

帖子

0

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2016-5-27
在线时间
91 小时
发表于 2019-5-8 19:30:03 | 显示全部楼层
www88988 发表于 2019-5-8 19:28
这个也太简单了吧,就是个串口通信。把线接对了,把USART1配置好
VCC -> 5V     GND -> GND    TX  -> STM ...

USART_REC_LEN  用 100 替代 忘了改这了。
回复

使用道具 举报

0

主题

79

帖子

0

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2016-5-27
在线时间
91 小时
发表于 2019-5-8 19:35:26 | 显示全部楼层
www88988 发表于 2019-5-8 19:30
USART_REC_LEN  用 100 替代 忘了改这了。

把中断函数中的 这句话给改没了 加上 USART_ClearITPendingBit(USART1,USART_IT_RXNE);
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2019-4-29
在线时间
34 小时
 楼主| 发表于 2019-5-8 21:41:14 | 显示全部楼层
www88988 发表于 2019-5-8 19:35
把中断函数中的 这句话给改没了 加上 USART_ClearITPendingBit(USART1,USART_IT_RXNE);

非常感谢感谢您 我消化消化  
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2019-4-29
在线时间
34 小时
 楼主| 发表于 2019-5-8 21:46:35 | 显示全部楼层
xiedonghui258 发表于 2019-5-8 19:28
这里貌似已经写的很清楚了吧。。
首先,你将这个线的Tx和你板子的Rx相连接。如串口1(USART1)
然后, ...

非常感谢感谢   热心的您   
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 05:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表