Proteus8.8版本+ STM32F103驱动LCD1602显示程序+按键+ADC+串口

2020-08-03来源: 51hei关键字:STM32F103  LCD1602  按键  ADC  串口

STM32F103仿真驱动点亮LCD1602
一、开发环境介绍
proteus 8.8 版本+ STM32CubeMX 4.18.0
程序基于keil集成开发环境编写,基于ST官方的HAL库。

STM32CubeMX pack版本

STM32CubeMX pack版本

STM32CubeMX的版本

STM32CubeMX的版本
二、项目功能介绍
该项目程序中实现了
1、程序实现了LCD1602的点亮显示
2、程序中实现了STM32的AD采样
3、程序中实现了串口通信
4、程序中实现了按键控制操作

通过滑动变阻器加放大器改变输入值。后边加上lcd1602,初始化显示“光节点检测系统”
然后加个按键按下开始 显示“光功率值:(多少)dbm 这里的范围就0-100
通过调节前边电位器每次只变化一下, 输出某个数。
按键控制串口发送


三、实验效果

3.jpg

单片机源程序如下:

/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "stm32f1xx_hal.h"


/* USER CODE BEGIN Includes */

#include "bsp-lcd1602.h"

#include "delay.h"


/* USER CODE END Includes */


/* Private variables ---------------------------------------------------------*/

ADC_HandleTypeDef hadc1;


UART_HandleTypeDef huart1;


/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/


#define KEY0        HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_0)  //KEY0按键PC5

#define KEY1        HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_1) //KEY1按键PA15


#define KEY0_PRESS  1

#define KEY1_PRESS  2



/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

void Error_Handler(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);

static void MX_USART1_UART_Init(void);


/* USER CODE BEGIN PFP */

/* Private function prototypes -----------------------------------------------*/

int fputc(int ch, FILE *f)

{

  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;

}

/* USER CODE END PFP */


/* USER CODE BEGIN 0 */


void PrintFloat(float value)

{

    int tmp,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6;

    tmp = (int)value;

    tmp1=(int)((value-tmp)*10)%10;

    tmp2=(int)((value-tmp)*100)%10;

    tmp3=(int)((value-tmp)*1000)%10;

    tmp4=(int)((value-tmp)*10000)%10;

    tmp5=(int)((value-tmp)*100000)%10;

    tmp6=(int)((value-tmp)*1000000)%10;

    printf("%d.%d%d%d%d%d%drn",tmp,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);

}


u8 KEY_Scan(u8 mode)

{         

        static u8 key_up=1;//按键按松开标志

        if(mode)key_up=1;  //支持连按                  

        if(key_up&&(KEY0==0||KEY1==0))

        {

                HAL_Delay(10);//去抖动

                key_up=0;

                if(KEY0==0)return KEY0_PRESS;

                else if(KEY1==0)return KEY1_PRESS;


        }else if(KEY0==1&&KEY1==1)key_up=1;            

         return 0;// 无按键按下

}


/* USER CODE END 0 */


int main(void)

{


  /* USER CODE BEGIN 1 */



        u8 t=0,display_flag=0;

          u8 a,b,c,d;

          unsigned int value=0;

  /* USER CODE END 1 */


  /* MCU Configuration----------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* Configure the system clock */

  SystemClock_Config();


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_ADC1_Init();

  MX_USART1_UART_Init();


  /* USER CODE BEGIN 2 */


                LCD1602_Init();

                HAL_Delay(10);  //延时一段时间        

               

                LCD1602_ShowStr(2,0,"Optical node",12);

          LCD1602_ShowStr(0,1,"detection system",16);

               

    HAL_Delay(1000);

               

    LCD1602_WriteCmd( 0x01);//清屏


  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

  /* USER CODE END WHILE */


  /* USER CODE BEGIN 3 */

                                if(HAL_ADC_Start(&hadc1)!=HAL_OK)  //启动ADC1

                                {

                                   Error_Handler();

                                }

        

                  HAL_ADC_PollForConversion(&hadc1, 300) ;//  开始转换

                  value=HAL_ADC_GetValue(&hadc1); //获取转换的结果

                                


                                if(value==4095)

                                        value=100;

                                else if(value==0)

                                        value=0;

                                else                                 value=value/41;

                                

                a=value/1000;

                b=value%1000/100;

                c=value%100/10;

                d=value%100%10;               

                                

                t=KEY_Scan(0);

               

                if(t==KEY0_PRESS)

                {        

                        display_flag=1;

                  LCD1602_ShowStr(0,0,"Optical Power",13);

                        LCD1602_ShowStr(0,1,"Value=",6);

                }

               

                if(display_flag)

                {

                        if(a!=0)

                        LCD_ShowNum(6,1,a);

                        else LCD1602_ShowStr(6,1," ",1); //显示空白

                        if(b!=0)

                                LCD_ShowNum(7,1,b);

                         else LCD1602_ShowStr(7,1," ",1);//显示空白

                        LCD_ShowNum(8,1,c);

                        LCD_ShowNum(9,1,d);

                        LCD1602_ShowStr(10,1,"dbm   ",6);

                }

               

                if(t==KEY1_PRESS)

                        printf("%drn",value);                                 //输出采样值

        

                        

                        //          HAL_Delay(10);//延时10ms 输入的正弦波信号的频率为100Hz,波形的周期为10ms,                根据自己的需求,可适当增加延时

  }

  /* USER CODE END 3 */


}


