×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-17 发布时间:
|

电子秤注意!!!!!!
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

                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

        {

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



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址