历史上的今天
今天是:2025年07月13日(星期日)
2020年07月13日 | stm32温湿度-超声波-LCD1602结合项目
2020-07-13 来源:51hei
程序实现功能:
程序基于stm32芯片实现了控制LED灯亮灭、按键控制、串口通信、电机控制、温湿度数据采集、超声波测距、LCD显示屏显示内容这几个功能,并用proteus8进行仿真。
1.电路图
1、我设计的电路图如下所示:
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

2. 程序功能介绍
程序总共包括控制LED灯亮灭、按键控制、串口通信、电机控制、温湿度数据采集、超声波测距、LCD显示屏显示内容这几个功能,以下是这些功能的介绍:
2.1. LED灯亮灭与按键控制
程序默认运行时,两个LED灯会被点亮。当按下按钮后,两个LED灯会闪烁。
2.2. 串口通信
程序运行时,虚拟终端接串口通信用到的接收端和发送端,通过配置波特率、传输的奇偶校验位、停止位、字长以及重定向,将printf函数打印的内容打印到虚拟终端上。
2.3. 电机的控制
通过L298芯片,改变功率,来控制电机的转动。
2.4. 温湿度数据采集
用DHT11温湿度传感器来采集温湿度信息。
通过了解DHT11的工作时序,设计好对应的延时函数,进行数据采集,同时通过循环将每次采集的数据打印在虚拟终端上。
2.5. 超声波测距
通过超声波测距模块来进行测距。
通过了解超声波测距模块的时序,利用定时器,采集测到的距离,并且通过循环打印在虚拟终端上。
2.6. LCD液晶显示器显示数据
客户端可以通过发送“database”字符串进入到数据库的相关服务,在选择相应功能执行。如下图所示:
通过了解LM16016l中各引脚功能,相关控制指令以及写时序和读时序,在程序运行时,在显示屏上打印“hello”。
3.具体代码如下:
* 文件名 : UltrasonicWave.c
* 描述 :超声波测距模块,UltrasonicWave_Configuration()函数
初始化超声模块,UltrasonicWave_StartMeasure()函数
启动测距,并将测得的数据通过串口1打印出来
* 实验平台:野火STM32开发板
* 硬件连接:------------------
* | PC8 - TRIG |
* | PC9 - ECHO |
* ------------------
* 库版本 :ST3.5.0
UltrasonicWave.H
#ifndef __UltrasonicWave_H
#define __UltrasonicWave_H
void UltrasonicWave_Configuration(void); //对超声波模块初始化
void UltrasonicWave_StartMeasure(void); //开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
#endif /* __UltrasonicWave_H */
UltrasonicWave.c
*********************************************************************************/
#include "./Wave/UltrasonicWave.h"
#include "./usart/bsp_usart.h"
#include "./Tim2/TIM2.h"
#define TRIG_PORT GPIOC //TRIG
#define ECHO_PORT GPIOC //ECHO
#define TRIG_PIN GPIO_Pin_8 //TRIG
#define ECHO_PIN GPIO_Pin_9 //ECHO
unsigned short int UltrasonicWave_Distance; //计算出的距离
/*
* 函数名:DelayTime_us
* 描述 :1us延时函数
* 输入 :Time 延时的时间 US
* 输出 :无
*/
void DelayTime_us(int Time)
{
unsigned char i;
for ( ; Time>0; Time--)
for ( i = 0; i < 72; i++ );
}
/*
* 函数名:UltrasonicWave_Configuration
* 描述 :超声波模块的初始化
* 输入 :无
* 输出 :无
*/
void UltrasonicWave_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = TRIG_PIN; //PC8接TRIG
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设为推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TRIG_PORT, &GPIO_InitStructure); //初始化外设GPIO
GPIO_InitStructure.GPIO_Pin = ECHO_PIN; //PC9接ECH0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设为输入
GPIO_Init(ECHO_PORT,&GPIO_InitStructure); //初始化GPIOA
}
/*
* 函数名:UltrasonicWave_CalculateTime
* 描述 :计算距离
* 输入 :无
* 输出 :无
*/
void UltrasonicWave_CalculateTime(void)
{
UltrasonicWave_Distance=TIM_GetCounter(TIM2)*5*34/2000;
}
/*
* 函数名:UltrasonicWave_StartMeasure
* 描述 :开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
* 输入 :无
* 输出 :无
*/
void UltrasonicWave_StartMeasure(void)
{
GPIO_SetBits(TRIG_PORT,TRIG_PIN); //送>10US的高电平
DelayTime_us(20); //延时20US
GPIO_ResetBits(TRIG_PORT,TRIG_PIN);
while(!GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN)); //等待高电平
TIM_Cmd(TIM2, ENABLE); //开启时钟
while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN)); //等待低电平
TIM_Cmd(TIM2, DISABLE); //定时器2失能
UltrasonicWave_CalculateTime(); //计算距离
TIM_SetCounter(TIM2,0);
printf("rndistance:%d%d cmrn",UltrasonicWave_Distance/256,UltrasonicWave_Distance%256);
}
motor.h
#ifndef __MOTOR_H
#define __MOTOR_H
#include "stm32f10x.h"
#define DEBUG_MOTOR_CLK RCC_APB2Periph_GPIOB
#define MOTOR_GPIO GPIOB
#define Motor_Pin_1 GPIO_Pin_13
#define Motor_Pin_2 GPIO_Pin_14
void motor_init(void);
void motor_stop(void);
#endif
motor.c:
#include <./MOTOR/motor.h>
//初始化电机,让电机跑起来
void motor_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = Motor_Pin_1 | Motor_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(MOTOR_GPIO, &GPIO_InitStructure);
GPIO_SetBits(MOTOR_GPIO,Motor_Pin_1);
GPIO_ResetBits(MOTOR_GPIO,Motor_Pin_2);
}
//让电机停止
void motor_stop(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = Motor_Pin_1 | Motor_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(MOTOR_GPIO, &GPIO_InitStructure);
GPIO_SetBits(MOTOR_GPIO,Motor_Pin_1);
GPIO_SetBits(MOTOR_GPIO,Motor_Pin_2);
}
温湿度.H
#ifndef __DHT11_H
#define __DHT11_H
#include "stm32f10x.h"
/************************** DHT11 数据类型定义********************************/
typedef struct
{
uint8_t humi_int; //湿度的整数部分
uint8_t humi_deci; //湿度的小数部分
uint8_t temp_int; //温度的整数部分
uint8_t temp_deci; //温度的小数部分
uint8_t check_sum; //校验和
史海拾趣
|
void *OSTaskStkInit (void (*task)(void *pd), void *ppdata, void *ptos, INT16U opt) reentrant { OS_STK *stk; ppdata = ppdata; opt = opt; &n ...… 查看全部问答> |
|
一般在上层用ActivateDeviceEx 来加载驱动, 【MSDN:】ActivateDeviceEx can load non-stream drivers, protocols, and services that are bound to the Device Manager. 【?】:如果我想在上层更改按键的功能,就要加载按键驱动,而按键的驱 ...… 查看全部问答> |
|
EVC4,如何开发数据库应用,ADOCE还是OLEDB,还是别的? 请教各位: 我比较熟悉EVC4环境,现在正在开发一款系统,要用到数据库,是用哪种接口好呢?听说ADOCE在EVC4下将比较难,我又不太懂OLEDB,有人说用.NET,我也不太熟悉。我现在这种情况该用哪种方案比较好?是学VB.NET?C#?还是? &n ...… 查看全部问答> |
|
请大家提出各自看法,我感觉,做外置电源,路路恒流的高稳定性设计方案是会比较火的哦!!!! 以上两个图片是解剖台湾一家照明厂出口到国外的厂品,据说现在国外客户大都要求做隔离的,并且对寿命和散热方面也要求也比较高! ...… 查看全部问答> |
|
为什么没有OS_CPU_C.C,OS_CPU_A.ASM,OS_CPU.H,OS_DBG.C这些关于移植的文件? 是不是因为这些文件和底层移植有关系,不够通用才不提供,而转移到了网站port部分进行下载。 求交流。… 查看全部问答> |




