锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

STM32F407 TFTLCD显示超声波和压力传感器模块

时间:2022-08-26 19:00:00 8f8h传感器重量传感器f1814传感器ie9203

1.首先是超声波模块

超声波模块hc-sr04.h文件

#ifndef __HC__SR04_H #define __HC__SR04_H #include "sys.h"  #define Trig PFout(1) // HC-SR04   void TIM9_CH1_Cap_Init(u32 arr,u16 psc);  void Trig_Init(void);    #endif 

超声波模块hc-sr04.c文件

#include "hc-sr04.h" #include "usart.h"  //初始化PE9为输入口.并设置定时器中断9。       //Echo IO 和定时器9初始化    void TIM9_CH1_Cap_Init(u32 arr,u16 psc) {  GPIO_InitTypeDef GPIO_InitStructure;  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  TIM_ICInitTypeDef  TIM9_ICInitStructure;  NVIC_InitTypeDef NVIC_InitStructure;     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9,ENABLE);   //TIM9时钟使能      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);  //使能PORTE时钟     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //GPIOE5  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;///复用功能  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉  GPIO_Init(GPIOE,&GPIO_InitStructure); //初始化PE5   GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_TIM9); //PE复用定时器9         TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; ///向上计数模式  TIM_TimeBaseStructure.TIM_Period=arr;   ///自动重装载值  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;     TIM_TimeBaseInit(TIM9,&TIM_TimeBaseStructure);     //初始化TIM输入捕获参数  TIM9_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01  选择输入端 IC1映射到TI1上  TIM9_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获  TIM9_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上  TIM9_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //配置输入分频,不分频   TIM9_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 输入滤波器的配置 不滤波  TIM_ICInit(TIM9, &TIM9_ICInitStructure);     TIM_ITConfig(TIM9,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断     TIM_Cmd(TIM9,ENABLE );  //使能定时器9     NVIC_InitStructure.NVIC_IRQChannel = TIM1_BRK_TIM9_IRQn;  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2.//抢占优先级2  NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能  NVIC_Init(&NVIC_InitStructure); ///根据指定参数初始化VIC寄存器、   }  //捕获状态 /[7]:0,未成功捕获;1.成功捕获一次. //[6]:0,低电平尚未捕获;1.低电平已被捕获. //[5:0]:捕获低电平后溢出次数(对于32位定时器,1us计数器加1,溢出时间:4294秒 u8  TIM9CH1_CAPTURE_STA=0; //输入捕获状态           u32 TIM9CH1_CAPTURE_VAL; //输入捕获值(TIM9是32位) ///定时器9中断服务程序   void TIM1_BRK_TIM9_IRQHandler(void) {           if((TIM9CH1_CAPTURE_STA&0X80)==0)///未成功捕获   {   if(TIM_GetITStatus(TIM9, TIM_IT_Update) == SET)//溢出   {          if(TIM9CH1_CAPTURE_STA&0X40)//已捕获高电平    {     if((TIM9CH1_CAPTURE_STA&0X3F)==0X3F)///高电平太长     {      TIM9CH1_CAPTURE_STA|=0X80;  ///标记成功捕获一次      TIM9CH1_CAPTURE_VAL=0XFFFFFFFF;     }else TIM9CH1_CAPTURE_STA  ;    }     }   if(TIM_GetITStatus(TIM9, TIM_IT_CC1) != RESET)///捕获1捕获事件   {     if(TIM9CH1_CAPTURE_STA&0X40)  ///捕获下降沿       {           TIM9CH1_CAPTURE_STA|=0X80;  ///标记成功捕获高电平脉宽     TIM9CH1_CAPTURE_VAL=TIM_GetCapture1(TIM9);//获得当前的捕获值.      TIM_OC1PolarityConfig(TIM9,TIM_ICPolarity_Rising); //OC1P=0 设置为上升沿捕获    }else          ///还没有开始,第一次捕获上升边    {     TIM9CH1_CAPTURE_STA=0;   //清空     TIM9CH1_CAPTURE_VAL=0;     TIM9CH1_CAPTURE_STA|=0X40;  ///标记捕获上升沿     TIM_Cmd(TIM5,DISABLE );  ///关闭定时器9      TIM_SetCounter(TIM9,0);      TIM_OC1PolarityConfig(TIM9,TIM_ICPolarity_Falling);  //OC1P=1 设置为下降边捕获     TIM_Cmd(TIM9,ENABLE );  //使能定时器9    }         }                        }  TIM_ClearITPendingBit(TIM9, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位 }  //初始化PF1为输出口.并使能时钟       //Trig IO初始化 void Trig_Init(void) {         GPIO_InitTypeDef  GPIO_InitStructure;   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟  //GPIOF1初始化设置  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;///普通输出模式  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化       GPIO_ResetBits(GPIOF,GPIO_Pin_1);//初始化GPIOF1为低电平   } 

配置文件缺少什么就补什么,上一篇STM32F407红外避障控制舵机有写作。


2.称重传感器模块

力传感器HX711.h文件

#ifndef __HX711_H #define __HX711_H  #include "sys.h"  #define HX711_SCK PBout(0)// PB0 #define HX711_DOUT PBin(1)// PB1   extern void Init_HX711pin(void); extern u32 HX711_Read(void); extern void Get_Maopi(void); extern void Get_Weight(void);  extern u32 HX711_Buffer; extern u32 Weight_Maopi; extern s32 Weight_Shiwu; extern u8 Flag_Error;  #endif  

