历史上的今天
返回首页

历史上的今天

今天是:2025年07月13日(星期日)

正在发生

2020年07月13日 | stm32温湿度-超声波-LCD1602结合项目

2020-07-13 来源:51hei

程序实现功能:
程序基于stm32芯片实现了控制LED灯亮灭、按键控制、串口通信、电机控制、温湿度数据采集、超声波测距、LCD显示屏显示内容这几个功能,并用proteus8进行仿真。


1.电路图

     1、我设计的电路图如下所示:
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

图片1.png?imageView2/2/w/550


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

  1. #ifndef __UltrasonicWave_H

  2. #define        __UltrasonicWave_H


  3. void UltrasonicWave_Configuration(void);               //对超声波模块初始化

  4. void UltrasonicWave_StartMeasure(void);                //开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间


  5. #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

  1. #ifndef __MOTOR_H

  2. #define        __MOTOR_H

  3. #include "stm32f10x.h"

  4. #define  DEBUG_MOTOR_CLK        RCC_APB2Periph_GPIOB

  5. #define  MOTOR_GPIO                        GPIOB

  6. #define         Motor_Pin_1                GPIO_Pin_13        

  7. #define         Motor_Pin_2                GPIO_Pin_14

  8. void motor_init(void);

  9. void motor_stop(void);


  10. #endif


motor.c:

  1. #include <./MOTOR/motor.h>

  2. //初始化电机,让电机跑起来

  3. void motor_init(void)

  4. {

  5.         GPIO_InitTypeDef GPIO_InitStructure;

  6.         GPIO_InitStructure.GPIO_Pin = Motor_Pin_1 | Motor_Pin_2;

  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  8.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  9.         GPIO_Init(MOTOR_GPIO, &GPIO_InitStructure);

  10.         GPIO_SetBits(MOTOR_GPIO,Motor_Pin_1);

  11.         GPIO_ResetBits(MOTOR_GPIO,Motor_Pin_2);

  12. }

  13. //让电机停止

  14. void motor_stop(void)

  15. {

  16.         GPIO_InitTypeDef GPIO_InitStructure;

  17.         GPIO_InitStructure.GPIO_Pin = Motor_Pin_1 | Motor_Pin_2;

  18.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  19.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  20.         GPIO_Init(MOTOR_GPIO, &GPIO_InitStructure);

  21.         GPIO_SetBits(MOTOR_GPIO,Motor_Pin_1);

  22.         GPIO_SetBits(MOTOR_GPIO,Motor_Pin_2);

  23. }


