由STC89C51单片机+最小系统+LCD1602液晶显示模块+HX711AD模块+LED模块+蜂鸣器+按键模块+10kg压力传感器构成。
具体功能:
1、数码管显示当前的重量,单位是g;
2、有去皮和清零功能,可以通过三个按键微调校准重量;
3、最大称重9.999kg,超过最大量程声光报警。
部分代码:
#include <reg52.h> #include <intrins.h> #include <string.h> #include "main.h" #include "LCD1602.h" #include "HX711.h" #include "eeprom52.h" #define uchar unsigned char #define uint unsigned int unsigned long HX711_Buffer = 0; unsigned long Weight_Maopi = 0; unsigned long Weight_Maopi_0 = 0; long Weight_Shiwu = 0; unsigned int qupi=0; //键盘处理变量 unsigned char keycode; unsigned char key_press_num=0; uint GapValue,GapValue1; //定义标识 volatile bit FlagTest = 0; //定时测试标志,每0.5秒置位,测完清0 volatile bit FlagKeyPress = 0; //有键按下标志,处理完毕清0 //校准参数 //因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。 //当发现测试出来的重量偏大时,增加该数值。 //如果测试出来的重量偏小时,减小改数值。 //该值可以为小数 //#define GapValue 349 sbit LED=P1^1; sbit ROW1=P3^0; sbit ROW2=P3^1; sbit ROW3=P3^2; sbit ROW4=P3^3; volatile bit ClearWeighFlag = 0; //传感器调零标志位,清除0漂 /******************把数据保存到单片机内部eeprom中******************/ void write_eeprom() { SectorErase(0x1000); GapValue1=GapValue&0x00ff; byte_write(0x1000, GapValue1); GapValue1=(GapValue&0xff00)>>8; byte_write(0x1001, GapValue1); byte_write(0x1060, a_a); } /******************把数据从单片机内部eeprom中读出来*****************/ void read_eeprom() { GapValue = byte_read(0x1001); GapValue = (GapValue<<8)|byte_read(0x1000); a_a = byte_read(0x1060); } /**************开机自检eeprom初始化*****************/ void init_eeprom() { read_eeprom(); //先读 if(a_a != 1) //新的单片机初始单片机内问eeprom { GapValue = 2450; a_a = 1; write_eeprom(); //保存数据 } } //显示重量,单位kg,两位整数,三位小数 void Display_Weight() { LCD1602_write_com(0x80+0x40+8); if(Weight_Shiwu/10000==0) LCD1602_write_data(' '); else LCD1602_write_data(Weight_Shiwu/10000 + 0x30); LCD1602_write_data(Weight_Shiwu%10000/1000 + 0x30); LCD1602_write_data('.'); LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30); LCD1602_write_data(Weight_Shiwu%100/10 + 0x30); LCD1602_write_data(Weight_Shiwu%10 + 0x30); } //定时器0初始化 void Timer0_Init() { ET0 = 1; //允许定时器0中断 TMOD = 1; //定时器工作方式选择 TL0 = 0xb0; TH0 = 0x3c; //定时器赋予初值 TR0 = 1; //启动定时器 } //定时器0中断 void Timer0_ISR (void) interrupt 1 using 0 { uchar Counter; TL0 = 0xb0; TH0 = 0x3c; //定时器赋予初值 //每0.5秒钟刷新重量 Counter ++; if (Counter >= 10) { FlagTest = 1; Counter = 0; } }
原理图:
仿真图: