2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > HX711电子秤称重模块配送资料(加中值滤波的单片机源码)

HX711电子秤称重模块配送资料(加中值滤波的单片机源码)

时间:2024-01-16 00:59:06

相关推荐

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;

returncount;

}

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采样的数据个数达到中值滤波要求的数据个数

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。