历史上的今天
返回首页

历史上的今天

今天是:2024年12月09日(星期一)

正在发生

2020年12月09日 | STC89C51单片机+HX711称重模块电子秤程序

2020-12-09 来源:51hei

电子秤是基于STC89C51单片机,以及HX711称重模块,利用单片机控制A/D转换,屏幕数据显示,键盘实时输入,设计方案能够易于各种场合使用。


单片机源程序如下:

#include

#include

#include

#include "main.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 p=0;

//键盘处理变量

unsigned char keycode;

unsigned char key_press_num=0;


uint GapValue,GapValue1;

bit flag_cz=0;


uchar code  LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B}; //数码管显示码表

//定义标识

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;

sbit DIAN = P0^5;                        //小数点


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();           //保存数据

        }       

}

/*****显示开机初始化等待画面*****/

void Disp_init(void)   

{

        P0 = ~0x80;      //显示----

        P2 = 0xBF;                 //依次打开各位

        Delay_ms(1);                 //延时

        P2 = 0xEF;

        Delay_ms(1);   

        P2 = 0xFB;

        Delay_ms(1);

        P2 = 0xFE;

        Delay_ms(1);

        P2 = 0xFF;         //关闭显示

}


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

void Display_Weight()

{

    P0 = ~LEDData[Weight_Shiwu%10];      //

        P2 = 0xBF;                 //打开位

        Delay_ms(1);                 //延时

        P2 = 0xff;         //关闭显示

        P0=~LEDData[Weight_Shiwu%100/10];    //显示个位

        P2 = 0xEF;

        Delay_ms(1);

        P2 = 0xff;         //关闭显示

        P0 =~LEDData[Weight_Shiwu%1000/100];    //显示十位

        P2 = 0xFB;

        Delay_ms(1);

        P2 = 0xff;         //关闭显示

        P0 =~LEDData[Weight_Shiwu%10000/1000];    //显示百位

        DIAN = 0;         //显示小数点

        P2 = 0xFE;

        Delay_ms(1);

        P2 = 0xff;         //关闭显示

}


//定时器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)   //清零键

        {

                Display_Weight();

                if(ROW1==0)

                {

                        if(qupi==0)

                        qupi=Weight_Shiwu;

                        else

                        qupi=0;

                        Buzzer=0;

                        for(p=0;p<10;p++)

                        Display_Weight();

                        Buzzer=1;       

                        while(ROW1==0) Display_Weight();

                }

        }

        if(ROW2==0)           //加

        {

                Display_Weight();

                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;

                                                for(p=0;p<2;p++)

                                                Display_Weight();

                                                Buzzer=1;

                                                for(p=0;p<2;p++)

                                                Display_Weight();

                                                Get_Weight();

                                        }

推荐阅读

史海拾趣

Fractus公司的发展小趣事

随着技术的不断成熟和产品的市场推广,Fractus逐渐获得了业界的广泛认可。公司在多个国际展会上展示了其创新的天线技术,并赢得了多项重要奖项,包括欧洲联盟IST奖项的特等奖等。这些荣誉不仅提升了Fractus的品牌知名度,也进一步巩固了其在天线技术领域的领先地位。

HSMC公司的发展小趣事

武汉弘芯半导体制造有限公司(HSMC)于2017年11月在武汉市东西湖区临空港经济技术开发区正式成立。公司自成立之初便立下了宏伟的愿景——成为全球领先的CIDM(委托代工与芯片设计整合制造)晶圆厂之一。HSMC汇聚了来自全球半导体晶圆研发与制造领域的顶尖专家团队,致力于集成电路产业先进晶圆与封装制造技术的自主化,为我国电子科技业与芯片设计业贡献力量。

高通(GENITOP)公司的发展小趣事

随着全球市场的不断拓展,超霸电池的销售网络遍布亚洲、欧洲和北美等多个国家和地区。公司始终坚持绿色环保的生产理念,研发出无汞无镉的电池产品,可随生活垃圾丢弃而不会对环境造成影响。此外,超霸电池还积极参与环保事业,旗下多家工厂获得了UL美国安全试验所废弃物零填埋认证。这些举措不仅彰显了超霸电池的社会责任感,也为其在国际市场上树立了良好的品牌形象。

GardTec Inc公司的发展小趣事

