【Proteus仿真】【51单片机】简易计算器

news2024/7/11 18:54:30

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用Proteus8仿真51单片机控制器,使动态数码管、矩阵按键、蜂鸣器等。
主要功能:
系统运行后,数码管默认显示0,输入对应的操作数进行四则运算,支持最大8位显示,支持显示小数点后2位数。


二、软件设计

/*
作者:嗨小易(QQVIP群2:570487280)

*/


//将整数各位取出存放数组
//num:转换的整数
//buf:转换后存储到数组内
//返回值:整数的长度
u8 int_to_array(u32 num,u8 buf[])
{
	u8 i=0;
	u8 tempbuf[SMG_SHOW_BITNUM];
	char j=0;
	u8 cnt=0;

	if(num!=0)//传入的数据不为0
	{
		while(num!=0)
		{
			tempbuf[i]=num%10;//将各个位的数赋值于数组tempbuf[i]
			num/=10;//现在数组tempbuf[i]记录的是各个位上的数的反序
			i++;//i记录这个数是几位数		
		}
		for(j=i-1;j>=0;j--)
		{
			buf[cnt++]=gsmg_code[tempbuf[j]];	
		}	
	}
	else//传入的数据为0
		buf[cnt++]=gsmg_code[0];	
	
	return cnt;
}

//计算结果并显示
void get_result_show(void)
{
	u8 smgbuf[SMG_SHOW_BITNUM];
	u8 bitnum=0;
	u8 key=0;
	u8 buf[3];//缓存显示小数的数据

	while(1)
	{
		key=key_matrix_flip_scan();
		if(key==14)	//清除操作
		{
			sys_ctr_sys.equal=0;
			sys_ctr_sys.sign=0;
			sys_ctr_sys.curNum=0;
			sys_ctr_sys.preNum=0;
			sys_ctr_sys.dot=0;
			break;
		}
		
		//等号键、计算结果
		if(sys_ctr_sys.equal==SIGN_EQUAL)
		{
			
			switch(sys_ctr_sys.sign)
			{
				case SIGN_ADD: sys_ctr_sys.result=sys_ctr_sys.preNum+sys_ctr_sys.curNum;break;
				case SIGN_MIN: 
					if(sys_ctr_sys.preNum<sys_ctr_sys.curNum)
						sys_ctr_sys.result=sys_ctr_sys.curNum-sys_ctr_sys.preNum;
					else
						sys_ctr_sys.result=sys_ctr_sys.preNum-sys_ctr_sys.curNum;
					break;
				case SIGN_MUL: sys_ctr_sys.result=sys_ctr_sys.preNum*sys_ctr_sys.curNum;break;
				case SIGN_DIV: 
					if(sys_ctr_sys.curNum!=0)
						sys_ctr_sys.result=(float)sys_ctr_sys.preNum/sys_ctr_sys.curNum;
					if(sys_ctr_sys.result!=(int)sys_ctr_sys.result)//有小数,保留小数后2位
					{
						sys_ctr_sys.result=sys_ctr_sys.result*100;
						sys_ctr_sys.dot=2;
					}
					break;
			}
			bitnum=int_to_array(sys_ctr_sys.result,smgbuf);
			if(sys_ctr_sys.dot)//有小数显示
			{
				if(sys_ctr_sys.result<10)//放大100倍结果小于10,比如0.01
				{
					buf[0]=0x3f|0x80;
					buf[1]=0x3f;
					buf[2]=smgbuf[0];
					smg_display(buf,SMG_SHOW_BITNUM-1-bitnum);			
				}
				else if(sys_ctr_sys.result<100)//放大100倍结果小于100,比如0.12
				{
					buf[0]=0x3f|0x80;
					buf[1]=smgbuf[0];
					buf[2]=smgbuf[1];
					smg_display(buf,SMG_SHOW_BITNUM-bitnum);	
				}
				else
				{
					smgbuf[bitnum-1-sys_ctr_sys.dot]|=0x80;
					smg_display(smgbuf,SMG_SHOW_BITNUM+1-bitnum);	
				}						
			}
			else	//无小数显示	
				smg_display(smgbuf,SMG_SHOW_BITNUM+1-bitnum);
			sys_ctr_sys.sign=0;					
		}
		else
		{
			sys_ctr_sys.equal=0;
			break;
		}	
	}
}

