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

一、设计背景

          随着微电子技术的应用,市场上使用的传统称重工具已经满足不了人们的要求。为了改变传统称重工具在使用上存在的问题,在本设计中将智能化、自动化、人性化用在了电子秤重的控制系统中。本系统主要由单片机来控制,测量物体重量部分使用称重传感器,加上显示单元,此电子秤俱备了功能多、性能价格比高、功耗低、系统设计简单、使用方便直观、速度快、测量准确、自动化程度高等特点。
       本系统以AT89C51单片机为主控芯片,外围附以称重电路、显示电路、键盘电路、时钟电路、复位电路等构成智能称重系统电路板,从而实现自动称重系统的各种控制功能。可以说,此设计所完成的电子秤很大程度上满足了应用需求。其中软件系统采用C语言编写程序,包括显示程序,定时中断服务,外部中断服务程序,延时程序等,并在KEIL5中调试运行,硬件系统利用PROTEUS强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。

二、实现功能

        以51单片机为控制核心,设计一种称重电子称。整个系统包括MCU、晶振电路、时钟电路、功能按键以及LCD显示。该系统称重传感器部分是模拟传感器的工作原理而画的,利用外部中断统计称重传感器传来的脉冲数,经过单片机后,LCD1602上显示重量(两位整数,三位小数),由矩阵键盘输入价格(三位整数,两位小数),同时在LCD1602上显示,在计算出总价。可具体实现以下功能:

       (1) 测量量程:0-12kg;

       (2) 测量精度:1g;

       (3) 显示:LCD1602;键盘:4*4矩阵键盘;

       (4) LCD1602上显示重量,键盘输入价格,同时LCD1602价格,总价。

     (5)按下修改键后,进入单价修改界面,默认单价为1.5元/kg。

三、仿真演示

初始化界面,模拟称重传感器脉冲频率1KHz,默认单价1.5元/kg,测得重量1.062kg,计算的总价为1.59元。

按下修改按键,进入单价修改界面,输入单价,完成后按下确定按键返回测量界面。

改变模拟称重传感器脉冲频率至12KHz,测得重量12.740kg,计算的总价为127.48元。

四、源程序

#include "reg52.h"//单片机头文件
#include "1602.h" //调用1602.h  用于控制1602液晶
#include "datatype.h" 

uint64 fre,count,time;
uint8 flag=0;
uint8 flag1=0,flag2=0,flag3=0,flag4=0;
uint8 temp;
uint8 k; //按键值读取
fp32 Unitprice=1.5;//单价
fp32 Weight=0;//重量f
fp32 Currency;
uint64 Money;
uint8 buf[6]="--.---";

uint8 KeyScans(void);//按键检测
void DisplayScreen(void);//压力转换  计算金额  显示金额和单价
void ModifyPrice(void);//修改单价
void Timer0Init(void); //定时器0初始化
void ExitInit(void);  //外部中断0初始化

void main()  //主函数
{ 
	Timer0Init();
	ExitInit();
  lcd_init();//1602液晶初始化
  while(1)//主循环
  {	 
    if(flag==1)
	  {
			flag=0;  
			write_str(0x80,"Weight=");//显示重量
			write_com(0x87);
			write_dat(table[fre%100000/10000]);
			write_dat(table[fre%10000/1000]); 
			write_dat('.');
			write_dat(table[fre%1000/100]);
			write_dat(table[fre%100/10]);
			write_dat(table[fre%10]);
			write_str(0x8e,"Kg");
	  }
	  DisplayScreen();//压力转换
		k=KeyScans();
		if(k==12)
		{
			k=16;
			write_com(0x01);
			ModifyPrice();//修改单价
			write_com(0x01);
		}
  }
}

void t0() interrupt 1
{
	TH0=0x30; 
	TL0=0xb0;
	time++;
	if(time==20)                //定时1s时间到
	{   
		EX0=0;//关中断、停止计数
		time=0;                 //计时清0
		fre=count;      //计算脉冲总数    	 
		flag=1;     
		count=0;                //清零计数器1计数  
		EX0=1;
	}
}

/*------------------------------------------------
                 外部中断程序
------------------------------------------------*/
void ISR_Key(void) interrupt 0 using 1
{
	count++;  
}	