背景:随着公司实力的不断增强,GardTec开始积极拓展新的市场领域,提升品牌影响力。

发展:公司不仅在风扇配件市场保持领先地位,还逐步将业务拓展到更广泛的电子配件领域。同时,GardTec积极参加各类行业展会和交流活动,提升品牌知名度和影响力。

影响:通过市场拓展和品牌影响力的提升,GardTec在电子行业中的地位更加稳固,为公司的长期发展奠定了坚实的基础。同时,这也为公司的合作伙伴和客户带来了更多的机遇和价值。

Actel公司的发展小趣事

背景:随着公司实力的不断增强,GardTec开始积极拓展新的市场领域,提升品牌影响力。

发展:公司不仅在风扇配件市场保持领先地位,还逐步将业务拓展到更广泛的电子配件领域。同时,GardTec积极参加各类行业展会和交流活动,提升品牌知名度和影响力。

影响:通过市场拓展和品牌影响力的提升,GardTec在电子行业中的地位更加稳固,为公司的长期发展奠定了坚实的基础。同时,这也为公司的合作伙伴和客户带来了更多的机遇和价值。

Carlisle Interconnect Components公司的发展小趣事

Carlisle Interconnect Components公司深知品质是赢得市场的关键。因此,公司建立了严格的质量管理体系,从原材料采购到生产制造,再到产品出厂,每一个环节都严格把控。这种对品质的执着追求,使得公司的产品在国际市场上获得了良好的口碑。同时,公司还积极拓展海外市场,与多家国际知名企业建立了稳定的合作关系,进一步提升了公司在全球电子连接器市场的影响力。

问答坊 | AI 解惑

MSP430与PC机的远程通信及液晶显示

概述 在微机测控系统中,用作上位机的PC机系统与用作下位机的单片机之间经常要进行信息交换。目前的主流单片机和PC机内部均带有串行口,因而两者之间的通信可通过串行口完成。但是,在实际应用中有时主控PC机和单片机相隔很远,为保证数据能高速及 ...…

查看全部问答>

ISE TCAD简介

看见有人讨论器件模拟的问题,这里也发我的一份学习资料。 希望对有需要的朋友能提供帮助。标价一枚,呵呵。没有芯币而又确实需要的朋友可以发我电子邮件(scuja@163.com)或QQ联系(919194832)。一般晚上十一点下班。经常不在线多多包涵。 本人 ...…

查看全部问答>

又要给人面试了。一些嵌入式系统相关的面试话题,大家也参考下。

Topic of Computer System Basic    (1) alignment access and fix         MIPS: exception handler, 2-instruction operations    (2) cache         cach ...…

查看全部问答>

com1口对应的那8个地址是什么意义?

我现在需要对COM1口的那8个地址进行操作,要关闭串口,然后再打开,我想知道,从3f8到3ff对应的地址的意义,我怎样操作才可以实现关闭串口,然后再打开。谢谢了…

查看全部问答>

传感器问题

用一个24VDC 5A的电源接PLC、触摸屏等都没问题,但是一接到一个神视的光电PM-L4P AE,这个光电就烧掉,不知道是怎么回事,难道是光电需要的电压超了吗?可是怎么查也查不到这个光电的参数…

查看全部问答>

关于DSP的中断向量表

中断向量表中的中断向量名和它们的地址都是怎么弄的,有一定规则吗?…

查看全部问答>

TI 通用LED照明研讨会

    全球半导体领导厂商 - 德州仪器 ( Texas Instruments, TI ),在2011年 9 月底与美国国家半导体合并后为市场提供更丰富的LED照明芯片产品,TI将于3月14日,3月16日以及3月20日到22日分别在厦门,上海、深圳,中山和广州举办2012 TI通 ...…

查看全部问答>

5438给PCF8563读写数据,出错,请大家给找找错

#include <msp430x54x.h>   #define SDA_1       P3OUT |=  BIT7             //SDA = 1#define SDA_0      ...…

查看全部问答>

寻求想做智能家居合作伙伴!要求熟悉arm或是单片机!

去年本人在DIY论坛发布了一个帖子,想做智能家居,得到许多朋友的关注和帮助,本人表示非常的感谢!   现在本人智能家居的方案已经基本搞完,但是合伙人因为种种原因退出了!现在本人想再次寻找一个新的合作伙伴!     希望 ...…

查看全部问答>