设计要求 1、利用压力传感器检测重量信号,经放大和A/D转换,送单片机进行处理,并在液晶屏上显示出被称重量值;
2、最小显示单位为1克;
3、量程超过报警值蜂鸣器报警
资料下载地址:基于51单片机HX711的电子秤称重计价proteus仿真程序设计资料
仿真图1 系统刚上电显示物体重量和报警值
文章图片
仿真图2 按下HX711模块的加键,模拟物体称重,超重报警。
文章图片
硬件设计 电子称原理图
文章图片
程序设计 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仿真程序设计】
文章图片
文章图片
推荐阅读
- 8吋产能供应吃紧情况下灵动微电子12寸晶圆单片机有哪些()
- 《C语言程序设计》(谭浩强第五版) 第5章 循环结构程序设计 习题解析与答案
- C语言进阶|【C语言进阶7——数组和指针的练习(1) - 学习sizeof 和 strlen,看完这一篇就够了】
- 笔记|C语言进阶——3.二维指针
- c|指针进阶——字符指针、指针数组和数组指针如何辨别和判断
- C语言进阶|【C语言进阶6——指针的进阶(3)-总结数组和指针】
- 牛客网-替换空格简单解答
- 浅谈C语言中的文件操作函数
- 8051和PIC之间有什么区别()