赞
踩
本设计采用模块化设计法,以51单片机为核心设计一款高精度电子秤,当被称物体放置在秤台上时,称重传感器产生力-电效应,将物体的重量转换成与被称物体重量成一定函数关系的电信号。该电信号先通过前端信号处理电路,然后经过A/D转换电路转换成数字信号送入到主控电路的单片机中,单片机通过扫描键盘和各种功能开关,根据键盘输入内容和各种功能开关的状态进行判断、分析和控制,来完成各种运算和显示功能。
其硬件结构主要包括:数据采集模块、最小系统模块、超重报警模块、键盘和显示模块。其中,数据采集模块包括称重传感器和A/D转换电路;最小系统部分主要包括AT89S51、晶振电路和复位电路;键盘由4X4位矩阵键盘组成,可以控制显示重量和价钱等信息;显示部分由LCD1602液晶显示。软件部分由C语言编程,实现对各部分的控制。该电子秤可以实现称重、置零、计价和显示等功能。其称重范围为0~10Kg,分度值为0.001g。整个系统结构简单,使用方便。
利用压力传感器采集因压力变化产生的电压信号,经过电压放大电路放大,然后再经过模数转换器转换为数字信号,最后把数字信号送入单片机。单片机经过相应的处理后,得出当前所称物品的重量及总额,然后再显示出来。
按照本设计功能的要求,系统由5个部分组成:控制器部分、测量部分、数据显示部分、键盘部分、和电路电源部分
基于51单片机的电子秤设计
功能:
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/1Ctpfq03UD7_Onp7yCZFaCg?pwd=8888
部分代码展示
- //定义标识
- volatile bit FlagTest = 0; //定时测试标志,每0.5秒置位,测完清0
- volatile bit FlagKeyPress = 0; //有键按下标志,处理完毕清0
- //校准参数
- //因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
- //当发现测试出来的重量偏大时,增加该数值。
- //如果测试出来的重量偏小时,减小改数值。
- //该值可以为小数
- //#define GapValue 349
- sbit LED=P1^1;
- sbit ROW1=P3^0;
- sbit ROW2=P3^1;
- sbit ROW3=P3^2;
- sbit ROW4=P3^3;
-
- volatile bit ClearWeighFlag = 0; //传感器调零标志位,清除0漂
-
- /******************把数据保存到单片机内部eeprom中******************/
- void write_eeprom()
- {
- SectorErase(0x2000);
- GapValue1=GapValue&0x00ff;
- byte_write(0x2000, GapValue1);
- GapValue1=(GapValue&0xff00)>>8;
- byte_write(0x2001, GapValue1);
- byte_write(0x2060, a_a);
- }
-
- /******************把数据从单片机内部eeprom中读出来*****************/
- void read_eeprom()
- {
- GapValue = byte_read(0x2001);
- GapValue = (GapValue<<8)|byte_read(0x2000);
- a_a = byte_read(0x2060);
- }
-
- /**************开机自检eeprom初始化*****************/
- void init_eeprom()
- {
- read_eeprom(); //先读
- if(a_a != 1) //新的单片机初始单片机内问eeprom
- {
- GapValue = 3500;
- a_a = 1;
- write_eeprom(); //保存数据
- }
- }
-
- //显示重量,单位kg,两位整数,三位小数
- void Display_Weight()
- {
- LCD1602_write_com(0x80+0x40+8);
- if(Weight_Shiwu/10000==0)
- LCD1602_write_data(' ');
- else
- LCD1602_write_data(Weight_Shiwu/10000 + 0x30);
- LCD1602_write_data(Weight_Shiwu%10000/1000 + 0x30);
- LCD1602_write_data('.');
- LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);
- LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);
- LCD1602_write_data(Weight_Shiwu%10 + 0x30);
- }
-
- //定时器0初始化
- void Timer0_Init()
- {
- ET0 = 1; //允许定时器0中断
- TMOD = 1; //定时器工作方式选择
- TL0 = 0xb0;
- TH0 = 0x3c; //定时器赋予初值
- TR0 = 1; //启动定时器
- }
-
- //定时器0中断
- void Timer0_ISR (void) interrupt 1 using 0
- {
- uchar Counter;
- TL0 = 0xb0;
- TH0 = 0x3c; //定时器赋予初值
-
- //每0.5秒钟刷新重量
- Counter ++;
- if (Counter >= 10)
- {
- FlagTest = 1;
- Counter = 0;
- }
- }
-
-
- //按键响应程序,参数是键值
- //返回键值:
- // 7 8 9 10(清0)
- // 4 5 6 11(删除)
- // 1 2 3 12(未定义)
- // 14(未定义) 0 15(.) 13(确定价格)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。