单片机课程设计简易计算器设计Word格式.docx
《单片机课程设计简易计算器设计Word格式.docx》由会员分享,可在线阅读,更多相关《单片机课程设计简易计算器设计Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
显示相应的数字及运算符(A,B,C,D),按下等于(E)键后显示计算结果,按下清八段码键(F)后八段码全变暗;
出现越界输入或输出:
显示ERROR。
1.2设计思路
采用汇编语言程序设计的方法结合硬件电路设计方法,利用AEDK实验箱上已有芯片来实现简易计算器的模拟,利用Protel软件画出硬件电路。
(1).提出方案
首先,实现对键盘的扫描及设置对应按键;
其次,实现在八段码上显示键盘输入内容;
最后,对输入数据进行基本运算处理并显示相应结果(包括越界显示)。
(2).方案论证
简易计算器的设计主要是键盘扫描和八段码显示。
数据输入利用键盘实现,按要求设计各键值,通过键值判断是数字键还是功能键,通过六位八段码显示输入的相应按键及运算后的结果。
1.3实验环境
·
硬件环境:
伟福Lab6000实验箱,PC机。
软件环境:
WAVE6000应用软件。
protel99SE应用软件。
第2章详细设计方案
2.1硬件电路设计
硬件电路主要由两部分构成:
键盘扫描电路和八段码显示电路。
硬件电路连线如图2.1所示。
图2.1硬件电路连线图
2.2主程序设计
在主程序中首先调用键盘扫描函数,设一个键盘按键标记量,初值为0,首次按下按键且为数字键,标记为0,在数组中保存键值,标记量自加1。
按键标记为1时有多种情况,对按键进行判断,若输入的为数字键且没越界,则存储并显示相应数据,越界则显示ERROR;
若输入的为运算符键,则显示运算符;
若输入的为清八段码键,则进行清八段码操作;
若输入的为“=”键,则进行相应的运算,运算结果没越界显示相应结果,越界则显示ERROR。
主程序流程图如图2.2所示。
图2.2主程序流程图
2.2功能模块的设计与实现
计算器设计的功能模块有:
键盘扫描函数,八段码显示函数,延时函数。
1)键盘扫描模块的设计与实现
对于的键盘的扫描,先固定键盘的某一列,然后逐行扫描。
流程图如图2.3所示。
图2.3键盘扫描模块
2)八段码显示功能模块的设计与实现
八段码的显示函数,包含输入输出数据的显示,越界错误显示,清八段码显示,运算结果显示。
注意的是,显示是在按键抬起后进行的操作,所以显示函数中有松手检测语句。
正常输入输出时,显示相应数据;
越界时,显示错误ERROR;
输入运算符时,显示运算符;
清八段码时,则八段码不显示任何内容。
具体流程图如图2.4所示。
图2.4八段码显示模块
第3章结果测试及分析
3.1结果测试
计算器的测试包括正常输入输出测试和越界输入输出测试。
若输入正确且结果没越界:
(1)加法测试:
输入数字,如23,按下加法运算符“A”,再按下数字,如456,按下等于符号“E”,则显示正确结果479;
(2)减法测试:
输入数字,如3578,按下加法运算符“B”,再按下数字,如214,按下等于符号“E”,则显示正确结果3364;
(3)乘法测试:
输入数字,如12,按下加法运算符“C”,再按下数字,如15,按下等于符号“E”,则显示正确结果180;
(4)除法测试:
输入数字,如1478,按下加法运算符“D”,再按下数字,如81,按下等于符号“E”,则显示正确结果18。
输入输出越界测试:
输入一个大于9999的数时显示ERROR,或当计算结果越界时显示ERROR,如9999+1=ERROR,1234*378=ERROR,479/0=ERROR。
3.2结果分析
对于上述的运行结果和操作过程,达到了课程设计任务书中的要求。
设计的为4位数的简易计算器,对于除法运算只做输出结果取整情况。
若输入或输出越界时则显示ERROR。
参考文献
[1]张毅刚,刘杰.MCS51单片机原理及应用[M].哈尔滨:
哈尔滨工业大学出版社,2008
[2]高峰.单片微型计算机原理与接口技术[M].北京:
科技出版社,2007
[3]胡汉才.单片机原理及其接口技术[M].北京:
清华大学出版社,2004
[4]谭浩强.C语言程序设计[M].北京:
清华大学出版社,2005
[5]王忠民.微型计算机原理[M].西安:
西安电子科技大学出版社,2003
[6]沈美明,温冬婵.IBM-PC汇编语言程序设计[M].北京:
清华大学出版社,2001
附录I程序源代码
/******简单计算器试验:
用A,B,C,D,E,F分别表示+,-,*,/运算******/
#include<
reg51.h>
stdio.h>
math.h>
#defineucharunsignedchar
#defineuintunsignedint
uchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
//八段码
uinttablenum[]={1,10,100,1000};
ucharxdata*p1=0x08001;
//定义键盘行地址
ucharxdata*p2=0x08002;
//定义键盘列地址
ucharxdata*q1=0x08002;
//定义位码输出地址
ucharxdata*q2=0x08004;
//定义段码输出地址
uintnum;
//键盘按键
uinty1,y2;
//延时程序所用变量
uintshu;
uintkey;
//标记数字键
uinta;
//记录按键按下的次数
uintnumber1[4];
//存放数字
uintnumber2[4];
uintnum1;
uintnum2;
uintdelay(uinty1);
//延时函数
voidkeyscan();
//键盘扫描函数
voiddisplay(intb);
//键盘显示函数
voidmain()
{
intnumber;
inti;
key=0;
a=0;
*q1=0x00;
//数码管不显示
while
(1)
{
*p1=0xff;
if((*p1&
0x0f)!
=0x0f)//判断是否有按键按下
keyscan();
if(key==0&
&
num>
=0&
num<
10)//按下第一个数字键
{
number1[0]=num;
//把按键数值存放在数组number1[0]中
display
(1);
key++;
}
elseif(key==1)
if(num<
10)//此时按下的按键为0-9数字键
a++;
if(a>
3)
display(20);
//出现越界显示ERROR
else
number1[a]=num;
display(a+1);
elseif(num==15)//按下清屏键
display(15);
elseif(num>
9&
14)//按下的按键为加或减或乘或除
num2=0;
for(i=0;
i<
=a;
i++)
num2+=number1[i]*tablenum[a-i];
delay(5);
display(num);
//显示是什么运算
shu=num;
//把按下的键值传递给变量shu
elseif(num==14)//此时按下的按键为E等于按键
num1+=number1[i]*tablenum[a-i];
switch(shu)//判断运算后做相应的运算
case10:
num2+=num1;
break;
case11:
num2-=num1;
case12:
num2*=num1;
case13:
if(num1>
0)num2/=num1;
elsenum2=-1;
if(num2>
9999||num2<
0)//判断运算是否产生越界