基于单片机商用电子计价秤电子秤系统Proteus仿真(含全部资料)
全套资料包含:Proteus仿真源文件+keil C语言源程序+AD原理图+流程图+元器件清单+说明书等
资料下载:
通过网盘分享的文件:资料分享
链接: 百度网盘 请输入提取码 提取码: tgnu
目录
资料下载:
Proteus仿真功能
项目文件资料:
一、Proteus仿真源文件
二、AD原理图文件
二、报告说明书
三、系统流程图
四、Keil c语言程序源代码
项目功能:
基于51单片机的商用电子计价秤设计
具体功能:
(1)通电源时,数字电子秤进入欢迎界面“欢迎使用电子秤 设计••••••”;
(2)当载物台上放有物体时,ADC0832立即将数据转换发送给单片机处理,并由LCD液晶显示屏显示;
(3)当用按键输入对应商品的代码编号,在LCD上可以看到相应商品的名称,单价,总重,总价格等信息。
(4)在称量的过程中,一旦物体自身的重量超出电子秤的称量范围,蜂鸣器立即会发出“滴滴••••”警报声告诉工作人员,所称量物品超重(测量范围0—9.99KG)。
项目文件:
一、Proteus仿真源文件
二、AD原理图文件
二、报告说明书
三、系统流程图
四、器件清单
Description | Designator | Footprint | LibRef |
Capacitor | C1, C2 | RAD-0.3 | Cap |
Polarized Capacitor (Surface Mount) | C3 | CC2012-0805 | Cap Pol3 |
蜂鸣器 | LS1 | BELL | |
Header, 20-Pin | P1 | HDR1X20 | Header 20 |
Header, 3-Pin | P2 | HDR1X3 | Header 3 |
NPN General Purpose Amplifier | Q1 | BCY-W3/E4 | 2N3904 |
Isolated Resistor Network | R1 | SO-G16/Z8.5 | Res Pack3 |
Resistor | R2, R3 | AXIAL-0.4 | Res2 |
Switch | S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13, S14, S15, S16, S17 | SPST-2 | SW-PB |
U1 | 87C51 | ||
A/D Peripheral with Serial Control | U2 | P008 | ADC0832AP |
Crystal Oscillator | Y1 | BCY-W2/D3.1 | XTAL |
五、Keil c语言程序源代码(部分)
#include<reg51.h>
#include<intrins.h>
#include <absacc.h>
#include <math.h>
#include<lm4229.h>
#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; //采样值存储单元初始化为0lcd_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); //采样值存储单元初始化为0alarm();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,"设计学生: 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_();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_();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
}void data_pro(void)
{unsigned int; if(0<ad_data<256) { int vary=ad_data; press=(0.019531*vary); temp1=(int)(press*1000); //放大1000倍,便于后面的计算abc[0]=temp1/1000+48; //取压力值百位abc[1]=46;abc[2]=(temp1%1000)/100+48; //取压力值十位abc[3]=((temp1%1000)%100)/10+48; //取压力值个位abc[4]=((temp1%1000)%100)%10+48; //取压力值十分位} }
/*****************报警子函数*******************/void alarm(void)
{if(ad_data>=256) beep=0; //则启动报警elsebeep=1;
}void delay(uint k)
{uint i,j;for(i=0;i<k;i++)for(j=0;j<100;j++);
}
//开机欢迎界面
void disp_init()
{write_lcd(0,8,"欢迎使用电子秤");write_lcd(16,0,"------------------------------");write_lcd(28,0,"设计学生:XXX");write_lcd(44,0,"------------------------------");write_lcd(56,0,"班级学号:xxx");write_lcd(72,0,"------------------------------");write_lcd(84,0,"指导老师: xxx");write_lcd(100,0,"------------------------------");write_lcd(112,0,"设计日期: 2020年04月11日");}//键盘服务程序
void keyscan()
{P1=0xfe;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){ case 0xee:num=1,price=price_unit[0], write_lcd(24,0,"名 称: 杏 仁");break;case 0xde:num=2,price=price_unit[1],write_lcd(24,0,"名 称: 李 子");break;case 0xbe:num=3,price=price_unit[2],write_lcd(24,0,"名 称: 草 莓");break;case 0x7e:num=4,price=price_unit[3],write_lcd(24,0,"名 称: 葡 萄");break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xed:num=5,price=price_unit[4],write_lcd(24,0,"名 称: 西 瓜");break;case 0xdd:num=6,price=price_unit[5],write_lcd(24,0,"名 称: 苹 果");break;case 0xbd:num=7,price=price_unit[6],write_lcd(24,0,"名 称: 雪 梨");break;case 0x7d:num=8,price=price_unit[7],write_lcd(24,0,"名 称: 核 桃");break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xeb:num=9,price=price_unit[8],write_lcd(24,0,"名 称: 香 蕉");break;case 0xdb:num=10,price=price_unit[9],write_lcd(24,0,"名 称: 商品代码");break;case 0xbb:num=11,price=price_unit[1];break;case 0x7b:num=12,price=price_unit[2];break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xe7:num=13,price=price_unit[3];break;case 0xd7:num=14,price=price_unit[4];break;case 0xb7:num=15,price=price_unit[5];break;case 0x77:num=16,price=price_unit[6];break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}price_temp1=(int)(price*1000);price_danjia[0]=price_temp1/1000+48; //取单价个位price_danjia[1]=46;price_danjia[2]=(price_temp1%1000)/100+48; //取单价十分位price_danjia[3]=((price_temp1%1000)%100)/10+48; //取单价百分位price_danjia[4]=((price_temp1%1000)%100)%10+48; //取单价千分位
}
六、全套资料包含
七:项目资源获取
需要完整的资料可以点击下面的名片关注,回复“资料”!
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