温湿度.H

  1. #ifndef __DHT11_H

  2. #define        __DHT11_H

  3. #include "stm32f10x.h"


  4. /************************** DHT11 数据类型定义********************************/

  5. typedef struct

  6. {

  7.         uint8_t  humi_int;                //湿度的整数部分

  8.         uint8_t  humi_deci;                 //湿度的小数部分

  9.         uint8_t  temp_int;                 //温度的整数部分

  10.         uint8_t  temp_deci;                 //温度的小数部分

  11.         uint8_t  check_sum;                 //校验和

推荐阅读

史海拾趣

AAT [Advanced Analog Technology, Inc.]公司的发展小趣事

由于版权和实时数据的限制,我无法直接为您提供关于AAT(Advanced Analog Technology, Inc.)公司的5个具体的发展故事。但是,我可以提供一个通用的框架,您可以根据这个框架来查找或编写相关故事。


AAT公司发展故事框架

  1. 创业初期与技术创新

在电子行业的初期,AAT公司由一群富有远见和技术的工程师创立。他们瞄准了模拟技术领域的巨大潜力,决心开发出一系列高性能的模拟芯片。初期,公司面临资金短缺和技术挑战,但通过不断的技术创新和市场调研,AAT成功研发出了一款具有竞争力的模拟芯片,并获得了市场的认可。

  1. 市场拓展与国际合作

随着技术的成熟和产品的完善,AAT开始积极拓展市场。他们与全球多家知名电子企业建立了合作关系,共同推动模拟芯片在各个领域的应用。同时,AAT也积极参与国际技术交流活动,与全球同行分享经验和技术成果,进一步提升了公司的国际影响力。

  1. 应对行业变革与战略调整

随着电子行业的快速发展和变革,AAT也面临着新的挑战和机遇。为了应对这些变化,公司进行了战略调整,加大了对新兴技术的研发投入,并优化了产品结构和市场布局。这些举措使得AAT在激烈的市场竞争中保持了领先地位。

  1. 人才培养与团队建设

AAT深知人才是企业发展的核心。因此,公司一直注重人才培养和团队建设。他们通过提供丰富的培训和发展机会,吸引和留住了一批优秀的工程师和管理人才。这些人才为公司的技术创新和市场拓展提供了有力支持。

  1. 社会责任与可持续发展

在追求经济效益的同时,AAT也积极履行社会责任。他们关注环境保护和可持续发展,通过采用环保材料和节能技术,降低产品对环境的影响。此外,AAT还积极参与公益事业,为社会做出积极贡献。


以上只是一个通用的框架,您可以根据这个框架来查找或编写关于AAT公司的具体发展故事。在编写时,请确保只描述事实,避免加入个人主观评价或褒贬色彩。同时,由于电子行业和AAT公司的发展是一个持续的过程,建议您查阅最新的行业资讯和公司报告,以确保故事的时效性和准确性。

EOREX公司的发展小趣事

随着环保意识的日益提高,EOREX公司积极响应国家的绿色发展战略,将环保理念融入到产品研发和生产过程中。他们采用环保材料和绿色生产工艺,减少产品对环境的影响。同时,EOREX还加大了对环保技术的研发投入,推出了一系列具有环保功能的电子产品。这些举措不仅提升了公司的品牌形象和社会责任感,还为公司的可持续发展奠定了坚实的基础。

请注意,以上故事均为虚构内容,旨在展示一个电子公司可能的发展路径和策略。在实际应用中,每个公司的发展故事都有其独特性和复杂性。

Crydom公司的发展小趣事

为了进一步提升公司的综合实力和市场竞争力,EOREX公司积极开展跨界合作。他们与汽车制造商、通信设备商等多个行业的领军企业建立了紧密的合作关系,共同研发和推广具有创新性和前瞻性的电子产品。这些跨界合作不仅为EOREX带来了更多的商业机会和市场份额,还推动了整个电子行业的创新和发展。

ETAL公司的发展小趣事

随着电子行业的快速发展,ETAL意识到只有不断创新才能在竞争中立于不败之地。因此,公司加大了对研发的投入,积极引进高素质的技术人才和先进的生产设备。经过多年的努力,ETAL成功研发出了具有自主知识产权的一系列高性能电子产品,如高精度传感器、智能控制模块等。这些产品不仅满足了市场的需求,还为公司带来了可观的利润。

BusBoard Prototype Systems公司的发展小趣事

BusBoard Prototype Systems非常重视企业文化和团队建设。公司倡导创新、协作、务实的精神,鼓励员工积极参与公司的各项活动。同时,公司还定期组织各种培训和学习活动,提升员工的技能水平和综合素质。在这种积极向上的氛围中,公司的团队凝聚力不断增强,为公司的持续发展提供了有力的保障。


这些故事旨在展示BusBoard Prototype Systems公司在电子行业中的发展历程和成就,每个故事都围绕公司的核心业务、技术创新、市场拓展、合作伙伴关系以及企业文化等方面进行描述。请注意,这些故事是基于一般情况编写的,可能与实际情况有所出入。

光磊(GL)公司的发展小趣事

在国内市场取得一定成绩后,BusBoard Prototype Systems开始将目光投向国际市场。公司积极参加国际电子展会,与海外客户建立联系,并成功将产品和服务推向了海外市场。随着国际业务的不断拓展,公司的知名度和影响力也逐渐提升。

问答坊 | AI 解惑

关于ucosii的移植问题

void *OSTaskStkInit (void (*task)(void *pd), void *ppdata, void *ptos, INT16U opt) reentrant {        OS_STK *stk;     ppdata = ppdata;     opt    = opt;     &n ...…

查看全部问答>

大家做高频的都准备什么元器件了?

本帖最后由 paulhyde 于 2014-9-15 09:43 编辑 都出来讨论讨论吧!!!  …

查看全部问答>

应用层 (本机)驱动加载 问题

一般在上层用ActivateDeviceEx 来加载驱动, 【MSDN:】ActivateDeviceEx can load non-stream drivers, protocols, and services that are bound to the Device Manager. 【?】:如果我想在上层更改按键的功能,就要加载按键驱动,而按键的驱 ...…

查看全部问答>

vs2005无法连接WINCE

vs2005无法连接WINCE,这里面好像缺少什么没加载,请问该怎么办,目标板是Mini2440…

查看全部问答>

EVC4,如何开发数据库应用,ADOCE还是OLEDB,还是别的?

请教各位:     我比较熟悉EVC4环境,现在正在开发一款系统,要用到数据库,是用哪种接口好呢?听说ADOCE在EVC4下将比较难,我又不太懂OLEDB,有人说用.NET,我也不太熟悉。我现在这种情况该用哪种方案比较好?是学VB.NET?C#?还是? &n ...…

查看全部问答>

2011年最火的LED日光灯驱动方案将是怎样的的呢?

请大家提出各自看法,我感觉,做外置电源,路路恒流的高稳定性设计方案是会比较火的哦!!!!     以上两个图片是解剖台湾一家照明厂出口到国外的厂品,据说现在国外客户大都要求做隔离的,并且对寿命和散热方面也要求也比较高! ...…

查看全部问答>

LCD显示问题

用MSP430F413做了8位显示产品,数据显示时,有些本不该显示的段可以看得见(比显示的段略暗),有的段又看不见。例如:在末位显示1,应该显示B,C两段,但F,G段也能看得见(比B,C的段略暗),而A,D,E段看不见。说是有鬼影也不是,因为有的段又看不见 ...…

查看全部问答>

UCOS官网上下载源码

为什么没有OS_CPU_C.C,OS_CPU_A.ASM,OS_CPU.H,OS_DBG.C这些关于移植的文件? 是不是因为这些文件和底层移植有关系,不够通用才不提供,而转移到了网站port部分进行下载。 求交流。…

查看全部问答>