找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7034|回复: 13
收起左侧

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

  [复制链接]
ID:710460 发表于 2020-5-9 23:28 | 显示全部楼层 |阅读模式
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

单片机源程序如下:
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "main.h"
  3. #include "stm32f1xx_hal.h"

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

  7. /* USER CODE END Includes */

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

  10. UART_HandleTypeDef huart1;

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

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

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


  17. /* USER CODE END PV */

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

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

  32. /* USER CODE BEGIN 0 */

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

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

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

  58. /* USER CODE END 0 */

  59. int main(void)
  60. {

  61.   /* USER CODE BEGIN 1 */


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

  66.   /* MCU Configuration----------------------------------------------------------*/

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

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

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

  75.   /* USER CODE BEGIN 2 */

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

  85.   /* USER CODE END 2 */

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

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

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

  140. }

  141. /** System Clock Configuration
  142. */
  143. void SystemClock_Config(void)
  144. {

  145.   RCC_OscInitTypeDef RCC_OscInitStruct;
  146.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  147.   RCC_PeriphCLKInitTypeDef PeriphClkInit;

  148.     /**Initializes the CPU, AHB and APB busses clocks
  149.     */
  150.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  151.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  152.   RCC_OscInitStruct.HSICalibrationValue = 16;
  153.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  154.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  155.   {
  156.     Error_Handler();
  157.   }

  158.     /**Initializes the CPU, AHB and APB busses clocks
  159.     */
  160.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  161.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  162.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  163.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  164.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  165.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  166.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  167.   {
  168.     Error_Handler();
  169.   }

  170.   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  171.   PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
  172.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  173.   {
  174.     Error_Handler();
  175.   }

  176.     /**Configure the Systick interrupt time
  177.     */
  178.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  179.     /**Configure the Systick
  180.     */
  181.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  182.   /* SysTick_IRQn interrupt configuration */
  183.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  184. }

  185. /* ADC1 init function */
  186. static void MX_ADC1_Init(void)
  187. {

  188.   ADC_ChannelConfTypeDef sConfig;

  189.     /**Common config
  190.     */
  191.   hadc1.Instance = ADC1;
  192.   hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  193.   hadc1.Init.ContinuousConvMode = DISABLE;
  194.   hadc1.Init.DiscontinuousConvMode = DISABLE;
  195.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  196.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  197.   hadc1.Init.NbrOfConversion = 1;
  198.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  199.   {
  200.     Error_Handler();
  201.   }

  202.     /**Configure Regular Channel
  203.     */
  204.   sConfig.Channel = ADC_CHANNEL_2;
  205.   sConfig.Rank = 1;
  206.   sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  207.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  208.   {
  209.     Error_Handler();
  210.   }

  211. }

  212. /* USART1 init function */
  213. static void MX_USART1_UART_Init(void)
  214. {

  215.   huart1.Instance = USART1;
  216.   huart1.Init.BaudRate = 9600;
  217.   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  218.   huart1.Init.StopBits = UART_STOPBITS_1;
  219.   huart1.Init.Parity = UART_PARITY_NONE;
  220.   huart1.Init.Mode = UART_MODE_TX_RX;
  221.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  222.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  223.   if (HAL_UART_Init(&huart1) != HAL_OK)
  224.   {
  225.     Error_Handler();
  226.   }

  227. }

  228. /** Configure pins as
  229.         * Analog
  230.         * Input
  231.         * Output
  232.         * EVENT_OUT
  233.         * EXTI
  234. */
  235. static void MX_GPIO_Init(void)
  236. {

  237.   GPIO_InitTypeDef GPIO_InitStruct;

  238.   /* GPIO Ports Clock Enable */
  239.   __HAL_RCC_GPIOC_CLK_ENABLE();
  240.   __HAL_RCC_GPIOA_CLK_ENABLE();
  241.   __HAL_RCC_GPIOB_CLK_ENABLE();

  242.   /*Configure GPIO pins : PC0 PC1 */
  243.   GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
  244.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  245.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  246.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  247.   /*Configure GPIO pins : DB0_Pin DB1_Pin DB2_Pin DB3_Pin
  248.                            DB4_Pin DB5_Pin DB6_Pin DB7_Pin */
  249.   GPIO_InitStruct.Pin = DB0_Pin|DB1_Pin|DB2_Pin|DB3_Pin
  250.                           |DB4_Pin|DB5_Pin|DB6_Pin|DB7_Pin;
  251.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  252.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  253.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  254.   /*Configure GPIO pins : LCD1602_E_Pin LCD1602_RW_Pin LCD1602_RS_Pin */
  255.   GPIO_InitStruct.Pin = LCD1602_E_Pin|LCD1602_RW_Pin|LCD1602_RS_Pin;
  256.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  257.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  258.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  259.   /*Configure GPIO pin Output Level */
  260.   HAL_GPIO_WritePin(GPIOB, DB0_Pin|DB1_Pin|DB2_Pin|LCD1602_E_Pin
  261.                           |LCD1602_RW_Pin|LCD1602_RS_Pin|DB3_Pin|DB4_Pin
  262.                           |DB5_Pin|DB6_Pin|DB7_Pin, GPIO_PIN_RESET);

  263. }

  264. /* USER CODE BEGIN 4 */

  265. /* USER CODE END 4 */

  266. /**
  267.   * @brief  This function is executed in case of error occurrence.
  268.   * @param  None
  269.   * @retval None
  270.   */
  271. void Error_Handler(void)
  272. {
  273.   /* USER CODE BEGIN Error_Handler */
  274.   /* User can add his own implementation to report the HAL error return state */
  275.   while(1)
  276.   {
  277.   }
  278.   /* USER CODE END Error_Handler */
  279. }

  280. #ifdef USE_FULL_ASSERT

  281. /**
  282.    * @brief Reports the name of the source file and the source line number
  283.    * where the assert_param error has occurred.
  284.    * @param file: pointer to the source file name
  285.    * @param line: assert_param error line source number
  286.    * @retval None
  287.    */
  288. void assert_failed(uint8_t* file, uint32_t line)
  289. {
  290.   /* USER CODE BEGIN 6 */
  291.   /* User can add his own implementation to report the file name and line number,
  292.     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  293.   /* USER CODE END 6 */

  294. }

  295. #endif

  296. /**
  297.   * @}
  298.   */

  299. /**
  300.   * @}
  301. */

  302. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码
