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

51单片机+hx711电子秤

发布时间:2024-05-17 发布时间:
|

单片机源程序如下:

#include

#include

#include

#include "main.h"

#include "LCD1602.h"

#include "HX711.h"

#include "eeprom52.h"


#define uchar unsigned char

#define uint unsigned int


unsigned long HX711_Buffer = 0;

unsigned long Weight_Maopi = 0;

unsigned long Weight_Maopi_0 = 0;

long Weight_Shiwu = 0;

unsigned int qupi=0;

//键盘处理变量

unsigned char keycode;

unsigned char key_press_num=0;

uint GapValue,GapValue1;


//定义标识

volatile bit FlagTest = 0; //定时测试标志,每0.5秒置位,测完清0

volatile bit FlagKeyPress = 0; //有键按下标志,处理完毕清0

//校准参数

//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。

//当发现测试出来的重量偏大时,增加该数值。

//如果测试出来的重量偏小时,减小改数值。

//该值可以为小数

//#define GapValue 349

sbit LED=P1^1;

sbit ROW1=P3^0;

sbit ROW2=P3^1;

sbit ROW3=P3^2;

sbit ROW4=P3^3;


volatile bit ClearWeighFlag = 0; //传感器调零标志位,清除0漂


/******************把数据保存到单片机内部eeprom中******************/

void write_eeprom()

{

SectorErase(0x2000);

GapValue1=GapValue&0x00ff;

byte_write(0x2000, GapValue1);

GapValue1=(GapValue&0xff00)>>8;

byte_write(0x2001, GapValue1);

byte_write(0x2060, a_a);

}


/******************把数据从单片机内部eeprom中读出来*****************/

void read_eeprom()

{

GapValue = byte_read(0x2001);

GapValue = (GapValue<<8)|byte_read(0x2000);

a_a = byte_read(0x2060);

}


/**************开机自检eeprom初始化*****************/

void init_eeprom()

{

read_eeprom(); //先读

if(a_a != 1) //新的单片机初始单片机内问eeprom

{

GapValue = 3500;

a_a = 1;

write_eeprom(); //保存数据

}

}


//显示重量,单位kg,两位整数,三位小数

void Display_Weight()

{

LCD1602_write_com(0x80+0x40+8);

if(Weight_Shiwu/10000==0)

LCD1602_write_data(' ');

else

LCD1602_write_data(Weight_Shiwu/10000 + 0x30);

LCD1602_write_data(Weight_Shiwu%10000/1000 + 0x30);

LCD1602_write_data('.');

LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);

LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);

LCD1602_write_data(Weight_Shiwu%10 + 0x30);

}


//定时器0初始化

void Timer0_Init()

{

ET0 = 1; //允许定时器0中断

TMOD = 1; //定时器工作方式选择

TL0 = 0xb0;

TH0 = 0x3c; //定时器赋予初值

TR0 = 1; //启动定时器

}


//定时器0中断

void Timer0_ISR (void) interrupt 1 using 0

{

uchar Counter;

TL0 = 0xb0;

TH0 = 0x3c; //定时器赋予初值


//每0.5秒钟刷新重量

Counter ++;

if (Counter >= 10)

{

FlagTest = 1;

Counter = 0;

}

}



//按键响应程序,参数是键值

//返回键值:

// 7 8 9 10(清0)

// 4 5 6 11(删除)

// 1 2 3 12(未定义)

// 14(未定义) 0 15(.) 13(确定价格)


void KeyPress()

{

if(ROW1==0) //去皮键

{

Delay_ms(5);

if(ROW1==0)

{

// Get_Maopi();

if(qupi==0)

qupi=Weight_Shiwu;

else

qupi=0;

Buzzer=0;

Delay_ms(50);

Buzzer=1;

while(ROW1==0);

}

}

if(ROW2==0) //加

{

Delay_ms(5);

if(ROW2==0)

{

while(!ROW2)

{

key_press_num++;

if(key_press_num>=100)

{

key_press_num=0;

while(!ROW2)

{

if(GapValue<10000)

GapValue+=10;

Buzzer=0;

Delay_ms(10);

Buzzer=1;

Delay_ms(10);

Get_Weight();

}

}

Delay_ms(10);

}

if(key_press_num!=0)

{

key_press_num=0;

if(GapValue<10000)

GapValue++;

Buzzer=0;

Delay_ms(50);

[1] [2] [3]
51单片机hx711电子秤

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

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