STM32F407 TFTLCD显示超声波和压力传感器模块
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; //GPIOE5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉GPIO_Init(GPIOE,&GPIO_InitStructure); //初始化PE5GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_TIM9); //PE5复用位定时器9TIM_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);//初始化TIM9输入捕获参数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 ); //使能定时器9NVIC_InitStructure.NVIC_IRQChannel = TIM1_BRK_TIM9_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2NVIC_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 ); //关闭定时器9TIM_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;//100MHzGPIO_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)// PB1extern 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 Flag_Error = 0;//校准参数
//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
//该值可以为小数
#define GapValue 285void 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);//SCKGPIO_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);//DOUTGPIO_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);//设置系统中断优先级分组2delay_init(168); //初始化延时函数uart_init(115200);//初始化串口波特率为115200LCD_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);}
}
STM32F407 TFTLCD显示超声波和压力传感器模块相关推荐
- 使用STM32F407读取HX711压力传感器模块
hx711是一个很常见的压力传感器模块,精度很高,在平时做嵌入式开发的时候也常常遇到.但是在网上找到的代码往往都很老了,用现在常用的stm32板子都或多或少有一些问题,尤其是在一些购买该模块地方那里要 ...
- 普中stm32开发板tftlcd显示图片_STM32实例TFTLCD介绍
以前我们用 51 单片机控制 TFTLCD(TFT 液晶屏)时,使用的是 IO 口模拟80 接口时序.这次我们来学习如何使用 STM32F1 的 FSMC(灵活的静态存储控制器)接口控制 TFTLCD ...
- 利用LCD1602显示超声波测距
利用LCD1602显示超声波测距 介绍 一.需要的器件 二.原理 工程代码 一. LCD1602 二.超声波测距及主程序 运行图 介绍 一.需要的器件 51单片机:任意一款都可以,我这里使用的是STC ...
- 收发一体超声波测距离传感器模块_空气中70KHZ超声波换能器传感器探头DYA-70-03A测距探头3米量程...
空气中70KHZ超声波换能器传感器探头DYA-70-03A测距探头3米量程 CT50数字式超声波探伤仪 焊缝探伤测量仪器 金属探伤检测仪 现货,上海身高体重秤 超声波身高体重秤 全自动身高体重称测量仪 ...
- STM32F103 TFTLCD显示实验(一)
文章内容 本文将介绍有关TFTLCD的有关知识,包括几个部分,分别如下: TFTLCD简介 相关指令 配置步骤 FSMC简介 由于篇幅过长,因此,代码讲解放到下一章中,链接如下: STM32F103 ...
- 基于正点原子stm32的mini板的TFTLCD显示实验
本章将讲述TFTLCD显示实验,小白总结,如有错误,请大神指教. 一.TFTLCD 简介 1.TFT-LCD 即薄膜晶体管液晶显示器.TFT-LCD具有:亮度好.对比度高.层次感强.颜色鲜艳等特点.是 ...
- OLED显示超声波测距
OLED显示超声波测距 超声波 OLED 接线 测距程序 arduino 一个简单的点灯程序 下期学习内容规划 超声波 基本原理 TRIG引脚负责发送超声波脉冲串.此引脚应设置为高电平10μs,此时H ...
- STM32单片机TFTLCD显示实验:TFTLCD简介
STM32单片机TFTLCD显示实验学习笔记 1.TFTLCD模块接口图 以2.8寸的TFTLCD为例,采用16位的并方式与外界进行连接,模块接口图如下所示: 具有如下一些信号线: CS:TFTLCD ...
- STM32控制TFTLCD显示
一.用STM32控制TFTLCD显示的编程方法,在编程驱动TFTLCD液晶显示器之前,我们先熟悉以下概念: 1.色彩深度,这是一个与TFTLCD显存对应的概念:所谓色彩深度就是每个像素点需要多少位的R ...
最新文章
- Linux tcpdump命令详解与Wireshark
- Spring(三)AOP面向切面编程
- python做logistic回归_用Python做Logistic回归
- Windows-Linux:Windows系统下的命令类似Linux系统下的所有命令集合
- 【笔试面试】C#中的程序集
- Mysql yum 安装后,一些重要的文件路径
- window ngnix php配置文件,Window下PHP和Nginx的配置
- Hamcrest Tutorial
- 北京极通EWebs与服务器蓝屏死机
- secureCRT查看日志命令
- 如何在php设置背景颜色,html如何设置背景颜色?两种方法教会你
- 中恒建模助手插件和绿色建筑的完美结合
- 慧荣SM2246XT、SM2246EN开卡教程 及 固件下载
- WPS之Excel表格如何设置下拉选项
- tex liv模板_微软向所有人开放Liv​​e Mesh
- 【halcon】灰度直方图直观理解与应用
- java中string类型如何接收_java中的string类型全面解析
- Google Pixel获取root权限的方法【完整版】
- Java 基础(十五)并发工具包 concurrent
- MODBUS-TCP协议
热门文章
- 安科瑞AMB300系列母线槽红外测温解决方案
- 个人域名能卖给企业吗
- GenerateReport——ETABS隔震分析报告生成
- etabs数据_筑信达
- 微处理器组成的微型计算机属于,以微处理器为核心组成的微型计算机属于哪一种计算机...
- jenkins 实现应用产品归档
- 深度学习入门——Mini-batch、Momentum与Adam算法
- L298N驱动4个电机驱动小车
- C# 调用 origin 批量作图
- 迅雷之坑:java.io.IOException: 你的主机中的软件中止了一个已建立的连接