久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7663|回復: 13
打印 上一主題 下一主題
收起左側

Proteus8.8版本+ STM32F103驅動LCD1602顯示程序+按鍵+ADC+串口

  [復制鏈接]
跳轉到指定樓層
樓主
ID:710460 發(fā)表于 2020-5-9 23:28 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
STM32F103仿真驅動點亮LCD1602
一、開發(fā)環(huán)境介紹
proteus 8.8 版本+ STM32CubeMX 4.18.0
程序基于keil集成開發(fā)環(huán)境編寫,基于ST官方的HAL庫。

二、項目功能介紹
該項目程序中實現了
1、程序實現了LCD1602的點亮顯示
2、程序中實現了STM32的AD采樣
3、程序中實現了串口通信
4、程序中實現了按鍵控制操作

通過滑動變阻器加放大器改變輸入值。后邊加上lcd1602,初始化顯示“光節(jié)點檢測系統(tǒng)”
然后加個按鍵按下開始 顯示“光功率值:(多少)dbm 這里的范圍就0-100
通過調節(jié)前邊電位器每次只變化一下, 輸出某個數。
按鍵控制串口發(fā)送


三、實驗效果



單片機源程序如下:
  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提供下載:
AD_ex.7z (1.17 MB, 下載次數: 344)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:710460 發(fā)表于 2020-5-9 23:31 | 只看該作者
該項工程,利用STM32F103內部晶振,主頻為8MHz。解決了串口發(fā)送亂碼的問題,解決了按鍵不能輸入(需要加上拉電阻);解決了LCD1602顯示的問題。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:446681 發(fā)表于 2020-5-11 15:51 | 只看該作者
感謝分享,不過為什么點source code后,出現的是VSM studio呢?
回復

使用道具 舉報

地板
ID:446681 發(fā)表于 2020-5-11 20:32 | 只看該作者
大米袋 發(fā)表于 2020-5-11 15:51
感謝分享,不過為什么點source code后,出現的是VSM studio呢?

哦,明白了,你不是用的proteus的代碼編輯器,而是生成的hex導入到單片機運行的
回復

使用道具 舉報

5#
ID:710460 發(fā)表于 2020-5-13 22:31 | 只看該作者
是的,在keil軟件中編寫代碼 比較方便
回復

使用道具 舉報

6#
ID:527874 發(fā)表于 2020-5-20 12:52 | 只看該作者
為什么我在proteus8.6連好圖 它數值不變了,求解   
回復

使用道具 舉報

7#
ID:710460 發(fā)表于 2020-5-23 00:32 | 只看該作者
艾薇兒個人 發(fā)表于 2020-5-20 12:52
為什么我在proteus8.6連好圖 它數值不變了,求解

你的問題,目前我還不知道是什么原因。

我只說下,我之前在proteus 8.6仿真STM32定時器中斷,始終無法實現;
后來升級了proteus到了8.8,定時器中斷就做出來了。

proteus 8.6 和8.8 之間對于STM32的仿真支持,還是有區(qū)別的。
回復

使用道具 舉報

8#
ID:745458 發(fā)表于 2020-5-31 11:27 | 只看該作者
請問一下樓主我把數據八位改成A0-7端口為啥用不了,同時端口配置和你的一樣,在main.h里面也修改正確了
回復

使用道具 舉報

9#
ID:710460 發(fā)表于 2020-6-1 23:12 | 只看該作者
Richhh666 發(fā)表于 2020-5-31 11:27
請問一下樓主我把數據八位改成A0-7端口為啥用不了,同時端口配置和你的一樣,在main.h里面也修改正確了

PA端口中不是有用來作為AD轉換接口了嗎?
你這部分注意修改了嗎
回復

使用道具 舉報

10#
ID:155719 發(fā)表于 2020-6-2 11:44 | 只看該作者
這個很六六六,貌似單片機只能用內部晶振呢。
回復

使用道具 舉報

11#
ID:351044 發(fā)表于 2020-7-27 22:25 | 只看該作者
很好的參考例程,感謝分享~~
回復

使用道具 舉報

12#
ID:387687 發(fā)表于 2021-11-21 23:02 | 只看該作者

這個很六六六,貌似單片機只能用內部晶振呢。
回復

使用道具 舉報

13#
ID:449522 發(fā)表于 2022-9-30 13:47 | 只看該作者
謝謝分享,正在學習stm32
回復

使用道具 舉報

14#
ID:449522 發(fā)表于 2022-9-30 13:49 | 只看該作者
謝謝分享,正在學習stm32
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久成人精品视频 | 久久久国产精品网站 | 亚洲视频一区二区三区 | 欧美一区二区三区的 | 亚洲视频一区在线观看 | 亚洲一区 中文字幕 | 黄色片在线网站 | 国产精品美女久久久久久免费 | 亚洲综合在线视频 | 成人一区二区三区在线观看 | 欧美一区二区黄 | 91综合在线视频 | 精品在线观看入口 | 妞干网av | 中文字幕第二区 | 精品一区国产 | 亚洲色图综合 | 超级碰在线| 2018天天干天天操 | 亚洲天堂影院 | 国产精产国品一二三产区视频 | 欧美不卡一区二区三区 | 人人鲁人人莫人人爱精品 | 天天玩天天操天天干 | 亚洲精品久久久久久国产精华液 | 国产成人综合久久 | 天天天操操操 | 欧美一区二区三区久久精品 | 伊人狠狠 | 久久99精品久久久久久国产越南 | 亚洲欧洲视频 | 亚洲视频免费在线播放 | 日韩在线高清 | 午夜影院污| 成人福利网站 | 午夜影院普通用户体验区 | 尤物在线视频 | 白浆在线| 久久r免费视频 | 国产精选一区 | 91亚洲一区|