基于单片机商用电子计价秤电子秤系统Proteus仿真(含全部资料)

发布于:2025-09-03 ⋅ 阅读:(21) ⋅ 点赞:(0)

 全套资料包含: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;                       //采样值存储单元初始化为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,"设计学生: 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;          //则启动报警
        
	  else
	       beep=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;			//取单价千分位
}

六、全套资料包含

​​

七:项目资源获取

需要完整的资料可以点击下面的名片关注,回复“资料”!

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓


网站公告

今日签到

点亮在社区的每一天
去签到