基于MCS51单片机的简易计算器的设计与实现毕业论文设计.docx
《基于MCS51单片机的简易计算器的设计与实现毕业论文设计.docx》由会员分享,可在线阅读,更多相关《基于MCS51单片机的简易计算器的设计与实现毕业论文设计.docx(28页珍藏版)》请在冰点文库上搜索。
基于MCS51单片机的简易计算器的设计与实现毕业论文设计
(此文档为word格式,下载后您可任意编辑修改!
)
基于MCS-51单片机的简易计算器的设计与实现
【摘要】当今社会,随着人们物质生活的不断提高,电子产品已经走进了家家户户,无论是生活或学习,还是娱乐和消遣几乎样样都离不开电子产品,大型复杂的计算能力是人脑所不能胜任的,而且比较容易出错。
计算器作为一种快速通用的计算工具方便了用户的使用,可是它还在发展之中,以后必将出现功能更加强大的计算器,所以本次设计是基于51单片机来设计的计算器,实现基本功能加减乘除,采用LCD显示结果数据。
【关键词】MCS-51;MM74C922;Protues;矩阵键盘;计算器
DesignandimplementationofasimplecalculatorbasedonMCS-51singlechipmicrocomputer
【Abstract】Nowadays,withthecontinuousimprovementofpeople'sliving,electronicproductsalmosteverythingcannotdowithouttheelectronicproducts,computingcapabilityoflargeandcomplexisthebrainarenotcompetent,andrelativelyeasytogowrong.Thecalculatorasafastgeneral-purposecomputingtoolsareeasytouse,butitisstillindevelopment,laterwillappearacalculatorfunctionmorepowerful,sothisdesignistodesignbasedon51singlechipcomputer,therealizationofthebasicfunctionsofadd,subtract,multiplyanddivide,usesLCDtodisplaytheresultsofdata.
【Keywords】MCS-51;MM74C922;Protues;Matrixkeyboard;calculator
第一章绪论
1.1设计背景
随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。
电子产品的更新速度快就不足惊奇了,单片机的应用已经越来越贴近生活。
计算器在人们的日常中就是比较的常见的电子产品之一。
可是它还在发展之中,以后必将出现功能更加强大的计算器,基于这样的理念,本次设计是用单片机来设计一个简易计算器。
1.2设计内容
本次设计是基于MCS-51单片机来设计的计算器。
计算器将完成的功能有加,减,乘,除等功能。
设计的关键所在,必须非常熟悉单片机的原理与结构,同时还要对整个设计流程有很好的把握,将单片机和其他模块完整的衔接。
1.3设计意义
此次论文的价值和核心在于倡导自己把所学知识运用到现实生活,为现实生活服务,把自己的知识转化为实物哪怕是很简单的物件,很简单的功能,但真真切切的让自己感受到创造的快乐,为自己今后的工作做好铺垫,往后通过更多的学习,更多的尝试,把知识的作用真正发挥出来,改变大家的生活。
第二章设计方案及技术基础
2.1设计方案
为了满足计算器的基本要求,可以基本的运算(加减乘除),数据归零和出错警告提示,我们采用基于51单片机,结合MM74C922芯片设计一个简易的计算器,用4*4的矩阵键盘实现数据输入,实现基本功能加减乘除,并用LCD显示数据。
设计仿真和调试要用到Keil、Protues等软件。
2.2方案论证及设计
根据功能与要求,本系统选用MCS-51单片机为主控机。
通过扩展必要的外围接口电路,实现对计算器的设计。
具体设计如下:
(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD显示数据和结果。
(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算键盘。
(3)执行过程:
开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。
(4)错误提示:
当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:
当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD上提示错误。
2.3MCS-51单片机及开发环境介绍
2.3.1MCS-51系列单片简介
MCS-51单片机较之前的单片机相比,功能增强许多,就其指令和运行速度而言,超过了Intel8085的CPU和Z80的CPU,成为工业控制系统中较为理想的机种。
目前与MCS-51单片机兼容的一些单片机的时钟频率达到40MHz甚至更高。
51系列单片机的特点:
(1)8位cpu;
(2)片内带振荡器,频率范围为1.2MHz~12MHz;(3)片内带128M的数据存储器;(4)片内带4KB的程序存储器;(5)程序存储器的寻址空间为64KB;(6)片外数据存储器的寻址空间为64KB;(7)128个用户位寻址空间;(8)21个字节特殊功能寄存器;(9)4个8位的IO并行接口:
P0、P1、P2、P3;(10)两个16位定时、计数器;(11)两个优先级别的五个中断源;(12)一个全双工的串行IO接口,可多机通信;(13)111条指令,包含乘法指令和除法指令;(14)片内采用单总线结构;(15)有较强的位处理能力;(16)采用单一+5V电源
图2-1MCS-51结构图
2.3.2MM74C922芯片
为了进一步节省单片机IO口资源,我们在设计中使用了MM74C922芯片。
MM74C922是一款4*4键盘扫描IC,它可检测到与之相连的4*4键盘的按键输入,并通过数据输出口将按键相应的编码输出。
其引脚图如图2-2所示:
图2-2MM94C922硬件图
MM74C922引脚说明:
(1)Y1~Y4(脚1~脚4):
4*4键盘第一列至第四。
(2)X1~X4(脚11、10、8、7):
4*4键盘第一行至第四行。
(3)DOA~DOD(DataoutA~D,脚14~17):
按键之BCD码输出,其中DOA为LSB,DOD为MSB。
(4)VCC(脚18):
电源脚,+3V~+15V。
(5)GND(脚9):
接地管脚。
(6)OSC(Oscillator,脚5):
键盘扫描电路之频率所需外加电容的连引脚。
(7)KBM(KeyboardMask,脚6):
内部消除开关弹跳电路所外加电容的引脚。
(8)OE(OutputEnable,脚13):
芯片使能脚,接低电位可使芯片使能。
(9)DA(DataAvailable,脚12):
数据有效输出脚。
任一按键按下时,此脚位会输出高电位,按键释放后此脚又会恢复为低电位。
MM74C922对各按键的响应如下表所示:
图2-3MM74C922对各按键的响应
第三章硬件设计
3.1硬件电路设计
3.1.1电路设计原理
单片机采用AT89C51单片机,它能够满足数据的采集、控制和数据处理的需求。
结合时钟电路、复位电路、键盘输入完成简易计算器总电路设计。
图3-1电路设计原理
3.1.2硬件电路设计
图3-2总电路设计
3.2时钟电路
时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。
在MCS-51单片机片内部有一个高增益的反相放大器,它的的输入端为引脚XTAL1,输出端为引脚XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式,晶振频率均为30pF。
根据硬件电路的不同,单片机的时钟连接方式可分为内部时钟方式和外部时钟方式。
我们采用内部时钟方式。
在内部方式时钟电路中,必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调电容构成振荡电路。
图3-3时钟电路连接图
3.3复位电路
单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作。
无论是单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。
所以,必须弄清楚MCS-51单片机复位的条件、复位电路和复位后的状态。
复位信号从单片机的RST引脚输入,高电平有效,其有效电平应维持至少2个机器周期。
复位操作有上电自动复位与按键手动复位两种方式,为了方便系统的硬件初始化,我们采用按键手动复位。
图3-4复位电路连接图
3.4输入模块:
键盘接口电路
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的IO口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。
矩阵键盘采用四条IO线作为行线,四条IO线作为列线组成键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4*4个。
这种行列式键盘结构能有效地提高单片机系统中IO口的利用率。
计算器的键盘布局如图3-5与图3-6所示:
一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。
图3-5矩阵键盘布局图
图3-6矩阵键盘内部电路图
如下图3-7所示,在本设计中,计算器输入键盘的4条行线、列线分别连接到MM74C922的X1~X4、Y1~Y4引脚,MM74C922的数据输出口与单片机的P2口相连,MM74C922的DA引脚经过一个非门连接到单片机的INT0脚,当MM74C922检测到键盘输入时,DA产生高电平,与之相连的INT0检测到低电平,给单片机一个中断,单片机从P2口的低四位读入键盘上按下的键的值。
图3-7键盘接口电路图
第四章软件设计
本设计主要包含主程序、外部中断0程序。
4.1主程序设计
主程序函数表示:
允许中断;初始化键盘接口连接、LCD显示、LCD、LCD输入数据函数。
图4-1主程序流程图
4.2外部中断0处理程序
有键按下时,单片机响应外部中断0,转入外部中断0中断处理函数,在中断处理函数中完成对按键的判断,以进行下一步的程序处理。
其中调用键值转化函数、算术运算函数。
图4-2外部中断0函数流程图
4.2.1键值转化为键盘上按键值程序
该程序函数的作用是将输入的键值转化为数值或符号。
图4-3键值转化为键盘上按键值流程
4.2.2算术运算程序
在外部中断函数对键值进行判断后,进行加、减、乘、除运算,运算后的数值如果超出范围规定,则数值溢出处理。
图4-4算术运算程序
4.3LCD显示程序
利用LCD静态显示,通过程序向LCD写指令字或数据使LCD完成不同功能或显示相应数据。
**************LCD初始化函数*************
voidinit_LCM()
{
write_com(0x30);
write_com(0x30);
write_com(0x30);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0e);
}
***********LCD写数据函数*************
voidwrite_data(charddata)
{
RS=1;*写指令*
R_W=0;
EN=1;*使能信号开*
P1=ddata;*将数据送入p1口*
EN=0;*使能信号关*
check_BF();
}
***********LCD写指令函数*************
voidwrite_com(charcommand)
{
RS=0;*写指令*
R_W=0;
EN=1;*使能信号开*
P1=command;*将数据送入p1口*
EN=0;*使能信号关*
check_BF();
}
************LCD检查忙碌函数***********
voidcheck_BF()
{
chari,x=0x80;
P1=0xff;
while(x&0x80)
{
RS=0;
R_W=1;
EN=1;
x=P1;
EN=0;
for(i=0;i<10;i++);
}
EN=0;*关闭使能信号*
}
**********LCD清屏函数**********
voidclearLCD()
{
write_com(0x01);
}
**********LCD显示函数**********
voiddisplay(longa)
{
longtemp,b,c=-1;
intlenth=1,i,j;
clearLCD();
if(a<0)
{
a=a*c;
write_data('-');
}
temp=a;
while((temp=temp10)!
=0)
{
lenth++;
}
for(i=lenth;i>0;i--)
{
b=1;
for(j=0;j{
b=b*10;
}
write_data(0x30+ab);
a=a%b;
}
}
第五章开发体会
5.1Keil软件调试
1.首先在电脑上正确的下载keil软件。
2.在keil集成开发环境中创建新项目(Project),扩展文件名为.UV2,并为该项目选定合适的单片机CPU器件(本设计采用ATMEL公司下的AT89C51)。
3.用keil的文本编辑器编写源文件,可以是汇编语言,也可以为c语言,完成后将该文件添加到项目中去。
注意保存的时候如果是c语言编写程序必须在后面加.C。
4.通过keil的相关选择项,配置编译环境、连接定位器以及Debug调试器的功能。
5.对项目中的源文件进行编译连接,生成绝对目标代码和可选的HEX文件,如果出现编译连接错误则返回到第2步,根据软件中的错误提示进行修改源文件,切记不要浮躁,一步一步修改直到最后提示没有差错最终生成hex文件。
6.对没有语法错误的程序进行仿真调试,调试成功后将HEX文件写入到单片机应用系统的ROM中。
5.2Protues软件仿真
1.首先在电脑里下载正确的软件,此软件主要是对硬件部分进行模拟。
2.进入软件后蓝色框内就是工作区域,可以在里面随意选择元器件,移动元器件。
正确的进行导线连接。
3.完成所有连接后,双击单片机把生成的HEX文件进行导入。
4.最后如果程序和连图都没有问题就可以进行仿真了。
图5-1系统仿真总图
第六章总结
通过这次的毕业论文设计我学习到了很多知识,平时在学校觉得自己好像对专业知识还是比较了解的。
可是遇到这次设计完全没有思绪,找不到切入点。
然后我就通过询问老师与跑图书馆查资料、确定基本设计方案、对所用芯片功能进行查找、调试、上机仿真等,经历了一次次的困难,却积累了很多宝贵的经验。
在整个设计的过程中遇到的问题主要有以下三点,第一:
基础知识掌握的不牢固,主要表现在一些常用的电路的形式和功能不清楚,对书本上的内容理解不够透彻。
第二:
对一些常用的应用软件缺少应用,体现在画电路图和系统的仿真的时候,对这些软件的操作不熟练,浪费了很多时间。
第三:
相关知识掌握的不够全面,缺少系统设计的经验。
这次设计进一步端了我的学习态度,学会了实事求是,严谨的作风,对自己要严格要求,不能够一知半解,要力求明明白白。
如果省略了那些必要的步骤,急于求成,不仅会浪费时间,还会适得其反。
我觉得动手之前,头脑里必须清楚该怎么做,这一点是很重要的。
在此次的毕业设计中我最大的体会就是进一步认识到了理论联系实践的重要性。
一份耕耘,一份收获。
通过这段时间的设计,让我明白科学的思维方法和学习方法是多么重要,只有这样才能够有很高的效率,才能够让自己的工作更完美。
总而言之,此次毕业设计让我学到了好多平时在课堂上学不到的东西,增加了我的知识运用能力,增强我的实际操作能力。
谢谢老师给我们提供这么好的机会,为我们之后走向社会奠定了一个好的基础。
参考文献
[1]胡辉.《单片机原理与应用》.北京中国水利水电出版社.2007
[2]何立.《单片机高级教程》.北京航空航天大学出版社.2006
[3]赵克林.《C语言实例教程》.北京人民邮电出版社.2007
[4]张义和,许宏昌,余春长.《例说51单片机》.人民邮电出版社.2008
[5]康维新.《MCS-51单片机原理与应用》.北京中国轻工业出版社.2009.1
[6]陈立周,陈宇.《单片机原理及其应用(第2版)》.北京机械工业出版社.2008.5
[7]徐爱钧.《单片机原理实用教程:
基于Protues虚拟仿真》.北京电子工业出版社.2009
(1)
致谢
起初接触毕业设计的时候,我对于这篇论文完全不知道该怎么着手,可是通过刘老师耐心的给我讲解,同时查阅各类专业书籍,让我对论文有了一个初步构思,知道该怎么去一步步的完成它。
在完成初稿时也遇到了很多问题,对于仿真软件运用的陌生,还有就是对于计算器的硬件选择的错误。
最后都是在刘老师的帮助下我克服了这些问题,成功的把毕业设计做完了并完成了仿真。
我要正式的向刘老师致谢,如果没有刘老师的帮助我是不可能完成毕业设计的,这次毕业设计我所学到的不仅仅是书本上的知识,还有坚持一路向前坚持的精神。
这将为我以后的人生道路做好指引,我将受益一生。
附录
#include{
EA=1;
EX0=1;
IT0=1;
P2=0xff;
display(0);
init_LCM();
write_data(0x30);
while
(1)
{
}
}
**********键值转化为键盘上按键值函数*************
chartranslate(intkeycode)
{
switch(keycode)
{
case0:
return'7';
break;
case1:
return'4';
break;
case2:
return'1';
break;
case3:
return'c';
break;
case4:
return'8';
break;
case5:
return'5';
break;
case6:
return'2';
break;
case7:
return'0';
break;
case8:
return'9';
break;
case9:
return'6';
break;
case10:
return'3';
break;
case11:
return'=';
break;
case12:
return'';
break;
case13:
return'*';
break;
case14:
return'-';
break;
case15:
return'+';
break;
}
}
***********外部中断0处理函数*************
voidINT_0(void)interrupt0using0
{
key=translate(P2&0x0f);
if(key<='9'&&key>='0')判断按下的键是否为数值
{
num=num*10+(key-'0');
if(operators>0)
{
y=num;
iny=1;
}
else
x=num;
if(num<134217728&&num>-134217728)当前数值是否超出限定范围
{
display(num);
}
else
dataoverflow();
}
else
{
switch(key)
{
case'c':
x=0;
y=0;
num=0;
iny=0;
operators=0;
display(num);
break;
case'=':
arithmetic();
iny=0;
operators=0;
num=0;
break;
case'+':
if(operators)
arithmetic();
operators=1;
num=0;
break;
case'-':
if(operators)
arithmetic();
operators=2;
num=0;
break;
case'*':
if(operators)
arithmetic();
operators=3;
num=0;
break;
case'':
if(operators)
arithmetic();
operators=4;
num=0;
break;
}
}
}
**********算术运算函数*************
voidarithmetic()
{
if(iny)
{
switch(operators)
{
case1:
x=x+y;
num=x;
if(num<134217728&&num>-134217728)
{
display(num);
}
else
dataoverflow();
break;
case2:
x=x-y;
num=x;
if(num<134217728&&num>-134217728)
{
display(num);
}
else
dataoverflow();
break;
case3:
x=x*y;
num=x;
if(num<134217728&&num>-134217728)
{
display(num);
}
else
dataoverflow();
break;
case4:
if(y==0)
dealerror();
else
{
x=xy;
num=x;
if(num<134217728&&num>-134217728)