微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 电子秤称重超过1KG就显示错误是什么原因?

电子秤称重超过1KG就显示错误是什么原因?

时间:10-02 整理:3721RD 点击:
电子秤称重超过1KG就显示错误是什么原因,
#include <reg52.h>                 //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535
#define ulong unsigned long
#include "ds1302.h"
#include<intrins.h>
uchar code table_num[]="0123456789abcdefg";
sbit rs=P1^0;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit rw=P1^1;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit e =P1^2;         //片选信号   下降沿触发
sbit hx711_dout=P2^1;
sbit hx711_sck=P2^0;
sbit beep = P1^6;     //蜂鸣器
uchar menu_1,menu_2;
long weight;
uint temp,qi_weight;
bit chaozhong_flag;
bit leiji_flag;
bit flag_200ms ;
ulong price,z_price;   //单价 总价
uchar flag_p;
/***************
删除键
去皮
价格清零
***************/
/******1ms延时函数***12M晶振**************/
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<120;j++);
}
/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{
        while(q--);
}
/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{
        e=0;
        rs=0;
        rw=0;
        P0=com;
        delay_uint(3);
        e=1;
        delay_uint(25);
        e=0;
}
/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{
        e=0;
        rs=1;
        rw=0;
        P0=dat;
        delay_uint(3);
        e=1;
        delay_uint(25);
        e=0;        
}

/***********************lcd1602上显示这字符函数************************/
void write_string(uchar hang,uchar add,uchar *p)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        while(1)                                                                                                                 
        {
                if(*p == '\0')  break;
                write_data(*p);
                p++;
        }        
}
/***********************lcd1602初始化设置************************/
void init_1602()         //lcd1602初始化设置
{
        write_com(0x38);        //
        write_com(0x0c);
        write_com(0x06);
        delay_uint(1000);
}
////////////////在指定位置显示指定字符//////////
void write_zifu(uchar hang,uchar add,uchar dat)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(dat);
}
/********************************************************************
* 名称 : write_sfm4_price(uchar hang,uchar add,uchar date)
* 功能 : 显示价格
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void write_sfm4_price(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
                write_data(0x30+date/1000%10);
                write_data(0x30+date/100%10);
                write_data('.');
                write_data(0x30+date/10%10);
                write_data(0x30+date%10);
}
void write_sfm4_price1(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);
                write_com(0x80+0x40+add);
                write_data(0x30+date/1000%10);
                write_data(0x30+date/100%10);
                write_data('.');
                write_data(0x30+date/10%10);
                write_data(0x30+date%10);
}
/****************开机液晶显示函数 初始化液晶的内容********************************/
void init_1602_dis_csf()  //初始化液晶
{                                                                    
        write_string(1,0,"   W:0.000kg    ");
        write_string(2,0,"P:00.00  Z:00.00");
        write_zifu(2,7,0x5c);        //¥               
//        write_zifu(2,15,0x5c);        //¥               
}
void init_1602_dis_sj()  //初始化液晶
{                                                                    
        write_string(1,0,"    :  :    W:    ");               
        write_string(2,0," 20  -  -         ");        
}
/***********************lcd1602上显示两位十进制数************************/
void write_sfm1(uchar hang,uchar add,uchar date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(0x30+date % 10);        
}
/***********************lcd1602上显示两位十进制数************************/
void write_sfm2_ds1302(uchar hang,uchar add,uchar date)
{
        uchar shi,ge;
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        shi=date/16;
        ge=date%16;                  
        write_data(table_num[shi]);
        write_data(table_num[ge]);        
}
/*****************控制光标函数********************/
void write_guanbiao(uchar hang,uchar add,uchar date)
{               
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        if(date == 1)
                write_com(0x0f);     //显示光标并且闪烁        
        else
                write_com(0x0c);   //关闭光标
}         

/*******************压力显示程序***********************/
void write_1602_yl(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(0x30+date/10000%10);
        write_data('.');
        write_data(0x30+date/100%10);
        write_data(0x30+date/10%10);
        write_data(0x30+date%10);        
        
}

