文章目录
- 一、前言
- 二、项目功能简介
- 三、PCB设计
- 四、原理图设计
- 五、程序设计
- 六、包含内容
- 七、资料分享
一、前言
实物项目成品: 
仿真项目成品: 
哔哩哔哩开源视频链接(复制浏览器打开): https://www.bilibili.com/video/BV1TKYg6dEgc/?vd_source=10da4d04d580bd6b34f7298120737c50
(资料分享见文末)
二、项目功能简介
【开源】STM32 单片机电子秤计价系统(代码+原理图+仿真)-编号:CY26030 功能介绍: (1)液晶屏实时显示皮重、当前重量、物品单价与计算得出的总价。 (2)实体按键可完成参数设置,支持设置物品单价、重量报警阈值。 (3)具备去皮清零与单价清除功能,一键去除容器皮重,一键清空已设置单价。 (4)称重量程 0~10kg,可通过按键自定义设置超重阈值;当检测重量超过设定阈值时,蜂鸣器触发声光报警。 (5)按下确认按键,屏幕画面锁定,保持显示当前重量、单价以及总价。 (6)称重数据通过 WiFi 同步上传到手机 APP;手机端可远程设置单价、执行去皮清零等控制操作。
三、PCB设计

四、原理图设计

五、程序设计
代码如下():
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Timer.h"
#include "OLED.h"
#include "BEEP.h"
#include "KEY.h"
#include "Weight.h"
uint8_t TIM2_Flag = 0;//定时器2中断标志
uint8_t keynum; //按键
/*
u32 Pi_weight;
u32 Weight;
u32 weight_err;
*/
float Pi_weight;
float Weight;
float weight_err;
char price[7];
float single_price;
float total_price;
uint8_t decimal;//小数位
void show_init();
void set_price();//设置单价
void main_Init(void);
void main_loop(void);
int main(void)
{
main_Init();
while(1)
{
main_loop();
}
}
void main_Init()
{
OLED_Init();
Timer_Init();
BEEP_Init();
OLED_Clear();
HX711_GPIO_Init();
OLED_ShowChinese(2,2,"正在初始化…");
Delay_ms(2000);//对接成功界面停留一定时间
weight_err = Get_Tare();
Pi_weight = Get_Tare();
}
void main_loop()
{
show_init();
keynum = KeyScan();
if(keynum != 255)
{
if(keynum == remove_tare)
{
Pi_weight = Get_Tare();
}else if(keynum == set)
{
set_price();
}
}
/*
OLED_ShowNum(1,7,(int)(Pi_weight – weight_err),4);
OLED_ShowNum(1,12,(int)(weight_err),4);
OLED_ShowNum(2,7,(int)(Pi_weight),4);
*/
Weight = 1.73*Get_Weight(Pi_weight);
if(Weight < 0.5)Weight = 0;//去除干扰
total_price = single_price*Weight/1000;
OLED_ShowNum(1,7,(int)(Pi_weight – weight_err)/1000,1);
OLED_ShowChar(1,8,'.');
OLED_ShowNum(1,9,(((Pi_weight – weight_err)/1000)–(int)((Pi_weight – weight_err)/1000))*10000,4);
OLED_ShowNum(2,7,(int)(Weight)/1000,1);
OLED_ShowChar(2,8,'.');
OLED_ShowNum(2,9,(((Weight)/1000)–(int)((Weight)/1000))*10000,4);
//OLED_ShowNum(2,7,Weight,4);
if(price[0] == '\\0')
{
OLED_ShowNum(3,7,0,6);
}else
OLED_ShowString(3,7,price);
OLED_ShowNum(4,7,(int)total_price,5);
OLED_ShowChar(4,12,'.');
OLED_ShowNum(4,13,(total_price–(int)total_price)*10,1);
Delay_ms(100);
}
void show_init()
{
OLED_ShowChinese(1,1,"皮重:");
OLED_ShowChinese(1,7,"千克");
OLED_ShowChinese(2,1,"重量:");
OLED_ShowChinese(2,7,"千克");
OLED_ShowChinese(3,1,"单价:");
OLED_ShowChinese(3,8,"元");
OLED_ShowChinese(4,1,"价格:");
OLED_ShowChinese(4,8,"元");
}
void set_price()
{
OLED_Clear();
OLED_ShowChinese(1,3,"请输入单价");
uint8_t index = 0;
uint8_t dot_flag = 0;
uint8_t end_flag = 0;
single_price = 0;
decimal = 0;
price[0] = '\\0';
while(1)
{
if(index == 6)break;
keynum = KeyScan();
if(keynum == ok)
{
break;
}else if(keynum >=0 && keynum <= 9 && end_flag == 0)
{
price[index] = '0' + keynum;
if(index < 6)
price[index+1] = '\\0';
OLED_ShowChar(3,7+index,price[index]);
if(index > 0 && price[index–1] == '.')
{
single_price += keynum*0.1;
decimal = keynum;
end_flag = 1;
}else
{
single_price *= 10;
single_price += keynum;
}
index++;
}else if(keynum == dot)
{
if(index > 0)
{
if(dot_flag==0)
{
dot_flag = 1;
price[index] = '.';
if(index < 6)
price[index+1] = '\\0';
OLED_ShowChar(3,7+index,price[index]);
index++;
}
}
}
}
OLED_Clear();
}
六、包含内容

七、资料分享
资料获取:请查看主页介绍搜索或观看开源视频获取






