历史上的今天
返回首页

历史上的今天

今天是:2025年02月22日(星期六)

2020年02月22日 | 基于HX711+51单片机电子秤

2020-02-22 来源:51hei

仿真原理图如下
0.png?imageView2/2/w/5500.png?imageView2/2/w/550

原理图

原理图 
单片机源程序如下:

#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);

                                Buzzer=1;

                        }

                        write_eeprom();                

                }

        }

        if(ROW3==0)  //减

        {

                Delay_ms(5);

                if(ROW3==0)

推荐阅读

史海拾趣

DCX-CHOL Enterprises公司的发展小趣事

随着技术的不断成熟,DCX-CHOL Enterprises的产品逐渐在市场上树立了良好的口碑。公司敏锐地捕捉到智能家居、物联网等新兴领域对电子产品的巨大需求,于是开始将产品线向这些领域拓展。通过与行业领军企业的合作,DCX-CHOL Enterprises成功地将产品打入这些新兴市场,市场份额逐年上升。同时,公司还积极开拓国际市场,将产品出口到多个国家和地区,进一步扩大了公司的知名度和影响力。

Andersen Laboratories Inc公司的发展小趣事

为了更好地服务全球客户,AnalogicTech积极实施全球化运营策略。公司在亚洲和大中华地区建立了广泛的晶圆制造和后端合作伙伴网络,包括香港地区、上海和台湾地区的台北。此外,AnalogicTech还迁入香港科技园,将深圳地区纳入业务版图,提高在中国大陆的销售情况,特别是珠江三角洲地区。

GS Technology公司的发展小趣事
为了只显示峰值,需要引入峰值检测电路。这可以通过二极管、电容等元件组成的峰值保持电路来实现,该电路能够捕获并保持信号的最大值。
振宝佳(DMBJ)公司的发展小趣事

随着电子产业的不断发展,SMT贴片技术逐渐成为电子信息产业的支柱技术之一。振宝佳公司紧跟时代步伐,在网络、通信、军事、工业控制以及汽车电子、家电等所有电子领域里全部采用了SMT贴片技术。这一技术的应用不仅提高了产品的集成度和可靠性,也为客户提供了更加优质的产品和服务。

American Technical Ceramics (ATC)公司的发展小趣事

随着电子产业的不断发展,SMT贴片技术逐渐成为电子信息产业的支柱技术之一。振宝佳公司紧跟时代步伐,在网络、通信、军事、工业控制以及汽车电子、家电等所有电子领域里全部采用了SMT贴片技术。这一技术的应用不仅提高了产品的集成度和可靠性,也为客户提供了更加优质的产品和服务。

EPIGAP公司的发展小趣事

随着全球对环保问题的日益关注,EPIGAP公司也开始注重绿色环保和可持续发展。公司积极采用环保材料和生产工艺,减少生产过程中的污染物排放。同时,EPIGAP还加大了对可再生能源的研发力度,推动公司向绿色、低碳、循环发展的方向迈进。这一战略不仅符合全球环保趋势,也为公司赢得了良好的社会声誉。

问答坊 | AI 解惑

串口一分二连接的问题

我想用一台主机连接两个终端,串口只有一个,不能加串口卡什么的。 主机(发送接收) | | |——————从终端(只收不发) | | 主终端(发送接收) 我试过直接从主机与主终端的串口连接线中并接出一条线到从终端去,但并不成功,主机与主 ...…

查看全部问答>

memset与 变量定义时初始化的 区别

unsigned char pDATA[8]; memset(pDATA,0 ,8); 如果直接在定义处初始化为0,与memset的区别是 什么?…

查看全部问答>

请有经验的大师推荐一款带USB接口和通讯功能的单片机

各位XDJM,我想使用一个带USB接口和通讯功能的单片机!请知道的给我提供一下地址或者资料!先谢了!! …

查看全部问答>

请教SD卡坏块检测问题.

我在s3c2440上做SD卡读写驱动,没有文件系统,就一块一块地读写.怎样检测坏块,有了坏块怎么标记呢? SD卡又不像nand flash那样有自己的一套检测标记方式,请大家指点!!…

查看全部问答>

越来越受不了万利

我搞不懂ST为什么找万利这种货色的公司做代理。早就耳闻万利技术支持垃圾,没想到这么垃圾。今天咨询某工一个问题,我仔细和他叙述一遍,结果他说没有听懂我在说什么。我当时捏一把汗,难道我在说火星语?我又花2分钟仔细从头到尾把问题叙说一 ...…

查看全部问答>

求助:warning: last line of file ends without a newline

我用的是ccs2.0,片子是6713。 求助各位高手,我在编译ccs时,每次都出现warning: last line of file ends without a newline。有人说是最后一行要加个回车,我加了,可是还是有这个问题,这里请教各位了。 还有就是我每次编译完ccs,它总是自动 ...…

查看全部问答>

Buck电源深入研究之纹波电压(有图)

最近制作了一块Buck 型DCDC开关电源,24V转5V;利用示波器AC耦合输入测试电源的纹波电压,大约为+10mv/-15mv,但是纹波电压的波动和MOS管的开关对应关系好像不对,教科书中介绍BUCK输出滤波电容纹波电压与 MOS管的开关对应关系如下图:但是我测得输 ...…

查看全部问答>

这程序有点问题,计时的

#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;uchar a,num,t,shi,fen,M1,M2;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7 ...…

查看全部问答>

Sate210 SDMMC/Inand wince 启动bootloader 镜像终于准备发布了!

使用文档和镜像,以及uboot 启动SD卡制作工具下载链接 这几周我都在升级Sate210 的 SDMMC/inand 启动wince 系统的bootloader,其实是完全替代了,以前三星提供的dragin 的烧写方式, O(∩_∩)O~其实我是借助了u-boot的 大风,用u-boot 启动了Sate ...…

查看全部问答>

【学习心得】---电池电量监测基础知识

这几天看到学习视频中有电池检测的视频,本以为TI会大力的宣传其阻抗跟踪技术,但是,点开视频从第一讲开始,TI就对整个电池监测技术做了总结,这里面包括我们之前通常使用的ADC直接监测电池电压来判断电池的容量,然后就是库仑计法,该算法可以做 ...…

查看全部问答>