/** System Clock Configuration

*/

void Syst

[1] [2]
关键字:STM32F103  LCD1602  按键  ADC  串口 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic505105.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32控制WS2812B灯
下一篇:STM32外部中断控制LED

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32F103停机模式测试
环境:主机:WIN7开发环境:MDK4.72MCU:STM32F101源代码://定义IO初始化结构体GPIO_InitTypeDef GPIO_InitStructure;    //设置zigbee模块进入低功耗模式inf_zigbee_sleep();    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |                        
发表于 2020-09-24
STM32F103 AFIO时钟疑问
在stm32F103系列中:AFIO是重映射辅助时钟,如果仅仅是使用第二功能(如uart,spi,),不需要打开,使用第二功能打开GPIO和第二功能时钟。我反复测试是这样的AFIO时钟由RCC_APB2ENR寄存器的位0控制;APB2外设时钟使能寄存器(RCC_APB2ENR)  的第0位AFIOEN 辅助功能IO时钟使能在那些时候,需要开启呢? --------------------------------- 配置stm32的事件输出/外部中断/重映射的时候.就必须开启AFIO时钟. 假如使用的管脚里头默认复用的外设功能并不需要开AFIO时钟  
发表于 2020-09-16
<font color='red'>STM32F103</font> AFIO时钟疑问
STM32f103时钟系统简介
STM32F10X_CL    __IO uint32_t AHBRSTR;  __IO uint32_t CFGR2;#endif /* STM32F10X_CL */#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)     uint32_t RESERVED0;  __IO uint32_t CFGR2;#endif /* STM32F10X_LD_VL || STM32F
发表于 2020-08-25
<font color='red'>STM32f103</font>时钟系统简介
STM32F103+NRF24L01航模遥控器制作
摇杆数值ADC读取后通过DMA存到数组中,TIM3中断函数中对数据进行处理发送,同时对电池电压进行采集,OLED显示PIT、THR、电压等信息。#include "stm32f10x.h"#include "sys.h"#include "i2c.h"#include "delay.h"#include "usart.h"#include "remote.h"#include "oled0561.h"#include "ADC_DMA_Config.h"#include
发表于 2020-08-17
<font color='red'>STM32F103</font>+NRF24L01航模遥控器制作
ULN2003驱动28BYJ-48步进电机STM32F103寄存器版
电机1先逆时针旋转90度,再顺时针旋转90度。电机2逆时针旋转90度,再顺时针旋转90度◆硬件资源:    1,ULN2003驱动模块    2,28BYJ-48步进电机电机1:    // IN4: PC9   d    // IN3: PC8   c    // IN2: PC7   b    // IN1: PC6   a    3,28BYJ-48步进电机电机2:    // IN4: P
发表于 2020-08-14
stm32f103单片机的串口IAP升级程序
使用stm32f103r8t6 实现IAP升级代码精简但是很实用可以用来制作远程升级单片机源程序如下:/********************************************************************************* 文件名:                 mian.c** 版本:                  1.0** 工作环境:         
发表于 2020-08-13
<font color='red'>stm32f103</font>单片机的串口IAP升级程序
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved