文章目录
- 0 前言
- 1 简介
- 2 主要器件
- 3 实现效果
- 4 设计原理
- 4.1 STM32F103C8T6
- 4.2 HX711压力传感器
- 5 部分核心代码
- 6 最后
0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 基于stm32的智能电子秤系统
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:3分
1 简介
基于stm32的智能电子秤设计,有很多功能,称重,报警,蓝牙app连接,语音播报,去皮等。
2 主要器件
- STM32F103C8T6
- HX711压力传感器
- 矩阵键盘
- 蓝牙模块
- 电子秤
3 实现效果
4 设计原理
4.1 STM32F103C8T6
简介
STM32F103C8T6是一款基于ARM Cortex-M3内核(ARM公司在ARM11以后改用Cortex命名,并分成A、R和M三类,M系列有M0、M0+、M3、M4、M7)的32位的微控制器,采用LQFP48封装,由意法半导体公司(ST)推出,属于STM32系列(ST公司还有SPC5X系列微控制器)。其程序存储器FLASH容量是64KB (64K x 8bit),RAM容量是20KB(20K x 8bit),2个12bit ADC合计12路通道(外部通道只有PA0到PA7、PB0到PB1,并不是18通道),37个通用I/O口(PA0-PA15、PB0-PB15、PC13-PC15、PD0-PD1),4个16bit定时器(TIM1(高级控制定时器,带死区插入,常用于产生PWM控制电机)、TIM2、TIM3、TIM4),2IIC,2SPI,3USART,1CAN,工作电压2V~3.6V,工作温度为-40°C ~ 85°C,系统时钟最高可到72MHz(一般是由8MHz的外部时钟经锁相环9倍频到72MHz)。
相关引脚分布
本项目中STM32主要通过ADC采集MQ-3模块的值转换为酒精浓度值显示在LCD屏幕上。同时,驱动语音播报模块、风扇和蜂鸣器。
4.2 HX711压力传感器
简介
HX711称重传感器专用模拟/数字(A/D)转换器芯片,是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B则为固定的32增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。
特点
- 两路可选择差分输入
- 片内低噪声可编程放大器,可选增益为64 和128
- 片内稳压电路可直接向外部传感器和芯片内A/D 转换器提供电源
- 片内时钟振荡器无需任何外接器件,必要时也可使用外接晶振或时钟
- 上电自动复位电路
- 简单的数字控制和串口通讯:所有控制由管脚输入,芯片内寄存器无需编程
- 可选择10Hz 或80Hz 的输出数据速率
- 同步抑制50Hz 和60Hz 的电源干扰
- 耗电量(含稳压电源电路):典型工作电流:<1.7mA, 断电电流:<1μA
- 工作电压范围:2.6 ~ 5.5V
- 工作温度范围:-20 ~ +85℃
- 16 管脚的SOP-16 封装
原理图
5 部分核心代码
void Hx711_init(void)
{
__HAL_RCC_GPIOD_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_5;//时钟端口配置为输出
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_6;//数据引脚配置输入模式
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void) //增益128
{
unsigned long val = 0;
unsigned char i = 0;
//判断模块是否准备好
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1));
delay_us(1);
//sck 拉低
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
//再次判断是否准备好
while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1));
for(i=0;i<24;i++)
{
delay_us(100);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
val=val<<1;
delay_us(1);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1))
val++;
delay_us(1);
}
GPIO_SetBits(GPIOB,GPIO_Pin_0);
val = val^0x800000;
delay_us(1);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
delay_us(1);
return val;
}
void Delay_ms(uint8_t time)
{
uint8_t i;
while(time--){
for(i=0;i<113;i++);
}
}
//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void) //增益128
{
unsigned long data=0;
unsigned char i;
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port ,HX711_SCK_Pin,GPIO_PIN_RESET);
Delay_ms(1);
while(HAL_GPIO_ReadPin(HX711_Dout_GPIO_Port ,HX711_Dout_Pin)==GPIO_PIN_SET);
for(i=0;i<24;i++)
{
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port ,HX711_SCK_Pin,GPIO_PIN_SET);
Delay_ms(1);
data=data<<1;
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port ,HX711_SCK_Pin,GPIO_PIN_RESET);
if(HAL_GPIO_ReadPin(HX711_Dout_GPIO_Port ,HX711_Dout_Pin)== GPIO_PIN_SET)
data++;
}
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port ,HX711_SCK_Pin,GPIO_PIN_SET);
data=data^0x800000;//第25个脉冲下降沿来时,转换数据
Delay_ms(1);
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port ,HX711_SCK_Pin,GPIO_PIN_RESET);
return (data);
}
//****************************************************
//获取毛皮重量
//****************************************************
void Get_Maopi(void)
{
Weight_Maopi = HX711_Read()/SCALE;
}
//****************************************************
//称重
//****************************************************
void Get_Weight(void)
{
Weight_Shiwu =HX711_Read()/SCALE;
if(Weight_Shiwu>=Weight_Maopi)
{
Weight_Shiwu=Weight_Shiwu-Weight_Maopi;
Weight_Shiwu -= 18305;
if(Weight_Shiwu < 0 )
Weight_Shiwu = 0;
}
else
Weight_Shiwu=0;
}