void Delay__hx711_us(void)
{
        _nop_();
        _nop_();
}
ulong ReadCount(void)        //增益128
{
        ulong count,value = 0;
        uchar i;
          hx711_dout=1;
Delay__hx711_us();
          hx711_sck=0;
          count=0;
          while(hx711_dout)          ;
          for(i=0;i<24;i++)
        {
                  hx711_sck=1;
                  count=count<<1;
                hx711_sck=0;
                  if(hx711_dout)
                        count++;
        }
         hx711_sck=1;
        Delay__hx711_us();
        hx711_sck=0;  
        return(count);
}
void get_pizhong()          //获取皮重,秤盘重量
{
        ulong hx711_dat;
        hx711_dat=ReadCount();                //HX711AD转换数据处理
        temp=(uint)(hx711_dat/100);        
}
void get_weight()          //获取被测物体重量
{
        ulong hx711_data,a;
        uint get,aa;        
        hx711_data=ReadCount();                   //HX711AD转换数据处理
        get=(uint)(hx711_data/100);
        if(get>temp)
        {
                a=ReadCount();
                aa=(uint)(a/100)-temp;
                weight=(uint)((float)aa/4.523+0.05);//重量转换函数,传感器型号不同此函数要适当修改
        }
}
/************************************************/
/*  由于称重传感器线性度参数的不同,而对获得的重量数据处理,
此处可能会根据不同称重传感器,程序的代码会有所不同      */        
/************************************************/

