单片机|基于51单片机HX711的电子秤称重计价proteus仿真程序设计

设计要求 1、利用压力传感器检测重量信号,经放大和A/D转换,送单片机进行处理,并在液晶屏上显示出被称重量值;
2、最小显示单位为1克;
3、量程超过报警值蜂鸣器报警
资料下载地址:基于51单片机HX711的电子秤称重计价proteus仿真程序设计资料
仿真图1 系统刚上电显示物体重量和报警值
单片机|基于51单片机HX711的电子秤称重计价proteus仿真程序设计
文章图片

仿真图2 按下HX711模块的加键,模拟物体称重,超重报警。
单片机|基于51单片机HX711的电子秤称重计价proteus仿真程序设计
文章图片

硬件设计 电子称原理图
单片机|基于51单片机HX711的电子秤称重计价proteus仿真程序设计
文章图片

程序设计 main.c

/*********************************************************************************************************************************************/#include "main.h" #include "HX711.h" #include "uart.h" #include "LCD1602.h"unsigned long HX711_Buffer = 0; unsigned long Weight_Maopi = 0; long Weight_Shiwu = 0; unsigned char flag = 0; bit Flag_ERROR = 0; sbit speak= P1^7; //校准参数 //因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。 //当发现测试出来的重量偏大时,增加该数值。 //如果测试出来的重量偏小时,减小改数值。 //该值可以为小数 #define GapValue 400//**************************************************** //主函数 //**************************************************** void main() { Uart_Init(); Send_Word("Welcome to use!\n"); Send_Word("Made by Beetle Electronic Technology!\n"); Init_LCD1602(); LCD1602_write_com(0x80); LCD1602_write_word("Welcome to use!"); Delay_ms(1000); //延时,等待传感器稳定 Get_Maopi(); //称毛皮重量 while(1) { EA = 0; Get_Weight(); //称重 EA = 1; Scan_Key(); //显示当前重量 if( Flag_ERROR == 1) { Send_Word("ERROR\n"); LCD1602_write_com(0x80+0x40); LCD1602_write_word("ERROR "); speak=0; } else { speak=1; Send_ASCII(Weight_Shiwu/1000 + 0X30); Send_ASCII(Weight_Shiwu%1000/100 + 0X30); Send_ASCII(Weight_Shiwu%100/10 + 0X30); Send_ASCII(Weight_Shiwu%10 + 0X30); Send_Word(" g\n"); LCD1602_write_com(0x80+0x40); LCD1602_write_data(Weight_Shiwu/1000 + 0X30); LCD1602_write_data(Weight_Shiwu%1000/100 + 0X30); LCD1602_write_data(Weight_Shiwu%100/10 + 0X30); LCD1602_write_data(Weight_Shiwu%10 + 0X30); LCD1602_write_word(" g"); } } }//扫描按键 void Scan_Key() { if(KEY1 == 0) { Delay_ms(5); if(KEY1 == 0) { while(KEY1 == 0); Get_Maopi(); //去皮 } } }//**************************************************** //称重 //**************************************************** void Get_Weight() { Weight_Shiwu = HX711_Read(); Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取净重 if(Weight_Shiwu > 0) { Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/GapValue); //计算实物的实际重量if(Weight_Shiwu > 5000)//超重报警 { Flag_ERROR = 1; } else { Flag_ERROR = 0; } } else { Weight_Shiwu = 0; // Flag_ERROR = 1; //负重报警 } }//**************************************************** //获取毛皮重量 //**************************************************** void Get_Maopi() { Weight_Maopi = HX711_Read(); } //**************************************************** //MS延时函数(12M晶振下测试) //**************************************************** void Delay_ms(unsigned int n) { unsigned inti,j; for(i=0; i

HX711.c
#include "HX711.h"//**************************************************** //延时函数 //**************************************************** void Delay__hx711_us(void) { _nop_(); _nop_(); }//**************************************************** //读取HX711 //**************************************************** unsigned long HX711_Read(void) //增益128 { unsigned long count; unsigned char i; HX711_DOUT=1; Delay__hx711_us(); HX711_SCK=0; count=0; EA = 1; while(HX711_DOUT); EA = 0; for(i=0; i<24; i++) { HX711_SCK=1; count=count<<1; HX711_SCK=0; if(HX711_DOUT) count++; } HX711_SCK=1; count=count^0x800000; //第25个脉冲下降沿来时,转换数据 Delay__hx711_us(); HX711_SCK=0; return(count); }

LCD1602.h
#include "LCD1602.h"//**************************************************** //MS延时函数(12M晶振下测试) //**************************************************** void LCD1602_delay_ms(unsigned int n) { unsigned inti,j; for(i=0; i0) { LCD1602_write_data(*s); s++; } }void Init_LCD1602() { LCD1602_EN = 0; LCD1602_RW = 0; //设置为写状态 LCD1602_write_com(0x38); //显示模式设定 LCD1602_write_com(0x0c); //开关显示、光标有无设置、光标闪烁设置 LCD1602_write_com(0x06); //写一个字符后指针加一 LCD1602_write_com(0x01); //清屏指令 }

全套资源如下 【单片机|基于51单片机HX711的电子秤称重计价proteus仿真程序设计】单片机|基于51单片机HX711的电子秤称重计价proteus仿真程序设计
文章图片

单片机|基于51单片机HX711的电子秤称重计价proteus仿真程序设计
文章图片

    推荐阅读