压力传感器HX711.c文件

#include "HX711.h" #include "delay.h"  u32 HX711_Buffer=0; u32 Weight_Maopi=0; s32 Weight_Shiwu=0; u8 Fag_Error = 0;

//校准参数
//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
//该值可以为小数
#define GapValue 285

void digitalWrite(GPIO_TypeDef * GPIO,int pin,int value)
{
	if(value==1)//set 1
{
		GPIO_SetBits(GPIO,pin);
}
if(value==0)//reset 0
	{
		GPIO_ResetBits(GPIO,pin);
	}
}

int digitalRead(GPIO_TypeDef * GPIO,int pin)
{
	return GPIO_ReadInputDataBit(GPIO,pin);
}




void Init_HX711pin(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
GPIO_InitTypeDef  GPIO_InitStructure1;	

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

  //SCK
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

  //DOUT
  GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_1 ;
  GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_IN;
  //GPIO_InitStructure1.GPIO_OType = GPIO_OType_OD; 
  GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure1.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOB, &GPIO_InitStructure1);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//初始化设置为0
}

//读取HX711
u32 HX711_Read(void)	//增益128
{
	unsigned long count; 
	unsigned char i=0; 
//  HX711_DOUT=1; 
  while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1));
	delay_us(1);
	
	HX711_SCK=0; 
	count=0;
  	 delay_us(1);
  //	while(HX711_DOUT); 
	while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1));
  	for(i=0;i<24;i++)
	{ 
		delay_us(100); 
	  	HX711_SCK=1; 
	  	count=count<<1; 
		delay_us(1);
		HX711_SCK=0; 
	  	if(HX711_DOUT)
			count++; 
		delay_us(1);
	} 
 	HX711_SCK=1; 
    count=count^0x800000;//第25个脉冲下降沿来时,转换数据
	delay_us(1);
	HX711_SCK=0;  
	delay_us(1); 
	return (count);
}

//获取毛皮重量
void Get_Maopi(void)
{
	Weight_Maopi = HX711_Read();	
} 

//称重
void Get_Weight(void)
{
	HX711_Buffer = HX711_Read();
	if(HX711_Buffer > Weight_Maopi)			
	{
		Weight_Shiwu = HX711_Buffer;
		Weight_Shiwu = Weight_Shiwu - Weight_Maopi;				//获取实物的AD采样数值。
		Weight_Shiwu = (s32)((float)Weight_Shiwu/GapValue); 	//计算实物的实际重量
																		                    //因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。
																		                   //当发现测试出来的重量偏大时,增加该数值。
																		                   //如果测试出来的重量偏小时,减小改数值。
	}

	
}

到TFT LCD显示模块的lcd.h和lcd.c代码过长,百度下载引入即可用


3.到主程序部分

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "hc-sr04.h"
#include "lcd.h"
#include "HX711.h"
 
extern u8  TIM9CH1_CAPTURE_STA;		//输入捕获状态		    				
extern u32	TIM9CH1_CAPTURE_VAL;	//输入捕获值  

int main(void)
{ 
	float temp=0;  
	u8 complete = 1;                                  //一次采集完成标志
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);  //初始化延时函数
	uart_init(115200);//初始化串口波特率为115200
	LCD_Init();           //初始化LCD FSMC接口
	Trig_Init();
 	TIM9_CH1_Cap_Init(0XFFFFFFFF,84-1); //以1Mhz的频率计数 timer9是32位的。
	Init_HX711pin();
	delay_ms(2000);
	Get_Maopi();				//称毛皮重量
	delay_ms(100);
	POINT_COLOR=RED;      //画笔颜色:红色
   	while(1)
	{
		if(complete == 1)
		{
			Trig = 1;
			delay_us(15);
			Trig = 0;
			complete = 0;
		}
		while(complete == 0)
		{
			if(TIM9CH1_CAPTURE_STA&0X80)        //成功捕获到了一次高电平
			{
				temp=TIM9CH1_CAPTURE_STA&0X3F; 
				temp*=0XFFFFFFFF;		 		         //溢出时间总和
				temp+=TIM9CH1_CAPTURE_VAL;		   //得到总的高电平时间
				temp = temp * 17/1000; //得到距离		
				printf("HIGH:%f cm\r\n",temp); //打印距离
				delay_ms(1000);
				LCD_ShowNum(50,10,temp,3,16); //TFT LCD打印距离
				TIM9CH1_CAPTURE_STA=0;			     //开启下一次捕获
				complete = 1;
			}
		}
			Get_Weight();
			Get_Maopi();
		printf("净重量 = %d g\r\n",Weight_Shiwu); //打印 
		printf("毛坯 = %d g\r\n",Weight_Maopi); //打印 
		printf("重量 = %d g\r\n",HX711_Buffer); //打印 
		delay_ms(1000);
		LCD_ShowNum(50,50,Weight_Shiwu,8,16); //TFT LCD打印输出
		LCD_ShowNum(50,100,Weight_Maopi,8,16);
		LCD_ShowNum(50,150,HX711_Buffer,8,16);
	}
}

 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章