//计算器控制系统
void cal_cotrol_sys(void)
{
	
	while(1)
	{
		get_pre_num_show();//获取第1个计算数并显示	
		get_cur_num_show();//获取第2个计算数并显示
		get_result_show();//计算结果并显示
	}		
}



三、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述

联系作者

视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

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

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

相关文章

如何在Ubuntu的Linux系统上安装nacos的2.3.0版本

官方网址链接 home (nacos.io)Nacos 快速开始github代码仓库简单介绍 Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件&#xff0c;其可以用于服务发现和服务健康监测、动态配置服务、动态DNS服务、服务及其元数据管理。安装包下载地址&#xff1a; Releases …

Uniapp - 环境搭建 vscode开发

uni-app 基础 创建 uni-app 项目方式 uni-app 支持两种方式创建项目&#xff1a; 通过 HBuilderX 创建&#xff08;需安装 HBuilderX 编辑器&#xff09; 通过命令行创建&#xff08;需安装 NodeJS 环境&#xff09; HBuilderX 创建 uni-app 项目 创建步骤 1.下载安装 H…

Kubernetes实战(八)-防止k8s namespace被误删除

1 背景 运维新同学在预发环境操作删除pod的时候&#xff0c;不知道什么原因把kubectl delete pod命令敲成了kubectl delete ns pre把预发环境删了&#xff0c;几十个模块&#xff0c;将近一个小时才恢复。幸亏是测试环境啊&#xff0c;如果是生产可以可以跑路了。 2 解决方案…

Thymeleaf生成pdf表格合并单元格描边不显示

生成pdf后左侧第一列的右描边不显示&#xff0c;但是html显示正常 显示异常时描边的写法 cellpadding“0” cellspacing“0” &#xff0c;td,th描边 .self-table{border:1px solid #000;border-collapse: collapse;width:100%}.self-table th{font-size:12px;border:1px sol…

关于物联网仪表ADW300 远传电表的详细介绍-安科瑞 蒋静

1概述 ADW300无线计量仪表主要用于计量低压网络的三相有功电能&#xff0c;具有体积小、精度高、功能丰富等优点&#xff0c;并且可选通讯方式多&#xff0c;可支持 RS485 通讯和 Lora、NB、4G、wifi 等无线通讯方式&#xff0c;增加了外置互感器的电流采样模式&#xff0c;从而…

postman实现接口自动化图解步骤,测试用例集,断言,动态参数,全局变量的随笔记录

实现接口自动化的方式有很多种&#xff0c;requests unittest ddt 的接口自动化框架有些朋友也有接触&#xff0c;但是考虑到很多没有代码基础&#xff0c;且这种框架实现需要的时间周期比较长&#xff0c;但是大多数公司的项目时间并不充裕。 这篇随笔主要就是记录实现效率…

CentOS系统下配置HTTP服务器的步骤

在CentOS系统下配置HTTP服务器涉及到一系列的步骤。以下是一个基本的步骤概述&#xff0c;帮助你了解如何为CentOS系统配置HTTP服务器。 安装HTTP服务器软件&#xff1a; 首先&#xff0c;你需要在CentOS系统上安装HTTP服务器软件。常见的选择是Apache HTTP服务器。你可以使用…

SDN随笔

SDN不支持跨厂商 vxlan有1600万个&#xff0c;随便用 openstack来通过sdn来管理网络 网络架构 openflow很激进&#xff0c;用的很少 华为解决方案 推动网络设备的自动化配发 网络流量与路径优化

科普小知识-3D 打印是什么?

3D 打印是什么&#xff1f;作为近年来备受关注的前沿科技&#xff0c;3D 打印技术正在不断改变着制造业、医疗领域、艺术设计等多个领域的面貌。其又被称为增材制造&#xff0c;是一种通过电脑设计&#xff0c;逐层堆叠材料来创建三维物体的技术。 3D 打印的基本原理 3D 打印…

