• 方案介绍
  • 相关推荐
申请入驻 产业图谱

基于STM32的电子秤LCD显示Proteus仿真+程序代码+设计报告+讲解

50分钟前
82
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

 

基于STM32的电子秤LCD显示仿真设计

本设计包含proteus仿真+程序代码+设计报告+讲解视频

一、开发环境

仿真图:proteus 8.17

程序编译器:keil 5

编程语言:C语言

设计编号:C0140

二、主要功能

基于STM32单片机的电子秤proteus仿真设计

1.电子秤可以数字显示0g-499g间物体的重量,单位克(g);

2.电子秤可以设置单价(元/克)可计算物品金额并实现金额累加,单价范围0.01-0.99元克;

3.通过LCD1602显示单价,物体重量,商品价格和总价;

4.矩阵按键设置单价,计价,价格累加,清零和去皮功能;

5.通过HX711高精度AD转换芯片读取压力传感器数值。

资料下载链接:

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

相关推荐