HX711电子秤称重模块配送资料(加中值滤波的单片机源码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HX711电子秤称重模块配送资料(加中值滤波的单片机源码)
电子秤注意
1.程序中采用P16、P17口作为HX711的数据口。
2.每个传感器的系数不一样,第一次测量必须修正传感器的系数。
(修正系数HX711_xishu)
修正方法:
例如1000g砝码称出来是934g,则HX711_xishu=(原值)*1000/934;
电路原理图如下:
电子称 LCD1602(加中值滤波)单片机源程序如下:
#include //调用单片机头文件
#include
#define uchar unsigned char //无符号字符型宏定义变量范围0~255
#define uint unsigned int //无符号整型宏定义变量范围0~65535
#define ulong unsigned long
sbit rs=P0^5 //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit rw=P0^6; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit e =P0^7; //片选信号下降沿触发
sbit hx711_dout=P1^7;
sbit hx711_sck =P1^6;
sbit beep = P3^0; //蜂鸣器
sbit K1 = P3^5; //加
sbit K2 = P3^6; //长按去皮键
sbit K3 = P3^7; //减
uchar K2_num;
uint time1;
uint time2;
uint time3;
long weight; //实际重量值
long qi_weight; //皮重
ulong warn_weight;
ulong HX711_xishu=35386; //这是一个修正系数,例如1000g砝码称出来是934g,则HX711_xishu=原数据*1000/934;
#define MEDIAN_LEN 5 //中值滤波的滤波长度,一般取奇数
#define MEDIAN 3 //中值在滤波数组中的位置
ulong buffer[MEDIAN_LEN]; //中值滤波的数据缓存
int medleng = 0; //一组中值滤波数据中,进入滤波缓存的数据个数
ulong xd,xd1; //数据对比大小中间变量
/***************
删除键
去皮
价格清零
***************/
/******1ms延时函数***11.0592M晶振**************/
void delay_1ms(uint q)
{
ulong i,j;
for(i=0;i<>< p=""><>
for(j=0;j<11;j++);
}
/************************************************************** ******
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
*************************************************************** ********/
void delay_uint(uint q)
{
while(q--);
}
/************************************************************** ******
* 名称 : write_com(uchar com)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
*************************************************************** ********/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P2=com;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/************************************************************** ******
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
*************************************************************** ********/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P2=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/***********************lcd1602上显示这字符函数************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '') break;
write_data(*p);
p++;
}
}
/***********************lcd1602初始化设置************************/
void init_1602() //lcd1602初始化设置
{
write_com(0x38); //
write_com(0x0c);
write_com(0x06);
delay_uint(1000);
}
void Delay__hx711_us(void)
{
_nop_();
_nop_();
}
ulong ReadCount(void) //增益128
{
ulong count,value = 0;
uchar i;
hx711_dout=1;
Delay__hx711_us();
hx711_sck=0;
count=0;
while(hx711_dout);
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;
}
void get_pizhong() //获取皮重,秤盘重量
{
ulong hx711_dat;
uchar i;
for(i=0;i<>< p=""><>
{
hx711_dat=ReadCount(); //HX711AD转换数据处理
if(medleng == 0) //缓存的第1个元素,直接放入,不需要排序
{
buffer[0] = hx711_dat; medleng = 1;
}
else //插入排序算法,按从小到大的顺序排列
{
for(i = 0; i < medleng; i ++)
{
if( buffer[i] > hx711_dat) // 轮询到的当前元素>AD值,则交换它们的值,xd为中间变量存放位置
{
xd = hx711_dat; hx711_dat = buffer[i]; buffer[i] = xd;
}
}
buffer[medleng] = hx711_dat; //把轮询出较大的数放入缓存的后面.
medleng++;
}
if(medleng >= MEDIAN_LEN) //ADC采样的数据个数达到中值滤波要求的数据个数。