51单片机的LCD12864电子秤设计

硬件方案

        本设计利用压力传感器采集因压力变化产生的电压信号,经过电压放大电路放大,然后再经过模数转换器转换为数字信号,最后把数字信号送入单片机。单片机经过相应的处理后,得出当前所称物品的重量及总额,然后再显示出来。此外,还可通过键盘设定所称物品的价格。
   主要由51单片机最小系统,LCD12864液晶显示屏,HX711AD转换模块,LED指示灯,蜂鸣器电路,矩阵按键,10kg压力传感器等;原理图如图:

PCB图如下:

 

 

设计功能

  • 可以输出量程为10kg物体的重量,精度为0.001kg;
  • 可通过按键设置单价,并根据实际重量计算出总价;
  • 支持去皮功能、切换量程等功能,输出的重量和总额采用四舍五入;
  • 采用LCD12864显示屏,支持中文显示;

软件设计

void main()                                            
{      
    INT_8 j = 0, k = 0, count = 0;
    UINT_8 Key = 0, Num = 0;        //Key存储按键的键值,Num存储按下的是那个数字
    UINT_32 tmp = 0;          
    Init();
    while (1)
    {
        WDT_FeedDog();               //喂狗
        if (KeycanFlag == 0)                    //价格还没输入时可以显示(防止价格输入一半DDRAM地址改变,造成价格不可连续输入)
        {      
            if (TimeCount >= 50)                //定时时间超过250ms执行AD采集
            {
                //    Offset = AD_Hx711();                                 //8527820-8475960 =51860
                //    Display_Int2str(Offset, WeightTable, 0x93);
                 WeightTemp = AD_Weight(AD_Hx711());                   //把AD值转化为以克为单位的质量(含小数)
                if (WeightTemp > 4000)                                //超出量程4000g报警
                {    
                    for (k = 0; k < 4; k++)
                    {
                        LcdDdram_Display(1,3,table5);          //输出错误字符串                   
                    }
                    Beep = 0;              //蜂鸣器鸣叫
                    Led  = 0;              //Led亮
                }    
                else
                {                                                         
                    Beep = 1;                                       //重量少于最大量程关闭蜂鸣器
                    Led  = 1;    
                    tmp = (UINT_32)(WeightTemp);    //    tmp = (UINT_32)(WeightTemp + 0.5);           //将质量四舍五入,例如1000.50 》1001
                    if(RangeFlag == 0)                          //量程单位为g
                    {        
                        Init_Weighttab(WeightTable,table6);    //初始化字符数组为空格,防止上次字符位数比这次大,没有清除
                        k = 0;                                 //例如上次显示1234,这次12,残留34
                        Weight = tmp;                         //中间质量变量赋给质量
                        while (tmp != 0)                                         
                        {
                            WeightTable[k++] = 0x30 + tmp % 10;             //提取十进制最后一位转换为字符
                            tmp /= 10;        
                        }    
                        if (k == 0)                    //质量为0时
                        {    
                            WeightTable[k++] = '0';           
                        }    
                        Write_Cmd(0x93);                                     
                        count = k;
                        while (k > 0)               
                        {    
                            Write_Data(WeightTable[k-1]);      //质量倒序输出,因为之前是倒序输入,高位地址为高位,由高位到低位    
                            k--;                                  
                        }     
                        for (k = count; k < 5; k++ )          //把上次残留的字符清掉
                        {
                             Write_Data(WeightTable[k]);
                        }
                    }
                    else
                    {
                        Init_Weighttab(WeightTable,table8);             //清空字符串数组
                        k = 0;
                        Weight = tmp / 1000.0;                    //质量/g 1000 =  /kg
                          while (tmp != 0)                             
                        {
                            WeightTable[k++] = 0x30 + tmp % 10;             
                            tmp /= 10;        
                            if (k == 3)                                //i=3时就是获得3位小数时插入小数点    
                            {                            
                                WeightTable[k] = '.';             
                                k += 1;    
                            }
                        }
                        if (k == 4)                //刚好3个小数补0 0.123            
                        {
                            WeightTable[k] = '0';        
                            k++;               //和上面统一,k比实际大1,下面再减回
                        }
                        if (k < 3)                           //当不够两位小数时,例如1实际代表的是0.01
                        {        
                            WeightTable[4] = 0x30;                //在最高位插入0
                            WeightTable[3] = '.';                //在最次高位插入.
                            for (j = k; j < 3; j++)
                            {
                                WeightTable[j] = 0x30;         //如果只有0位时插入一个插入两个0     0.00
                            }                                     //如果只有1位时插入一个插入1个0     0.0
                            k = 5;                                //0.001刚好5个数
                        }    
                        Write_Cmd(0x93);                 //重定位液晶DDRAM地址                         
                        while (k > 0)                   
                        {    
                            Write_Data(WeightTable[k-1]);      //总额结算,倒序输出,因为之前是倒序输入,高位地址为高位
                            k--;                                  
                        } 
    
                    }
                
                }                 
                TimeCount = 0;
                Write_Cmd(0x8b);                             //显示完体重就定位价格显示地址
            }           
        }    
    }         
}

资料链接:https://pan.baidu.com/s/1aezXP3LToaaDFhqc3RytvA?pwd=cc09 
提取码:cc09

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值