hx711c语言程序,51单片机HX711传感器电子秤设计(原理图、程序源码、BOM等)

#include                  //调用单片机头文件

#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255

#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

#define ulong unsigned long

#include

uchar code table_num[]="0123456789abcdefg";

sbit rs=P1^0;         //寄存器选择信号 H:数据寄存器          L:指令寄存器

sbit rw=P1^1;         //寄存器选择信号 H:数据寄存器          L:指令寄存器

sbit e =P1^2;         //片选信号   下降沿触发

sbit hx711_dout=P2^1;

sbit hx711_sck=P2^0;

sbit beep = P1^3;     //蜂鸣器

long weight;

uint temp,qi_weight;

bit chaozhong_flag;

bit leiji_flag;

bit flag_300ms ;

ulong price,z_price;   //单价 总价

uchar flag_p;

/***************

删除键

去皮

价格清零

***************/

/******1ms延时函数***12M晶振**************/

void delay_1ms(uint q)

{

uint i,j;

for(i=0;i

for(j=0;j<120;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;

P0=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;

P0=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 == '\0')  break;

write_data(*p);

p++;

}

}

/***********************lcd1602初始化设置************************/

void init_1602()         //lcd1602初始化设置

{

write_com(0x38);        //

write_com(0x0c);

write_com(0x06);

delay_uint(1000);

}

在指定位置显示指定字符//

void write_zifu(uchar hang,uchar add,uchar dat)

{

if(hang==1)

write_com(0x80+add);

else

write_com(0x80+0x40+add);

write_data(dat);

}

/********************************************************************

* 名称 : write_sfm4_price(uchar hang,uchar add,uchar date)

* 功能 : 显示价格

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void write_sfm4_price(uchar hang,uchar add,uint date)

{

if(hang==1)

write_com(0x80+add);

else

write_com(0x80+0x40+add);

write_data(0x30+date/1000%10);

write_data(0x30+date/100%10);

write_data('.');

write_data(0x30+date/10%10);

write_data(0x30+date%10);

}

/****************开机液晶显示函数 初始化液晶的内容********************************/

void init_1602_dis_csf()  //初始化液晶

{

write_string(1,0,"   W:0.000kg    ");

write_string(2,0,"P:00.00  Z:00.00");

write_zifu(2,7,0x5c);        //¥

//        write_zifu(2,15,0x5c);        //¥

}

/*******************压力显示程序***********************/

void write_1602_yl(uchar hang,uchar add,uint date)

{

if(hang==1)

write_com(0x80+add);

else

write_com(0x80+0x40+add);

write_data(0x30+date/1000%10);

write_data('.');

write_data(0x30+date/100%10);

write_data(0x30+date/10%10);

write_data(0x30+date%10);

}

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=0;

Delay__hx711_us();

hx711_sck=1;

return(count);

}

void get_pizhong()          //获取皮重,秤盘重量

{

ulong hx711_dat;

hx711_dat=ReadCount();                //HX711AD转换数据处理

temp=(uint)(hx711_dat/100);

}

void get_weight()          //获取被测物体重量

{

ulong hx711_data,a;

uint get,aa;

hx711_data=ReadCount();                   //HX711AD转换数据处理

get=(uint)(hx711_data/100);

if(get>temp)

{

a=ReadCount();

aa=(uint)(a/100)-temp;

weight=(uint)((float)aa/4.9+0.05);//重量转换函数,传感器型号不同此函数要适当修改

}

}

/************************************************/

/*  由于称重传感器线性度参数的不同,而对获得的重量数据处理,

此处可能会根据不同称重传感器,程序的代码会有所不同      */

/************************************************/

/*************定时器0初始化程序***************/

void time_init()

{

EA   = 1;                   //开总中断

TMOD = 0X01;          //定时器0、定时器1工作方式1

ET0  = 1;                  //开定时器0中断

TR0  = 1;                  //允许定时器0定时

}

/********************独立按键程序*****************/

uchar key_can;         //按键值

void key()         //独立按键程序

{

static uchar key_new = 0, key_l;

key_can = 20;                   //按键值还原

P3 = 0x0f;

if((P3 & 0x0f) != 0x0f)                //按键按下

{

delay_1ms(1);                     //按键消抖动

if(((P3 & 0x0f) != 0x0f) && (key_new == 1))

{                                                //确认是按键按下

key_new = 0;

key_l = P3 | 0xf0;   //矩阵键盘扫描

P3 = key_l;

switch(P3)

{

case 0xee:  key_can = 1;  break;  //得到按键值

case 0xde:  key_can = 4;  break;   //得到按键值

case 0xbe:  key_can = 7;  break;   //得到按键值

case 0x7e:  key_can = 10;  break;   //得到按键值

case 0xed:  key_can = 2;  break;  //得到按键值

case 0xdd:  key_can = 5;  break;   //得到按键值

case 0xbd:  key_can = 8;  break;   //得到按键值

case 0x7d:  key_can = 0;  break;   //得到按键值

case 0xeb:  key_can = 11;  break;  //得到按键值

case 0xdb:  key_can = 9;  break;   //得到按键值

case 0xbb:  key_can = 6;  break;   //得到按键值

case 0x7b:  key_can = 3;  break;   //得到按键值

case 0xe7:  key_can = 15;  break;  //得到按键值

case 0xd7:  key_can = 14;  break;  //得到按键值

case 0xb7:  key_can = 13;  break;   //得到按键值

case 0x77:  key_can = 12;  break;  //得到按键值

}

beep = 0;  //蜂鸣器叫一声

delay_1ms(100);

beep = 1;

}

}

else

key_new = 1;

}

/************按键控制函数*************/

void key_with()

{

if(key_can <= 9)   //数字键

{

if(flag_p >= 4)

{

flag_p = 0;

}

if(flag_p == 0)

price = key_can;

else

{

price = price * 10 + key_can;

}

write_sfm4_price(2,2,price);        //显示单价

flag_p ++;

}

if(key_can == 15)   //删除键

{

if(price != 0 )

{

flag_p --;

price /= 10;                 //删除

write_sfm4_price(2,2,price);//显示单价

}

}

if(key_can == 14)   //去皮

{

get_pizhong();          //获取皮重,秤盘重量

}

if(key_can == 13)   //价格清零

{

flag_p = 0;

price = 0;

write_sfm4_price(2,2,price);//显示单价

}

}

/*****************主函数********************/

void main()

{

beep = 0;  //蜂鸣器叫一声

delay_1ms(100);

P0 = P1 = P2 = P3 = 0xff;                //单片机IO口初始化为1

time_init();                    //初始化定时器

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………