uint8 KeyScans(void)
{ 
	uint8 num=16;	 
  P1=0xfe;
  if(flag1==0)
  {
		flag1=1;
    temp=P1;
    if(temp!=0xfe)
    {
	   	delay(5);
		  if(temp!=0xfe)
		  { 
		    temp=temp&0xf0;
		    switch(temp)
		    {  
		        case 0x70:num=0;break;
            case 0xb0:num=1;break;
            case 0xd0:num=2;break;
            case 0xe0:num=3;break;
		    }
		  }
	  }
  }//if flag1
	if(P1==0xfe)flag1=0;  
  P1=0xfd;
  if(flag2==0)
  { 	
		flag2=1;
    temp=P1;
    if(temp!=0xfd)
    {
	   	delay(5);
		  if(temp!=0xfd)
		  { 
		    temp=temp&0xf0;
		    switch(temp)
		    {
					case 0x70:num=4;break;
					case 0xb0:num=5;break;
					case 0xd0:num=6;break;
					case 0xe0:num=7;break;
		    }
		   }
	   }
   }//if flag1
   if(P1==0xfd)flag2=0;	 
   P1=0xfb;
   if(flag3==0)
   {   	
		 flag3=1;
     temp=P1;
     if(temp!=0xfb)
     {
	   	 delay(5);
		   if(temp!=0xfb)
		   { 
		     temp=temp&0xf0;
		     switch(temp)
		     {
						case 0x70:num=8;break;
						case 0xb0:num=9;break;
						case 0xd0:num=10;break;
						case 0xe0:num=11;break;
		     }
		    }
	    }
   }//if flag1
   if(P1==0xfb)flag3=0;
   P1=0xf7;
   if(flag4==0)
   { 
		 flag4=1;
     temp=P1;
     if(temp!=0xf7)
     {
	   	 delay(5);
		   if(temp!=0xf7)
		   { 
		     temp=temp&0xf0;
		     switch(temp)
		     {
						case 0x70:num=12;break;
						case 0xb0:num=13;break;
						case 0xd0:num=14;break;
						case 0xe0:num=15;break;
		     }
		   }
	    }
   }//if flag1
   if(P1==0xf7)flag4=0;	
   return num;
}	
void DisplayScreen(void)//压力转换  计算金额  显示金额和单价
{
   Weight=fre/1000.0;
   Currency=Unitprice*Weight;
   Money=(uint64)(Currency*100);
   write_com(0x80+0x40);	  //显示单价
   write_dat(buf[0]);   
   write_dat(buf[1]); 
   write_dat('.');
   write_dat(buf[3]);
   write_dat(buf[4]);
   write_dat(buf[5]);
   write_com(0x89+0x40);		//显示金额
   write_dat(table[Money/100000]);
   write_dat(table[Money%100000/10000]);	
   write_dat(table[Money%10000/1000]); 
   write_dat(table[Money%1000/100]);
   write_dat('.');
   write_dat(table[Money%100/10]);
   write_dat(table[Money%10]);
}

void ModifyPrice(void)//修改单价
{
  uint8 ent=0;
  write_str(0x80,"Unitprice=--.---");
  while(1)
  {
    write_str(0x8a,buf);   //显示单价
	  k=KeyScans();	
	  if((k==0)||(k==1)||(k==2)||(k==3)||(k==4)||(k==5)||(k==6)||(k==7)||(k==8)||(k==9))	  //数字按键
	  { 
	    ent++;
			switch(ent)
			{
				case 0:break;
				case 1: buf[0]=k+0x30;break;
				case 2: buf[1]=k+0x30;break;
				case 3: buf[3]=k+0x30;break;
				case 4: buf[4]=k+0x30;break;
				case 5: buf[5]=k+0x30;break;
				case 6: buf[0]='-',buf[1]='-',buf[3]='-',buf[4]='-',buf[5]='-',ent=0;break;
			} 
	    k=16;
	   }  
    if(k==14)//返回
    {
			k=16;
			break;
    }//确认
    if(k==15)//确定
    {
			k=16;
			Unitprice=(buf[0]-0x30)*10+(buf[1]-0x30)+(buf[3]-0x30)/10.0+ (buf[4]-0x30)/100.0+(buf[5]-0x30)/1000.0;
			break;
    }//确认
  }
}

void Timer0Init(void)
{
	TMOD=0x01;
  TH0=0x30; 
  TL0=0xb0;
  ET0=1;
  TR0=1;
  EA=1;
}

void ExitInit(void)
{
  EX0=1;         //外部中断0开
  IT0=1;         //边沿触发 
}

仿真源文件及完整程序百度网盘链接:https://pan.baidu.com/s/1RpnFS1wal21L6_nmMdAy-g 
提取码:1bc9 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薄情书生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值