【51单片机】简易加减法计算器(附代码)

电脑网页访问,获取完整代码。

实践任务

1.1  实践目的

分析简易加减法计算器的设计要求,设计简易加减法计算器的原理图,并完成简易加减法计算器线路的搭建与调试,培养学生电子电路图的分析、设计、搭建与调试能力,培养学生的劳动意识与创新意识,提高学生的团队协作能力。

1.2  实验内容

设计简易加减法计算器的原理图,并进行功能分析;

运用单片机、运算放大器、电阻、电容、电感、二极管、导线、LCD1602等材料,并进行电子电路的搭建与焊接;

完成简易加减法计算器的电路的调试;

对简易加减法计算器电路调试结果的分析与总结,并提出合理化的改进意见;

1.3  实现目标

自己定义键盘的功能,通过键盘输入数字,加减号,实现加减法的运算,并在LCD1602上显示。

硬件设计

图3.1     proteus仿真图

本实验仿真电路图如上图所示,主要用到的元件有:STC89C52RC单片机、LCD12602、按钮若干、10k排阻等本实验利用51单片机做加减运算,将过程与结果按照格式显示到LCD1602显示器上。LCD1602在上个实验中已经编写了驱动文件,因此在这个项目中可以直接调用相关函数。通过4*4矩阵键盘,向单片机输入信息,单片机通过识别键盘输入的内容来进行数字的输入、运算、结果、错误清除等操作,并实时显示在LCD1602上。

软件设计

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "matrix.h"
#include <STDIO.H>
#include <stdlib.h>
unsigned char keynum;
int num1,num2;
long int ans_num;
unsigned int bit_flag=0,fchar_flag=0,key_count=0;
unsigned int num_count=1,need_set0=0;
unsigned int i;
void main()
{
	LCD_Init();
	while(1)
	{
		keynum=matrix();
		if(keynum)
		{
			if(keynum<=10)				//s1-10为数字键
			{
				if(need_set0==1)
				{	
					//上层清零
					for(i=0;i<16;i++)
					{
						LCD_ShowChar(1,i,' ');
					}
					need_set0=0;
				}
				if(keynum==10){keynum=0;}
				if(num_count==1)
				{	
					num1=(num1*10)+keynum;
					LCD_ShowNum(1,1,num1,3);
				}
				if(num_count==0)
				{
					num2=(num2*10)+keynum;
					LCD_ShowNum(1,7,num2,3);
				}
				bit_flag++;
				if(bit_flag>3)
				{
				LCD_ShowString(1,1,"Syntax ERROR");
				for(i=0;i<16;i++)
					{
						LCD_ShowChar(2,i,' ');
					}
				bit_flag=0;
				fchar_flag=0;
				key_count=0;
				num1=0;
				num2=0;
				ans_num=0;
				num_count=1;
				need_set0=1;
				}
			}
			if(keynum==11)               //s11为加法
			{
				fchar_flag=1;	//fchar_flag=1为加
				LCD_ShowChar(1,5,'+');
				num_count=0;
				bit_flag=0;
			}
			
			if(keynum==12)               //s12为减法
			{
				fchar_flag=0;	//fchar_flag=0为减
				num_count=0;
				LCD_ShowChar(1,5,'-');
				bit_flag=0;
			}
			if(keynum==16)				 //s16为等号
			{
				LCD_ShowChar(2,1,'=');
				if(fchar_flag==1)
				{	ans_num=num1+num2;
					LCD_ShowChar(2,2,' ');

				}
				if(fchar_flag==0)
				{
					ans_num=abs(num1-num2);
					if(num1<num2)
					{
						LCD_ShowChar(2,2,'-');
					}
				}
				need_set0=1;
	
				LCD_ShowNum(2,3,ans_num,4);
				bit_flag=0;
				fchar_flag=0;
				key_count=0;
				num1=0;
				num2=0;
				ans_num=0;
				num_count=1;
			}
			if(keynum==15)
			{
				//上层清零
				for(i=0;i<16;i++)
				{
					LCD_ShowChar(1,i,' ');
					LCD_ShowChar(2,i,' ');
				}for(i=0;i<16;i++)
				bit_flag=0;
				fchar_flag=0;
				key_count=0;
				num1=0;
				num2=0;
				ans_num=0;
				num_count=1;
			}
		}
	}
}

 主程序主要包含了数字的输入,运算,和按钮功能定义的一些内容,具体的流程图如下。

在主程序中,定义按键s1-10为数字键“1,2,3,4,5,6,7,8,9,0”,按键s11为“+”按键s12为“-”,按键s15为清零键用于清空输入的数字和错误提示,按键s16为“=”,按下之在LCD1602的第二行显示答案。

4  系统调试与结论

        在编程时遇到一些问题,当输入的被减数比减数小时,会出现结果为负的情况,但是结果显示为65535-真实结果。是因为定义的无符号数据类型范围太小,无法显示负数的内容,因此,我在程序中加入了两个数比大小的环节以解决这个问题,当被减数小于减数,那么就求他们相减的绝对值,并且对结果添加上负号。

源程序需要自取,仅限学习使用!!!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Collin Lee

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

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

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

打赏作者

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

抵扣说明:

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

余额充值