找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1371|回复: 1
收起左侧

求大神康康代码怎么改(基于51单片机的电子秤用数码管显示),硬是看了一天还是不懂

[复制链接]
ID:818611 发表于 2020-11-18 00:19 | 显示全部楼层 |阅读模式
求大神康康代码怎么改(基于51单片机的电子秤用数码管显示),硬是看了一天还是不懂...
IMG_20201114_151622.jpg

1.数字电子秤具备去皮、单价1输入、单价2输入、总价计算和删除单价、超量程提示等相应的功能,数码管能够实时显示当前输入单价信息、称重信息及总价信息;2.去皮即通过按键设置,触发程序减去电子秤托盘的重量,放上待测物品后得到的物品的净重,净重测量范围0 999,当超过999时,数码管则显示“- - -- --- -”,提示超量程。
3.能够通过4x4键盘输入物品的单价,能够实现0^99.99的单价范围内输入,并通过按键实现总价的计算及删除;
数码管显示格式为: XXXX- XXX,前四位显示输入单价,后三位显示净重,当按下“总价”按钮时,则显示当前的总价,具体显示格式不做要求,但人机操作界面需简单易懂及数码管不得闪烁。

硬件(看相片);

这是代码;(不懂怎么改了……………………)
#include "STC15W408AS.H"
#include "HT1621.H"
#include "HX711.h"
#include "math.h"
//校准参数
//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
//该值可以为小数
#define GapValue 21500


unsigned char wei[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7f,0x6F,0x00};
sbit wei_a  = P2^6;
sbit duan_b = P2^7;      //数码管显示


sbit key1 = P3^2;        //按键
sbit cxyg=P5^5;          //定义场效应管
float Weight;            //重量
float Weight_Maopi;      //毛皮
unsigned char q=0;
#define FOSC 11059200    //jingzhen 晶振
#define T1MS (65536-FOSC/12/1000) //12T模式


sbit  INT0=P3^2;
void Get_Maopi();
//-----------------------------------------
//中断服务程序
void exint0() interrupt 0        //INT0中断入口
{
        Get_Maopi();
        cxyg=0;
        write_com(LCDON);             //打开LCD偏压
        //P32 = !P32;                 //将测试口取反
        while(P32==0);
        q=0;         
}
//****************************************************
//MS延时函数(12M晶振下测试)
//****************************************************
void delay_ms(unsigned int n)
{
        unsigned int  i,j;
        for(i=0;i<n;i++)
                for(j=0;j<123;j++);
}


//void delay_ms(unsigned int ms)  //延时函数防抖
//{
//        unsigned char i, j;
//        while(ms--)
//        {
//          i = 2;
//          j = 199;
//          do
//         {
//                 while (--j);
//         } while (--i);
//        
//        }
//}
//****************************************************
//获取毛皮重量
//****************************************************
void Get_Maopi()
{        
        unsigned long Weight_Maopi_0=0,Weight_Maopi_1=0;//毛皮临时变量
        float Weight_Maopi_temp0=0,Weight_Maopi_temp1=0;//计算毛皮临时变量
    mm:Weight_Maopi_0=HX711_Read();                                        //第一次读取毛皮数据
        delay_ms(1000);                                                                        //延时一段时间
        Weight_Maopi_1=HX711_Read();                                        //第二次读取毛皮数据
        Weight_Maopi_temp0=Weight_Maopi_0/GapValue;                //换算第一次读取毛皮重量
        Weight_Maopi_temp1=Weight_Maopi_1/GapValue;                //换算第二次读取毛皮重量
        if(fabs(Weight_Maopi_temp1-Weight_Maopi_temp0)>0.1)//当两次读取毛皮重量绝对值大于0.1以上时重新测量
        goto mm;
        Weight_Maopi=Weight_Maopi_1;                                        //读取成功则返回第一次读取值
}
//****************************************************
//称重
//****************************************************
void Get_Weight()
{               
        unsigned long HX711_Buffer = 0;
        HX711_Buffer=HX711_Read();//读取重量
        if(HX711_Buffer>Weight_Maopi)
        {
                Weight=(float)((HX711_Buffer-Weight_Maopi)/GapValue);
        }


}


void Timer1Init(void)                //50毫秒@11.0592MHz
{
        AUXR &= 0xBF;        //定时器时钟12T模式
        TMOD &= 0x0F;        //设置定时器模式
        TL1 = 0x00;                //设置定时初值
        TH1 = 0x4C;                //设置定时初值
        TF1 = 0;                //清除TF1标志
        TR1 = 1;                //定时器1开始计时
        ET1=1;
}


void main()
{
        cxyg=0;//低电平导通
        port_mode();         //IO口初始化
        init_HT1621();   //初始化液晶屏
        screen_clear();  //清空整屏显示内容
        delay_nms(1000);
        Get_Maopi();
        IT0 = 0;                  
//    IT0 = 1;                  
        Timer1Init();
//         IT1 = 1;
//         EX1 = 1;  
        EX0 = 1;                  
        EA = 1;
        AUXR |= 0x40;           //定时器1为1T模式


        


        LCD_display_float(Weight);//显示浮点数
        while(1)
        {


                        
                        Get_Weight();//称重
                        LCD_display_float(Weight);//显示浮点数
                        if(Weight>0.5)q=0;//如果称重数据大于两克,定时器等于0
                        q++;
                        if(q>100)
                        {
                                        write_com(TONEON); //打开声音
                                                delay_nms(1000);   //延时一下
                                                write_com(TONEOFF);//关闭声音
                                                write_com(LCDOFF); //关闭LCD偏压
                                                cxyg=1;
                                            PCON = 0x02;            //MCU掉电模式
//                                                _nop_();                //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
//                                                _nop_();
                        }                                


        }
}
void tm1_isr() interrupt 3 using 1
{
        unsigned char i;
    TL1 = 0x00;         //初始化计时值
    TH1 =0x4C >> 8;     //1s
        if(i++==100)                // 20*50=1000ms
        {
          i=0;
          q+=1;                    //将测试口取反


        }
}
回复

使用道具 举报

ID:827243 发表于 2020-11-18 18:30 | 显示全部楼层
问题要说清楚,原来功能是什么,你想改成什么.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表