液位传感器(双串口)

超声波液位传感器

一、产品的参数

DS1603L(串口信号)
在这里插入图片描述

一)产品阐述

超声波液位探测传感器,采用超 声波穿透技术,实现对容器内的液体高度非接触探测,把液体高 度值转化成电信号输出。
在这里插入图片描述

###二 ) 产品特点
1、实现非接触探测,不接触被测液体
2、精度高,实时输出液体高度值
3、适用各种不同密度、形态的液体
4、适用各种材质及厚度的容器
5、体积小、易安装,适用各种液体探测场合
6、产品性能可靠,抗干扰能力强

三)适用范围

本产品适用于各种液体实时探测,特别适用于不能接触液体 的探测。已经广泛应用于,饮料生产、家用电器、医疗设备、饮 水设备、化工设备、工业自动化、各行业危险液体物品探测。

四)电器参数

在这里插入图片描述

五)产品尺寸示意图

在这里插入图片描述

六)接线引脚定义

在这里插入图片描述

七)品质参数

在这里插入图片描述

八)数据输出格式

在这里插入图片描述

传感器发送出四个字节的数据,不难看出我们需要一个数组去接收数据

九)LED 指示灯状态说明

1、LED 长亮:模组通电但没有探测到液体。
== 2、LED 慢闪:模组探测到液体时,LED 指示灯以每秒 1 次频率闪烁。==

十)可靠性测试条件

在这里插入图片描述

十一)注意事项

特别注意的一点:传感器和北测物体之间要有耦合剂(商家配送、或者用洗洁精、沐浴露代替,不过在高温下容易干)
1、产品实际应用中,液体容器所用的材质、容器的厚度会导致不 同的盲区。
2、产品实际应用中,在有效探测量程内,液面晃动会导致探测数 据偏离。

二、程序的调试

一)调式流程图:

串口3接收数据
串口1把数据发送给电脑的串口 XCOM或者vofa
传感器
F103
电脑

二)代码:

usart.h

#ifndef __USART_H
#define __USART_H
#include "stdio.h"    
#include "sys.h" 
#define USART_REC_LEN              200      //定义最大接收字节为200
#define EN_USART3_RX             1        //使能(1)/禁止(0)串口1接收
          
extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲
extern u16 USART_RX_STA;                 //接收状态标记  
//串口中断接收的定义
void uart_init(u32 bound);
void uart3_init(u32 bound);
#endif

usart.c

#include "sys.h"
#include "usart.h"	 
#include "stdio.h"

// 	 
#if SYSTEM_SUPPORT_OS
#include "includes.h"					// ucos使用       
#endif
 
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)             
//标志库需要的支持函数               
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定义_sys-exit()以避免使用半主机模式  
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0)//
	{
		
	}
    USART1->DR = (u8) ch;      
	return ch;
}
#endif 

/*使用microLib的方法*/
 /* 
int fputc(int ch, FILE *f)
{
	USART_SendData(USART1, (uint8_t) ch);

	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}	
   
    return ch;
}
int GetKey (void)  { 

    while (!(USART1->SR & USART_FLAG_RXNE));

    return ((int)(USART1->DR & 0x1FF));
}
*/
 
#if EN_USART3_RX   //如果使能了接收 	
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲
u16 USART_RX_STA=0;       // 接收状态标记 
void uart_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GOIPA时钟
  
	//USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//
   
  //USART1_RX	  GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//GPIOA.10  

  //Usart1 NVIC 
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	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;	//收发模式

  USART_Init(USART1, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART1, ENABLE);                    //使能串口1

}
void uart3_init(u32 bound){
  //GPIO端口的设置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);	//使能usart3,GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	//USART3_TX   GPIOB.10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11
   
  //USART3_RX	  GPIOB.11初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10

  //Usart3 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置 
	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	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;	//收发模式

  USART_Init(USART3, &USART_InitStructure); //初始化串口3
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接收中断
  USART_Cmd(USART3, ENABLE);                    //使能串口3

}
void USART3_IRQHandler(void)                	//串口3中断服务程序
	{

    static char i=0;	//static函数返回后值不变
			
    USART_RX_BUF[i]=USART_ReceiveData(USART3);//USART_RX_BUF[]用来保存接收到的数据
		if( USART_RX_BUF[0]==0xFF )//判断接收的数据是否为0xff
		{
			       i++;
						i=i==4?0:i;//如果i等于4则返回,不等于则返回本身
//				if(sum != (USART_RX_BUF[0]+ USART_RX_BUF[1]+ USART_RX_BUF[2])&0x00FF)//校验数据
//					{
//							 USART_RX_BUF[i]=0;
//					}

    }  
 }	

#endif	

main.c

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
 int main(void)
 {	
	 static int a;
	 a=USART_RX_BUF[1]*256+USART_RX_BUF[2];
	delay_init();    	 //	 延时函数初始化 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组2
  uart_init(9600);	 	//波特率设置,按照传感器给的波特率
	uart3_init(9600);
	LED_Init();		  		//初始化与led连接的硬件接口
  LCD_Init();				//初始lcd  
	POINT_COLOR=BLUE;//
  LCD_ShowString(30,140,300,16,16,"zhentou:"); 
	LCD_ShowString(30,160,300,16,16,"diyigezijie");
  LCD_ShowString(30,180,300,16,16,"diergezijie");
  LCD_ShowString(30,200,300,16,16,"yeweizhi");
//	if(sum == (USART_RX_BUF[0]+ USART_RX_BUF[1]+ USART_RX_BUF[2])&0x00FF)// 校验数据
//					{
//							yewei=USART_RX_BUF[1]*256+USART_RX_BUF[2];
//					}
	while(1)
	{	
		LCD_ShowxNum(30+11*8,140,USART_RX_BUF[0],4,16,0);//帧头
	    LCD_ShowxNum(30+11*8,160,USART_RX_BUF[1],4,16,0);//第二个字节
	    LCD_ShowxNum(30+11*8,180,USART_RX_BUF[2],4,16,0);//传感器发送过来的第三个字节
	    LCD_ShowxNum(30+11*8,200,USART_RX_BUF[1]*256+USART_RX_BUF[2],4,16,0);//液位值
//		LED0=!LED0;

		
		printf("%d  \n",USART_RX_BUF[1]*256+USART_RX_BUF[2]);//直接打印数据
/*把数据发送到串口3(输出的为ascll)*/
//		USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发数据
//		while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
		delay_ms(100);	
				
	} 
}
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值