/*************定时器0初始化程序***************/
void time_init()         
{
        EA   = 1;                   //开总中断
        TMOD = 0X01;          //定时器0、定时器1工作方式1
        ET0  = 1;                  //开定时器0中断
        TR0  = 1;                  //允许定时器0定时
}
/********************独立按键程序*****************/
uchar key_can;         //按键值
void key()         //独立按键程序
{
        static uchar key_new = 0;
        key_can = 20;                   //按键值还原
        P3 = 0x0f;
        if((P3 & 0x0f) != 0x0f)                //按键按下
        {
                delay_1ms(1);                     //按键消抖动
                if(((P3 & 0x0f) != 0x0f) && (key_new == 1))
                {                                                //确认是按键按下
                        key_new = 0;
                        P3 = (P3 | 0xf0);   //矩阵键盘扫描
                        switch(P3)
                        {
                                case 0xee:  key_can = 1;  break;  //得到按键值
                                case 0xde:  key_can = 4;  break;   //得到按键值
                                case 0xbe:  key_can = 7;  break;   //得到按键值
                                case 0x7e:  key_can = 10;  break;   //得到按键值
        
                                case 0xed:  key_can = 0;  break;  //得到按键值
                                case 0xdd:  key_can = 8;  break;   //得到按键值
                                case 0xbd:  key_can = 5;  break;   //得到按键值
                                case 0x7d:  key_can = 2;  break;   //得到按键值
        
                                case 0xeb:  key_can = 3;  break;  //得到按键值
                                case 0xdb:  key_can = 6;  break;   //得到按键值
                                case 0xbb:  key_can = 9;  break;   //得到按键值
                                case 0x7b:  key_can = 11;  break;   //得到按键值
        
                                case 0xe7:  key_can = 15;  break;  //得到按键值
                                case 0xd7:  key_can = 14;  break;  //得到按键值
                                case 0xb7:  key_can = 13;  break;   //得到按键值
                                case 0x77:  key_can = 12;  break;  //得到按键值         
                        }        
                        beep = 0;  //蜂鸣器叫一声
                        delay_1ms(100);
                        beep = 1;  ;
                }                        
        }
        else
                key_new = 1;        
}
/************按键控制函数*************/
void key_with()
{
        if(key_can <= 9)   //数字键
        {
                if(flag_p >= 4)
                {
                        flag_p = 0;
                }
                if(flag_p == 0)
                        price = key_can;
                else
                {
                        price = price * 10 + key_can;            
                }           
                write_sfm4_price(2,2,price);        //显示单价               
                flag_p ++;
//                write_sfm2(1,0,flag_p);
        }
        if(key_can == 15)   //删除键
        {   
                if(price != 0 )
                {
                        flag_p --;
                        price /= 10;                 //删除
                        write_sfm4_price(2,2,price);//显示单价                                
                }
        }
        if(key_can == 14)   //去皮
        {
                get_pizhong();          //获取皮重,秤盘重量
                        write_1602_yl(1,5,0);              //显示压力
        }
        if(key_can == 13)   //价格清零
        {
                flag_p = 0;
                price = 0;
                write_sfm4_price(2,2,price);//显示单价                                
        }
}
/**********************设置函数************************/
void key_with_sj()
{
        if(key_can == 12)   // 切换键
        {
                menu_1++;
                menu_2 = 0;
                if(menu_1 == 1)
                {
                        init_1602_dis_sj();
                }
                if(menu_1 >= 2)
                {
                        menu_1 = 0;        
                    init_1602();
                          init_1602_dis_csf();  //初始化液晶
                }
        }
        if(menu_1 == 1)
        {
                if(key_can == 15)        //选择键
                {
                        if(menu_1 == 1)                  //设置时间
                        {
                                menu_2 ++;
                                if(menu_2 > 7)
                                {
                                        menu_2 = 0;
                                        write_guanbiao(1,2,0);          //关闭光标
                                }
                        }
                }
               
                if(menu_1 == 1)
                {
                        if(menu_2 == 1)                  //设置时
                        {
                                if(key_can == 14)        //加
                                {
                                        shi+=0x01;
                                        if((shi & 0x0f) >= 0x0a)
                                                shi = (shi & 0xf0) + 0x10;
                                        if(shi >= 0x24)
                                                shi = 0;
                                }               
                                if(key_can == 13)        //减
                                {
                                        if(shi == 0x00)
                                                shi = 0x24;
                                        if((shi & 0x0f) == 0x00)
                                                shi = (shi | 0x0a) - 0x10;
                                        shi -- ;
                                }                                          
                        }
                        if(menu_2 == 2)                  //设置分
                        {
                                if(key_can == 14)        //加
                                {
                                        fen+=0x01;
                                        if((fen & 0x0f) >= 0x0a)
                                                fen = (fen & 0xf0) + 0x10;
                                        if(fen >= 0x60)
                                                fen = 0;
                                }               
                                if(key_can == 13)        //减         
                                {
                                        if(fen == 0x00)
                                                fen = 0x5a;
                                        if((fen & 0x0f) == 0x00)
                                                fen = (fen | 0x0a) - 0x10;
                                        fen -- ;
                                }        
                        }
                        if(menu_2 == 3)                  //设置秒
                        {
                                if(key_can == 14)        //加
                                {
                                        miao+=0x01;
                                        if((miao & 0x0f) >= 0x0a)
                                                miao = (miao & 0xf0) + 0x10;
                                        if(miao >= 0x60)
                                                miao = 0;
                                }        
                                if(key_can == 13)        //减         
                                {
                                        if(miao == 0x00)
                                                miao = 0x5a;
                                        if((miao & 0x0f) == 0x00)
                                                miao = (miao | 0x0a) - 0x10;
                                        miao -- ;                        
                                }
                        }
                        if(menu_2 == 4)                  //设置星期
                        {
                                if(key_can == 14)        //加
                                {
                                    week+=0x01;
                                        if((week & 0x0f) >= 0x0a)
                                                week = (week & 0xf0) + 0x10;
                                        if(week >= 0x08)
                                                week = 1;
                                }               
                                if(key_can == 13)        //减         
                                {
                                        if(week == 0x01)
                                                week = 0x08;
                                        if((week & 0x0f) == 0x00)
                                                week = (week | 0x0a) - 0x10;
                                        week -- ;
                                }        
                        }
                        if(menu_2 == 5)                  //设置年
                        {
                                if(key_can == 14)        //加
                                {
                                    nian+=0x01;
                                        if((nian & 0x0f) >= 0x0a)
                                                nian = (nian & 0xf0) + 0x10;
                                        if(nian >= 0x9a)
                                                nian = 1;
                                }               
                                if(key_can == 13)        //减         
                                {
                                        if(nian == 0x01)
                                                nian = 0x9a;
                                        if((nian & 0x0f) == 0x00)
                                                nian = (nian | 0x0a) - 0x10;
                                        nian -- ;               
                                }        
                        }
                        if(menu_2 == 6)                  //设置月
                        {
                                if(key_can == 14)        //加
                                {
                                    yue+=0x01;
                                        if((yue & 0x0f) >= 0x0a)
                                                yue = (yue & 0xf0) + 0x10;
                                        if(yue >= 0x12)
                                                yue = 1;
                                }               
                                if(key_can == 13)        //减         
                                {
                                        if(yue == 0x01)
                                                yue = 0x13;
                                        if((yue & 0x0f) == 0x00)
                                                yue = (yue | 0x0a) - 0x10;
                                        yue -- ;                                       
                                }        
                        }
                        if(menu_2 == 7)                  //设置日
                        {
                                if(key_can == 14)        //加
                                {
                            ri+=0x01;
                                if((ri & 0x0f) >= 0x0a)
                                        ri = (ri & 0xf0) + 0x10;
                                if(ri >= 0x32)
                                        ri = 0;                        
                                }               
                                if(key_can == 13)        //减         
                                {
                                        if(ri == 0x01)
                                                ri = 0x32;
                                        if((ri & 0x0f) == 0x00)
                                                ri = (ri | 0x0a) - 0x10;
                                        ri -- ;                        
                                }        
                        }
                        write_sfm2_ds1302(1,2,shi);           //显示时
                        write_sfm2_ds1302(1,5,fen);           //显示分
                        write_sfm2_ds1302(1,8,miao);           //显示秒
                        write_sfm1(1,14,week);           //显示星期                                       
                        write_sfm2_ds1302(2,3,nian);           //显示年
                        write_sfm2_ds1302(2,6,yue);           //显示月
                        write_sfm2_ds1302(2,9,ri);           //显示日
                        switch(menu_2)           // 光标显示
                        {
                                case 1:  write_guanbiao(1,2,1);  break;
                                case 2:  write_guanbiao(1,5,1);  break;
                                case 3:  write_guanbiao(1,8,1);  break;
                                case 4:  write_guanbiao(1,14,1); break;
                                case 5:  write_guanbiao(2,3,1);  break;
                                case 6:  write_guanbiao(2,6,1);  break;
                                case 7:  write_guanbiao(2,9,1);  break;
                        }
                        write_time();           //把时间写进去
                }
        }        
}
/*************定时器0初始化程序***************/
void init_1602_ds1302()
{
        write_sfm2_ds1302(2,3,nian);        
        write_sfm2_ds1302(2,6,yue);        
        write_sfm2_ds1302(2,9,ri);        
        write_sfm2_ds1302(1,2,shi);        
        write_sfm2_ds1302(1,5,fen);        
        write_sfm2_ds1302(1,8,miao);
        write_sfm1(1,14,week);               
}

/*****************主函数********************/
void main()
{        
        beep = 0;  //蜂鸣器叫一声
        delay_1ms(100);
        P0 = P1 = P2 = P3 = 0xff;                //单片机IO口初始化为1
        time_init();                    //初始化定时器
        init_1602();                 //lcd1602初始化
        init_1602_dis_csf(); //lcd1602初始化显示
        while(1)
        {
                key();         //独立按键程序
                if(key_can < 20)
                {        
                        if(menu_1 == 0)
                                key_with();  
                        key_with_sj();  
                }
                if(flag_200ms == 1)
                {
                        flag_200ms = 0;
                        if(weight >= 5000)  //超重报警
                                beep = ~beep;
                        else
                                beep = 1;
                        if((menu_1 == 1) && (menu_2 == 0))
                        {                 
                                read_time();                  //读时间
                                init_1602_ds1302();   //显示时钟           
                        }
                        if(menu_1 == 0)
                        {
                                get_weight();          //获取被测物体重量
           &n

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top