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

news2025/1/11 21:06:37

一、设计背景

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/999200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

雅思口语同替高分表达

目录 雅思口语题目准备 Riding a bike 1. Did you have a bike when you were young? 2. Did you ride a bike when you were little? 3. Did you ride a bike to school? 4. Do you ride a bike when you go out no? 雅思口语经验 口语高分同替词汇 中式英语问题…

计算机竞赛 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model5 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖&am…

系列五、Nginx配置实例之反向代理1

一、目标 Linux服务器部署Tomcat的运行环境,然后通过Windows的www.123.com访问,能够访问到Tomcat的主页(有猫的页面) 二、步骤 2.1、下载apache-tomcat-8.5.63.tar.gz安装包 # 我分享的 链接:https://pan.baidu.com…

【数据结构与算法系列4】长度最小的子数组 (C++ Python)

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度**。**如果不存在符合条件的子数组,返回 0 。 示例 1: 输入&…

virtualbox虚拟机中安装FreeDOS系统和DJGPP编译环境

一、安装FreeDOS系统 1、从官网下载FreeDOS系统镜像,下载的压缩包中包含两个文件:后缀为.iso和.img的镜像 ​​​下载页面 http://www.freedos.org/download/ 直接下载链接 https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.…

TAITherm专业热管理工具

TAITherm是ThermoAnalytics公司开发的专业三维热仿真分析工具,广泛应用于国内外汽车、工业自动化、轨道交通、重型机械等行业的热仿真设计中。同系列的CoTherm耦合优化平台可支持热流耦合、一三维耦合、FMU集成、设计优化、敏感性分析等应用。 产品模块介绍 TAITh…

LeetCode518. 零钱兑换 II 以及 动态规划相关的排列组合问题

文章目录 一、题目二、题解方法一:完全背包问题的变体(版本1)方法二:完全背包问题变体(版本2) 三、拓展:先遍历物品后遍历背包vs先遍历背包后遍历物品先遍历物品后遍历背包(组合问题…

1905. 统计子岛屿

给你两个 m x n 的二进制矩阵 grid1 和 grid2 ,它们只包含 0 (表示水域)和 1 (表示陆地)。一个 岛屿 是由 四个方向 (水平或者竖直)上相邻的 1 组成的区域。任何矩阵以外的区域都视为水域。 如…

文件夹怎么加密码?文件夹怎么设置密码?

文件夹设置密码可以有效地保护文件夹的安全,避免数据泄露。那么,文件夹怎么加密码呢?下面我们就来了解一下。 文件夹保护3000 文件夹保护3000提供了三种文件夹保护方式,文件夹加密码就是其中之一。我们可以通过三种简单快捷的方式…

【LeetCode-简单题】26. 删除有序数组中的重复项

文章目录 题目方法一&#xff1a;快慢指针 题目 方法一&#xff1a;快慢指针 class Solution { //快慢指针public int removeDuplicates(int[] nums) {int fast 1;int slow 0;while(fast < nums.length){if(nums[fast] nums[fast-1]) fast;//若当前元素和之前元素相同 则…

Java使用正则校验各种信息

一、前言 在实际项目中&#xff0c;我们有可能需要针对身份证、IP地址&#xff0c;手机号等相关信息做校验&#xff0c;这是可以通过正则匹配形式实现相关校验。 二、具体实现 1.先定义相关信息校验工具类。 public class RegexUtil {public static final String identity_re…

N9344C安捷伦Agilent N9344C频谱分析仪

181/2461/8938如果您在现场进行测量&#xff0c;安捷伦N9344C手持式频谱分析仪(HSA)会让您的工作更加轻松。符合MIL PRF 28800 Class 2标准&#xff0c;它具有在恶劣的野外环境中工作所需的特性&#xff0c;其测量性能让您对工作的正确完成充满信心。N9344C HSA可让您自动执行常…

FancyBox.js基于JQuery图集弹层插件用法

FancyBox是一款基于 jquery 开发的类 Lightbox 插件。支持对放大的图片添加阴影效果&#xff0c;对于一组相关的图片添加导航操作按纽&#xff0c;该 lightbox 除了能够展示图片之外&#xff0c;还可以展示 iframed 内容&#xff0c; 通过 css 自定义外观。 相对与 Lightbox 而…

CUDA小白 - NPP(6) 图像处理 Geometry Transforms (2)

cuda小白 原始API链接 NPP GPU架构近些年也有不少的变化&#xff0c;具体的可以参考别的博主的介绍&#xff0c;都比较详细。还有一些cuda中的专有名词的含义&#xff0c;可以参考《详解CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid》 常见的NppStatus&#xf…

LeetCode 1282. Group the People Given the Group Size They Belong To【哈希表】1267

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

Python入门学习15(面向对象)

一、多态 多态&#xff0c;指的是&#xff1a;多种状态&#xff0c;即完成某个行为时&#xff0c;使用不同的对象会得到不同的状态。 同样的行为&#xff08;函数&#xff09;&#xff0c;传入不同的对象&#xff0c;得到不同的状态 class Animal:def speak(self):passclass …

NTP8928(20W内置DSP双通道D类功放芯片)

由工采网代理的韩国NF(耐福)NTP8928是一款内置DSP双通道D类音频功放芯片&#xff0c;芯片集成了多功能数字音频信号处理功能&#xff0c;高性能&#xff0c;高保真全数字PWM调制器和两个大功率全桥MOSFET。 该芯片工作电压范围&#xff1a;5V&#xff5e;28V&#xff1b;2通道…

基于antd+vue2来实现一个简单的工作流程图功能

简单流程图的实现&#xff08;基于antdvue2的&#xff09;代码很多哦~ 实现页面如下 1.简单操作如下 2.弹框中使用组件&#xff1a; <vfdref"vfd"style"background-color: white;":needShow"true":fieldNames"fieldNames"openUse…

深入《C++ Core Guidelines解析》:提升C++编程实践的关键指南

目录 1、写在前面2、推荐理由3、内容介绍4、作者介绍5、赠书 or 购买 1、写在前面 C Core Guidelines是一个正在进行的开源项目&#xff0c;通过将广泛认可的现代C上佳实践集中在一个地方来解决这些问题。Core Guidelines依赖于几十年的经验和早期的编码规则。它们与C本身共享一…

2d关键点转bvh fbx

本文使用的方法是把关键点转换成3d关键点&#xff0c;然后再使用脚本转换成bvh。bvh转fbx可以直接使用blender转。 环境准备 MotionBERT(2D关键点转换到3D关键点)AlphaPose(提取2D关键点)。转换脚本&#xff0c;https://github.com/TnoobT/pose2bvh/tree/main 步骤 安装好A…