51hei.png
所有资料51hei提供下载:
AD_ex.7z (1.17 MB, 下载次数: 344)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:710460 发表于 2020-5-9 23:31 | 显示全部楼层
该项工程,利用STM32F103内部晶振,主频为8MHz。解决了串口发送乱码的问题,解决了按键不能输入(需要加上拉电阻);解决了LCD1602显示的问题。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:446681 发表于 2020-5-11 15:51 | 显示全部楼层
感谢分享,不过为什么点source code后,出现的是VSM studio呢?
回复

使用道具 举报

ID:446681 发表于 2020-5-11 20:32 | 显示全部楼层
大米袋 发表于 2020-5-11 15:51
感谢分享,不过为什么点source code后,出现的是VSM studio呢?

哦,明白了,你不是用的proteus的代码编辑器,而是生成的hex导入到单片机运行的
回复

使用道具 举报

ID:710460 发表于 2020-5-13 22:31 | 显示全部楼层
是的,在keil软件中编写代码 比较方便
回复

使用道具 举报

ID:527874 发表于 2020-5-20 12:52 | 显示全部楼层
为什么我在proteus8.6连好图 它数值不变了,求解   
回复

使用道具 举报

ID:710460 发表于 2020-5-23 00:32 | 显示全部楼层
艾薇儿个人 发表于 2020-5-20 12:52
为什么我在proteus8.6连好图 它数值不变了,求解

你的问题,目前我还不知道是什么原因。

我只说下,我之前在proteus 8.6仿真STM32定时器中断,始终无法实现;
后来升级了proteus到了8.8,定时器中断就做出来了。

proteus 8.6 和8.8 之间对于STM32的仿真支持,还是有区别的。
回复

使用道具 举报

ID:745458 发表于 2020-5-31 11:27 | 显示全部楼层
请问一下楼主我把数据八位改成A0-7端口为啥用不了,同时端口配置和你的一样,在main.h里面也修改正确了
回复

使用道具 举报

ID:710460 发表于 2020-6-1 23:12 | 显示全部楼层
Richhh666 发表于 2020-5-31 11:27
请问一下楼主我把数据八位改成A0-7端口为啥用不了,同时端口配置和你的一样,在main.h里面也修改正确了

PA端口中不是有用来作为AD转换接口了吗?
你这部分注意修改了吗
回复

使用道具 举报

ID:155719 发表于 2020-6-2 11:44 | 显示全部楼层
这个很六六六,貌似单片机只能用内部晶振呢。
回复

使用道具 举报

ID:351044 发表于 2020-7-27 22:25 | 显示全部楼层
很好的参考例程,感谢分享~~
回复

使用道具 举报

ID:387687 发表于 2021-11-21 23:02 | 显示全部楼层

这个很六六六,貌似单片机只能用内部晶振呢。
回复

使用道具 举报

ID:449522 发表于 2022-9-30 13:47 | 显示全部楼层
谢谢分享,正在学习stm32
回复

使用道具 举报

ID:449522 发表于 2022-9-30 13:49 | 显示全部楼层
谢谢分享,正在学习stm32
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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