基于STM32的电子秤LCD显示仿真设计
本设计包含proteus仿真+程序代码+设计报告+讲解视频
一、开发环境
仿真图:proteus 8.17
程序编译器:keil 5
编程语言:C语言
设计编号:C0140
二、主要功能
基于STM32单片机的电子秤proteus仿真设计
1.电子秤可以数字显示0g-499g间物体的重量,单位克(g);
2.电子秤可以设置单价(元/克)可计算物品金额并实现金额累加,单价范围0.01-0.99元克;
3.通过LCD1602显示单价,物体重量,商品价格和总价;
4.矩阵按键设置单价,计价,价格累加,清零和去皮功能;
资料下载链接:
KEY_C0140 STM32电子秤仿真设计
链接: https://pan.baidu.com/s/1Xku61llPgC4VEcKJSytbqw?pwd=hqhr
提取码: hqhr
以下为本设计资料展示:
三、仿真设计
打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。
四、程序代码
程序是用keil5 mdk版本打开的,如果打开有问题,核实下keil的版本。程序有注释可以结合讲解视频理解。
/* USER CODE BEGIN PV */unsigned int press = 0; // 当前重量(g)unsigned int qupi = 0; // 去皮记录值unsigned char money = 1; // 单价(分), 初始0.01元unsigned long all = 0; // 当前价格(分)unsigned long sum = 0; // 累计总价(分)unsigned char time_cnt = 0; // 定时计数(100ms*5=500ms)/* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/void SystemClock_Config(void);/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 *//* USER CODE END 0 *//** * @brief The application entry point. * @retval int */int main(void){ /* USER CODE BEGIN 1 */ unsigned char k = 0; char lcd_buf1[17]; // 第一行显示缓冲 char lcd_buf2[17]; // 第二行显示缓冲 /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM2_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ LCD_Init(); LCD_ShowString(0, 0, "Init... "); HAL_TIM_Base_Start_IT(&htim2); // 启动定时器中断(TIM2, 100ms周期) /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ k = KEY_Scan(); // 去皮: 按下键4切换去皮/取消去皮 if (k == 4) { if (qupi == 0) qupi = press; // 记录当前重量作为皮重 else qupi = 0; // 取消去皮 } // 输入单价数字: 键值5~14对应数字0~9 if ((k >= 5) && (k <= 14)) { money = money % 10; money = money * 10 + (k - 5); } // OK确认: 按下键1计算当前价格 if (k == 1) { all = press; all = all * money; } // 累加: 按下键2将当前价格累加到总价 if (k == 2) { sum = sum + all; } // 清零: 按下键3清除价格和总价 if (k == 3) { sum = 0; all = 0; } // LCD第一行: 单价(元) + 重量(g) sprintf(lcd_buf1, "%d.%02dY %03dg ", money / 100, money % 100, press); LCD_ShowString(0, 0, lcd_buf1); // LCD第二行: 当前价格(元) + 累计总价(元) sprintf(lcd_buf2, "%d.%02dY %d.%02dY ", (int)(all / 100), (int)(all % 100), (int)(sum / 100), (int)(sum % 100)); LCD_ShowString(1, 0, lcd_buf2); HAL_Delay(50); // 主循环刷新间隔50ms } /* USER CODE END 3 */}/** * @brief System Clock Configuration * @retval None */void SystemClock_Config(void){ RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** 配置HSI内部8MHz振荡器作为系统时钟源 */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** 配置AHB/APB总线时钟分频 */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); }}/* USER CODE BEGIN 4 *//** * @brief TIM2定时中断回调, 每100ms触发一次 * @param htim: 定时器句柄 * @retval None */void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if (htim == &htim2) // 100ms定时中断 { unsigned long hx711_raw; if (time_cnt < 5) { time_cnt++; } else { time_cnt = 0; // 读取HX711 (通道A, 128倍增益) hx711_raw = HX711_Read(1); if (hx711_raw > 0x007fffff) hx711_raw = 0; // 重量换算: 满量程500g对应0x007fffff press = (unsigned int)(500UL * hx711_raw / 0x007fffff); // 去皮计算 if (press >= qupi) press = press - qupi; else press = 0; } }}
程序流程图:
五、设计说明书
9626字,内容包括硬件设计、软件设计、结论等。
六、资料清单&下载链接
资料下载链接:
链接: https://pan.baidu.com/s/1Xku61llPgC4VEcKJSytbqw?pwd=hqhr
提取码: hqhr
阅读全文
82