智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.北方苍鹰算法4.实验参数设定5.算法结果6.参考…

Qt11.7

登录窗口的应用场景&#xff0c;实现一个登录窗口界面 头文件&#xff1a; #ifndef AIKUN_H #define AIKUN_H#include <QWidget> #include <QIcon> //图标类 #include <QMovie> //动图类 #include <QLabel> //标签类 #include <QLineEdit> …

dockers安装rabbitmq

RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQhttps://www.rabbitmq.com/ Downloading and Installing RabbitMQ — RabbitMQ docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.12-management 之后参照&#xff1a;dock…

HTTP、HTTPS、SSL协议以及报文讲解

目录 HTTP/HTTPS介绍 HTTP/HTTPS基本信息 HTTP请求与应答报文 HTTP请求报文 HTTP响应报文 SSL协议 SSL单向认证 SSL双向认证 HTTP连接建立与传输步骤 HTTP访问全过程相关报文&#xff08;以访问www.download.cucdccom为例子&#xff09; DNS报文解析 TCP三次握手连…

智能配电监控系统

智能配电监控系统是针对供配电系统中的变配电环节&#xff0c;利用现代计算机控制技术、通信技术和网络技术等&#xff0c;采用抗干扰能力强的通讯设备及智能电力仪表&#xff0c;经电力监控管理软件组态&#xff0c;实现的系统的监控和管理。依托电易云-智慧电力物联网&#x…

生成式人工智能笔记-AIGC笔记

生成式人工智能笔记-AIGC笔记 十多年前&#xff0c;人工智能还只是一个不被人看好的小众领域&#xff0c;但是现在&#xff0c;它却已经成了街头巷尾的热点谈资&#xff0c;几乎任何事情都可以和人工智能联系在一起。 人工智能包括基础层、技术层和应用层。 基础层是人工智能…

数字营销影响消费者行为的 6 种方式

如果您正在考虑转向在线市场&#xff0c;那么这个决定就好了&#xff01;没有什么比数字营销更强大的了。但是&#xff0c;在开始之前&#xff0c;请了解数字营销如何影响消费者行为。由于客户是任何企业的基石&#xff0c;因此跟踪消费者行为至关重要。 数据分析在识别潜在客…

LeetCode力扣每日一题(Java):20、有效的括号

一、题目 二、解题思路 1、我的思路 我看到题目之后&#xff0c;想着这可能是力扣里唯一一道我能秒杀的题目了 于是一波操作猛如虎写出了如下代码 public boolean isValid(String s) {char[] c s.toCharArray();for(int i0;i<c.length;i){switch (c[i]){case (:if(c[i]…

Git 配置文件(.gitignore)

前言 在使用 Git 分布式版本控制系统的时候&#xff0c;有些文件如&#xff1a;数据库的一些配置文件&#xff0c;我们不想让这类文件在远程仓库让 Git 来管理&#xff0c;不想让别人看到&#xff0c;此时就可以自己在 Git 仓库目录下创建 / 在远程仓库创建的时候就配置好 .git…

【从零开始学习JVM | 第五篇】快速了解运行时数据区

前言&#xff1a; 当谈论 Java 程序的运行机制时&#xff0c;JVM&#xff08;Java 虚拟机&#xff09;的运行时数据区是一个必不可少的话题。JVM 运行时数据区是 Java 程序在运行过程中分配内存和管理数据的重要区域&#xff0c;它包括了方法区、堆、虚拟机栈、程序计数器和本地…

TA-Lib学习研究笔记(九)——Pattern Recognition (4)

TA-Lib学习研究笔记&#xff08;九&#xff09;——Pattern Recognition &#xff08;4&#xff09; 最全面的形态识别的函数的应用&#xff0c;通过使用A股实际的数据&#xff0c;验证形态识别函数&#xff0c;用K线显示出现标志的形态走势&#xff0c;由于入口参数基本上是o…