一、设计背景
随着微电子技术的应用,市场上使用的传统称重工具已经满足不了人们的要求。为了改变传统称重工具在使用上存在的问题,在本设计中将智能化、自动化、人性化用在了电子秤重的控制系统中。本系统主要由单片机来控制,测量物体重量部分使用称重传感器,加上显示单元,此电子秤俱备了功能多、性能价格比高、功耗低、系统设计简单、使用方便直观、速度快、测量准确、自动化程度高等特点。
本系统以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; //计时清0fre=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 flag1if(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 flag1if(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 flag1if(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 flag1if(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