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