找回密码
 注册

QQ登录

只需一步,快速开始

搜索

Proteus仿真STM32F103驱动LCD1602显示程序+按键+ADC+串口

[复制链接]
路漫漫 发表于 2020-5-20 17:55:56 | 显示全部楼层 |阅读模式
STM32F103仿真驱动点亮LCD1602 本文proteus仿真文件和stm32程序源码.7z (1.17 MB, 售价: 5 E币)
1.png
一、开发环境介绍
proteus 8.8 版本+ STM32CubeMX 4.18.0
程序基于keil集成开发环境编写,基于ST官方的HAL库。
230259l3bu87xxhnk8b9n9.jpg 230304fwccyacjjwn8811g.jpg
二、项目功能介绍
该项目程序中实现了
1、程序实现了LCD1602的点亮显示
2、程序中实现了STM32的AD采样
3、程序中实现了串口通信
4、程序中实现了按键控制操作

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

部分程序代码片段
  1. #include "main.h"
  2. #include "stm32f1xx_hal.h"

  3. /* USER CODE BEGIN Includes */
  4. #include "bsp-lcd1602.h"
  5. #include "delay.h"

  6. /* USER CODE END Includes */

  7. /* Private variables ---------------------------------------------------------*/
  8. ADC_HandleTypeDef hadc1;

  9. UART_HandleTypeDef huart1;

  10. /* USER CODE BEGIN PV */
  11. /* Private variables ---------------------------------------------------------*/

  12. #define KEY0        HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_0)  //KEY0按键PC5
  13. #define KEY1        HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_1) //KEY1按键PA15

  14. #define KEY0_PRESS  1
  15. #define KEY1_PRESS  2


  16. /* USER CODE END PV */

  17. /* Private function prototypes -----------------------------------------------*/
  18. void SystemClock_Config(void);
  19. void Error_Handler(void);
  20. static void MX_GPIO_Init(void);
  21. static void MX_ADC1_Init(void);
  22. static void MX_USART1_UART_Init(void);

  23. /* USER CODE BEGIN PFP */
  24. /* Private function prototypes -----------------------------------------------*/
  25. int fputc(int ch, FILE *f)
  26. {
  27.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
  28.   return ch;
  29. }
  30. /* USER CODE END PFP */

  31. /* USER CODE BEGIN 0 */

  32. void PrintFloat(float value)
  33. {
  34.     int tmp,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6;
  35.     tmp = (int)value;
  36.     tmp1=(int)((value-tmp)*10)%10;
  37.     tmp2=(int)((value-tmp)*100)%10;
  38.     tmp3=(int)((value-tmp)*1000)%10;
  39.     tmp4=(int)((value-tmp)*10000)%10;
  40.     tmp5=(int)((value-tmp)*100000)%10;
  41.     tmp6=(int)((value-tmp)*1000000)%10;
  42.     printf("%d.%d%d%d%d%d%d\r\n",tmp,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);
  43. }

  44. u8 KEY_Scan(u8 mode)
  45. {         
  46.         static u8 key_up=1;//按键按松开标志
  47.         if(mode)key_up=1;  //支持连按                  
  48.         if(key_up&&(KEY0==0||KEY1==0))
  49.         {
  50.                 HAL_Delay(10);//去抖动
  51.                 key_up=0;
  52.                 if(KEY0==0)return KEY0_PRESS;
  53.                 else if(KEY1==0)return KEY1_PRESS;

  54.         }else if(KEY0==1&&KEY1==1)key_up=1;            
  55.          return 0;// 无按键按下
  56. }

  57. /* USER CODE END 0 */

  58. int main(void)
  59. {

  60.   /* USER CODE BEGIN 1 */


  61.         u8 t=0,display_flag=0;
  62.           u8 a,b,c,d;
  63.           unsigned int value=0;
  64.   /* USER CODE END 1 */

  65.   /* MCU Configuration----------------------------------------------------------*/

  66.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  67.   HAL_Init();

  68.   /* Configure the system clock */
  69.   SystemClock_Config();

  70.   /* Initialize all configured peripherals */
  71.   MX_GPIO_Init();
  72.   MX_ADC1_Init();
  73.   MX_USART1_UART_Init();

  74.   /* USER CODE BEGIN 2 */

  75.                 LCD1602_Init();
  76.                 HAL_Delay(10);  //延时一段时间        
  77.                
  78.                 LCD1602_ShowStr(2,0,"Optical node",12);
  79.           LCD1602_ShowStr(0,1,"detection system",16);
  80.                
  81.     HAL_Delay(1000);
  82.                
  83.     LCD1602_WriteCmd( 0x01);//清屏

  84.   /* USER CODE END 2 */

  85.   /* Infinite loop */
  86.   /* USER CODE BEGIN WHILE */
  87.   while (1)
  88.   {
  89.   /* USER CODE END WHILE */

  90.   /* USER CODE BEGIN 3 */
  91.                                 if(HAL_ADC_Start(&hadc1)!=HAL_OK)  //启动ADC1
  92.                                 {
  93.                                    Error_Handler();
  94.                                 }
  95.         
  96.                   HAL_ADC_PollForConversion(&hadc1, 300) ;//  开始转换
  97.                   value=HAL_ADC_GetValue(&hadc1); //获取转换的结果
  98.                                 

  99.                                 if(value==4095)
  100.                                         value=100;
  101.                                 else if(value==0)
  102.                                         value=0;
  103.                                 else                                 value=value/41;
  104.                                 
  105.                 a=value/1000;
  106.                 b=value%1000/100;
  107.                 c=value%100/10;
  108.                 d=value%100%10;               
  109.                                 
  110.                 t=KEY_Scan(0);
  111.                
  112.                 if(t==KEY0_PRESS)
  113.                 {        
  114.                         display_flag=1;
  115.                   LCD1602_ShowStr(0,0,"Optical Power",13);
  116.                         LCD1602_ShowStr(0,1,"Value=",6);
  117.                 }
  118.                
  119.                 if(display_flag)
  120.                 {
  121.                         if(a!=0)
  122.                         LCD_ShowNum(6,1,a);
  123.                         else LCD1602_ShowStr(6,1," ",1); //显示空白
  124.                         if(b!=0)
  125.                                 LCD_ShowNum(7,1,b);
  126.                          else LCD1602_ShowStr(7,1," ",1);//显示空白
  127.                         LCD_ShowNum(8,1,c);
  128.                         LCD_ShowNum(9,1,d);
  129.                         LCD1602_ShowStr(10,1,"dbm   ",6);
  130.                 }
  131.                
  132.                 if(t==KEY1_PRESS)
  133.                         printf("%d\r\n",value);                                 //输出采样值
  134.         
  135.                         
  136.                         //          HAL_Delay(10);//延时10ms 输入的正弦波信号的频率为100Hz,波形的周期为10ms,                根据自己的需求,可适当增加延时
  137.   }
  138.   /* USER CODE END 3 */

  139. }
复制代码



您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-12-22 16:10

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表