电脑网页访问,获取完整代码。
1 实践任务
1.1 实践目的
分析简易加减法计算器的设计要求,设计简易加减法计算器的原理图,并完成简易加减法计算器线路的搭建与调试,培养学生电子电路图的分析、设计、搭建与调试能力,培养学生的劳动意识与创新意识,提高学生的团队协作能力。
1.2 实验内容
设计简易加减法计算器的原理图,并进行功能分析;
运用单片机、运算放大器、电阻、电容、电感、二极管、导线、LCD1602等材料,并进行电子电路的搭建与焊接;
完成简易加减法计算器的电路的调试;
对简易加减法计算器电路调试结果的分析与总结,并提出合理化的改进意见;
1.3 实现目标
自己定义键盘的功能,通过键盘输入数字,加减号,实现加减法的运算,并在LCD1602上显示。
2 硬件设计
![]() |
图3.1 proteus仿真图
本实验仿真电路图如上图所示,主要用到的元件有:STC89C52RC单片机、LCD12602、按钮若干、10k排阻等本实验利用51单片机做加减运算,将过程与结果按照格式显示到LCD1602显示器上。LCD1602在上个实验中已经编写了驱动文件,因此在这个项目中可以直接调用相关函数。通过4*4矩阵键盘,向单片机输入信息,单片机通过识别键盘输入的内容来进行数字的输入、运算、结果、错误清除等操作,并实时显示在LCD1602上。
3 软件设计
#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-真实结果。是因为定义的无符号数据类型范围太小,无法显示负数的内容,因此,我在程序中加入了两个数比大小的环节以解决这个问题,当被减数小于减数,那么就求他们相减的绝对值,并且对结果添加上负号。
源程序,需要自取,仅限学习使用!!!!!