基于51单片机HX711的电子秤称重计价proteus仿真程序设计

硬件设计:

(末尾附文件)

仿真图1:基于HX711,仅有称重功能,无计价功能;
基于51单片机HX711的电子秤称重计价proteus仿真程序设计_第1张图片
仿真图2:基于HX711,具有称重和计价的功能;

基于51单片机HX711的电子秤称重计价proteus仿真程序设计_第2张图片
仿真图3:具有多种水果选择及显示、具有计价功能;
基于51单片机HX711的电子秤称重计价proteus仿真程序设计_第3张图片

设计方案
整个数字电子秤电路由电源电路、单片机主控制电路、LM4229显示电路、蜂鸣器报警电路、44键盘电路和压力传感电路(ADC0832采样)6个部分组成。如图3.1所示。
3.2工作原理
打开电源开关,数字电子秤开始工作。接通电源时,数字电子秤进入欢迎界面“欢迎使用电子秤 设计······”。此时数字电子秤上MCU开始工作,键盘不断进行扫描,同时 通过ADC0832也不断进行外部称量数据采样,LCD上显示“实用电子秤 名称 单价······”。当载物台上放有物体时,ADC0832立即将数据收集送给单片机处理。此时工作人员只要输入对应商品的代码编号,在240
128的LCD上可以看到相应商品的名称,单价,总重,总价格等信息。在称量的过程中,一旦物体自身的重量超出电子秤的称量范围,蜂鸣器立即会发出“滴滴····”警报声告诉工作人员,所称量物品超重。
基于51单片机HX711的电子秤称重计价proteus仿真程序设计_第4张图片

程序设计

#include
#include
#include 
#include 
#include
#define uchar unsigned char
#define uint   unsigned int
sbit ADCS =P3^5; 
sbit ADDI =P3^7;  
sbit ADDO =P3^7;  
sbit ADCLK =P3^6;  
uint x1,y1,z1=0,w1;
uchar ad_data,k,n,m,e,num,s;                              //采样值存储
uint temp1;
sbit beep =P3^0;                                           
char press_data;                                  //标度变换存储单元
float  press;
unsigned char ad_alarm,temp;                           //报警值存储单元
unsigned char abc[5]={48,46,48,48,48};
unsigned char price_all[6]={48,48,46,48,48,48};
float price_unit[10]={5.5,2.8,3.6,4.5,5.8,6.8,7.9,8.0,9.5,0};       //商品初始单价
uchar price_danjia[5]={48,46,48,48,48};
float price;
uint price_temp1,price_temp2;                             //商品总价       
uchar Adc0832(unsigned char channel);															
void alarm(void);
void data_pro(void);
void delay(uint k);
void keyscan();
void disp_init();
void  price_jisuan();
/************
主函数
************/
void main(void)
{ 
   delay(500);                        //系统延时500ms启动
   //ad_data=0;                       //采样值存储单元初始化为0
   lcd_init();                        //显示初始化
   disp_init();        				  //开始进入欢迎界面
   delay(1000);						  //延时进入称量画面
   clear_lcd(0,4,40);
   clear_lcd(16,0,100);
   clear_lcd(28,0,40);
   clear_lcd(44,0,100);
   clear_lcd(56,0,40);
   clear_lcd(72,0,100);
   clear_lcd(84,0,40);
   clear_lcd(100,0,100);
   clear_lcd(112,0,40);
   write_lcd(0,8,"实用电子秤");              
	while(1)
    {
	   ad_data =Adc0832(0);	   //采样值存储单元初始化为0
	   alarm();
	   data_pro(); //读取重量
	   keyscan();  //查询商品种类
	   write_lcd(40,0,"------------------------------");
	   write_lcd(56,0,"单  价:");
	   write_lcd(56,11,price_danjia);
	   write_lcd(56,20,"元/千克");
	   write_lcd(72,0,"总重量:");
	   write_lcd(72,11,abc);
	   write_lcd(72,20,"千克");
	   write_lcd(88,0,"总  价:");
	   price_jisuan();           //计算出价格
	   write_lcd(88,10,price_all);
	   write_lcd(88,20,"元");
	   write_lcd(112,0,"设计学生: 1111111111 XXX");
	}
}
/************
读ADC0832函数
************/

//采集并返回
uchar Adc0832(unsigned char channel)     //AD转换,返回结果
{
     uchar i=0;
    uchar j;
    uint dat=0;
    uchar ndat=0;

    if(channel==0)channel=2;
    if(channel==1)channel=3;
    ADDI=1;
    _nop_();
    _nop_();
    ADCS=0;//拉低CS端
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿1
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    ADDI=channel&0x1;
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿2
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    ADDI=(channel>>1)&0x1;
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿3
    ADDI=1;//控制命令结束 
    _nop_();
    _nop_();
    dat=0;
    for(i=0;i<8;i++)
    {
        dat|=ADDO;//收数据
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;//形成一次时钟脉冲
        _nop_();
        _nop_();
        dat<<=1;
        if(i==7)dat|=ADDO;
    }  
    for(i=0;i<8;i++)
    {
        j=0;
        j=j|ADDO;//收数据
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;//形成一次时钟脉冲
        _nop_();
        _nop_();
        j=j<<7;
        ndat=ndat|j;
        if(i<7)ndat>>=1;
    }
    ADCS=1;//拉搞CS端
    ADCLK=0;//拉低CLK端
    ADDO=1;//拉高数据端,回到初始状态
    dat<<=8;
    dat|=ndat;
    return(dat);            //return ad k         
}


.

文件仅供参考
链接:https://pan.baidu.com/s/1ufphYmVmsgNRpqfxq9FL5w
提取码:9ols

.

你可能感兴趣的:(资料分享,51单片机,proteus,嵌入式硬件)