简易计算器设计论文.docx
《简易计算器设计论文.docx》由会员分享,可在线阅读,更多相关《简易计算器设计论文.docx(30页珍藏版)》请在冰点文库上搜索。
简易计算器设计论文
简单计算器的设计与制作
摘要:
近几年单片机技术的发展很快,其中,电子产品的更新速度迅猛。
计算器是日常生活中比较常见的电子产品之一。
如何才能使计算器技术更加的成熟,充分利用已有的硬件和软件条件,设计出更出色的计算器。
完成了简易计算器的设计与制作、本设计用单片机stc89c52为核心器件,外围电路由时钟电路,复位电路,键盘电路,液晶显示电路等组成。
本设计是以STC89C52单片机为核心的计算器模拟系统设计,输入采用4*4矩阵键盘,可以进行加、减、乘、除带符号数字运算(七位整数、六位小数),并在液晶显示屏LCD1602上静态显示操作过程及结果。
该设计方案合理,简单且低成本,安全实用等特点。
具有一定推广价值。
关键词:
单片机;液晶显示屏;计算器;矩阵键盘
1绪论
1.1课题背景
随着社会的发展,科学的进步,人们的生活水平在逐步地提高,尤其是微电子技术的发展犹如雨后春笋般的变化。
电子产品的更新速度快就不足惊奇了。
计算器在人们的日常中是比较常见的电子产品之一,如何使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器,使其更好地为各个行业服务,成了如今电子领域重要的研究课题。
现如今,人们的日常生活中已经离不开计算器了,社会的各个角落都有它的身影,比如商店、办公室、学校……因此设计一款简单实用的计算器会有很大的实际意义。
本设计旨在进一步掌握单片机理论知识,理解嵌入式单片机系统的硬软件设计,加强对实际应用系统设计的能力。
通过本设计的学习,使我掌握单片机程序设计和微机接口应用的基本方法,并能综合运用本科阶段所学软、硬件知识分析实际问题,提高解决毕业设计实际问题的能力,为单片机应用和开发打下良好的基础。
1、对字符液晶显示模块的工作原理,如初始化、清屏、显示、调用及外特性有较清楚的认识,并会使用LCD(液晶显示模块)实现计算结果的显示;掌握液晶显示模块的驱动和编程,设计LCD和单片机的接口电路,以及利用单片机对液晶显示模块的驱动和操作;
2、在充分分析内部逻辑的概念,进行软件和调试,学会使用,并能够以其为平台设计出具有四则运算能力简易计算器的硬件电路和软件程序。
1.2设计目的
通过本次毕业设计,运用《智能化测量控制仪表原理与设计》、《MCS-51系列单片微型计算机及其应用》所学知识及查阅相关资料,完成简易计算器的设计,达到理论知识与实践更好结合、提高综合运用所学知识和设计能力的目的。
通过本次设计训练,可以使我们在基本思路和基本方法上对基于MCS-51单片机的嵌入式系统设计有一个比较感性的认识,并具备一定程度的设计能力。
2总体方案设计
2.1电源模块
由于本系统采用电池供电,我们考虑了如下几种方案为系统供电。
方案1:
采用4.5V蓄电池为系统供电。
蓄电池具有较强的电流驱动能力以及稳定的电压输出性能。
但是蓄电池的体积过于庞大,在使用极为不方便。
因此我们放弃了此方案。
方案2:
采用3节1.5V干电池共4.5V做电源,经过7805的电压变换后为单片机,传感器供电。
经过实验验证系统工作时,单片机、传感器的工作电压稳定能够满足系统的要求,而且电池更换方便。
综上所述采用方案2
2.2主控制器模块
方案1:
采用可编程逻辑器件CPLD作为控制器。
CPLD可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进行功能扩展。
采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模控制系统的控制核心。
但本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高。
且从使用及经济的角度考虑我们放弃了此方案。
方案2:
采用STC89C52单片机作为整个系统的核心,用其控制密码锁控制,以实现其既定的性能指标。
充分分析我们的系统,其关键在于密码锁的控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。
这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。
STC89C52单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是STC89C52单片机价格非常低廉。
因此,这种方案是一种较为理想的方案。
从方便使用的角度考虑,我们选择了方案2。
3硬件实现及单元电路设计
3.1主控制模块
计算器的硬件电路主要由运算器,控制器,存储器,键盘,显示器,电源和一些外围设备及电子配件通过人工或机器设备组成。
该单片机以ct89c52为核心器件。
主控制最小系统电路如图3所示。
图4.1单片主控电路
3.2单片机的时钟电路与复位电路模块
本系统采用STC系统列单片机,相比其他系列单片机具有很多优点。
一般STC单片机资源比其他单片机要多,而且执行速度快;STC系列单片机使用串口对单片机进行烧写,下载程序较为方便;STC51单片机内部集成了看门狗电路;且具有很强抗干扰能力。
本系统采用内部方式的时钟电路和加电自复位的复位电路,如下图
图4.2.1时钟电路图4.2.2复位电路
由于单片机P0口内部不含上拉电阻,为高阻态,不能正常地输出高/低电平,因而该组I/O口在使用时必须外接上拉电阻。
3.3键盘电路设计
在单片机应用系统中,一般都会设置键盘,主要为了控制运行状态,输入一些命令或数据,以完成特定的人机交互。
键盘是与单片机进行人机交互的最基本的途径,其以按键的形式来设置控制功能或输入数据,按键的输入状态本质上是一个开关量。
对于简单的开关量的输入可以采用独立式按键,这种方法接口简单,但占用单片机I/O端口资源较多。
对于输入参数较多、功能复杂的系统,需要采用矩阵式键盘进行输入控制。
本系统采用4*4矩阵式键盘,键盘连接方式如图5所示:
图4.4键盘电路
3.4液晶显示电路设计
液晶显示器(LCD)是一种功耗很低的显示器,它的使用非常广泛,比如电子表、计算器、数码相机、计算机的显示器和液晶电视等。
电子密码锁中需要显示的信息比较多,为了能直观的看到结果,并且为了设计显的美观,使用总线和排阻进行简化连接方式,本设计采用液晶显示屏LCD进行显示,具体连接方式如图6所示。
、
图4.5液晶显示电路
4系统软件设计方案
4.1主程序流图
如图10为主程序流程图
图4.1主程序流程图
4.2运算程序设计
STC89C52单片机是一块芯片中集成了CPU、RAM、ROM、定时器、计数器、和多功能I/O等一台计算器所需要的基本功能部分。
如果按功能划分,它由如下功能部分组成,即微处理器(CPU)、数据处理器(RAM)、程序处理器(ROM/CPROM)、并行I/O口、串行口、定时器、计数器、中断系统及特殊功能寄存器(SFR)。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊一些功能,通过使用单片机编写的程序可以凸显高智能、高效率以及高可靠性!
因此我们采用单片机作为计算器的主要功能部件,可以很快实现运算功能。
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用到很多的I/O资源,因此在很多情况下都不采用这种方式(如图11)。
但因为实体资源有限不得已而为之,但不会影响其功能。
图4.2运算程序
5系统的安装
5.1安装步骤
1.检查元件的好坏
按电路图买好元件后首先检查买回元件的好坏,按各元件的检测方法分别进行检测,一定要仔细认真。
而且要认真核对原理图是否一致,在检查好后才可上件、焊件,防止出现错误焊件后不便改正。
2.放置、焊接各元件
按原理图的位置放置各元件,在放置过程中要先放置、焊接较低的元件,后焊较高的和要求较高的元件。
特别是容易损坏的元件要后焊,在焊集成芯片时连续焊接时间不要超过10s,注意芯片的安装方向。
总结
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。
回顾起此次单片机课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,可以说得是苦多于甜,但是可以学到很多很多的的东西。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
通过这次课程设计使我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。
使我们在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧(特别是汇编语言)的掌握方面都能向前迈了一大步,为日后成为合格的应用型人才打下良好的基础。
致谢
毕业设计已经接近了尾声,这也意味着我的大学生活就要结束了,学生活一晃而过,回首走过的岁月,心中倍感充实,当我写完这篇毕业论文的时候,有一种如释重负的感觉,感慨良多。
首先,我要特别感谢我的指导老师李翠凤和叶华杰。
做设计的过程是艰辛的,但是在我的努力之下还是完成了。
在这个过程中张强老师给了我很大的的帮助,没有他的尽心指导和严格的要求,我也不会顺利完成这次设计。
每次遇到难题,我最先做的就是向张老师寻求帮助,而张老师每次不管忙或闲,总会抽空来找我面谈,然后一起商量解决的办法。
张老师平日里工作繁多,但我做毕业设计的每个阶段,从选题到查阅资料,论文提纲的确定,中期论文的修改,后期论文格式调整等各个环节中都给予了我悉心的指导。
这几个月以来,张老师不仅在学业上给我以精心指导,同时还在思想给我以无微不至的关怀,在此谨向张老师致以诚挚的谢意和崇高的敬意。
其次,还要感谢这四年来教我知识的每位老师们,毕业论文能够顺利完成,你们也都有很大的功劳。
最后,要向这四年大学生活期间所有帮助过我的同学们以及各位朋友们说一声谢谢。
这次的毕业设计,对于培养我们理论联系实际的设计思想;训练综合运用机械设计和有关先修课程的理论,结合生产实际反系和解决工程实际问题的能力;巩固、加深和扩展有关机械设计方面的知识等方面有重要的作用。
写作毕业论文是一次再系统学习的过程,毕业论文的完成,同样也意味着新、生活的开始。
希望大家在将来的生活中继续追逐最初的梦想,永不放弃。
参考文献
[1]王千.实用电子电路大全[M].电子工业出版社,2004,28-36
[2]彭为.单片机典型系统设计实例精讲[M].电子工业出版社,2006,69-88
[3]张荣.基于单片机的智能系统设计与实现[M].电子工业出版社,2005,35-38
[4]朱勇.单片机原理与应用技术[M].清华大学出版社,2006,14-16
[5]潘永雄.新编单片机原理与应用[M].西安电子科技大学出版社,2003,78-86
附录1整机电路原理图
附录2部分源程序
#include
#include
#include
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitbatt=P3^5;
floatnum1;//保存第一个数
floatnum2;//保存第二个数
ucharjjcc;//加减乘除标志变量
ucharidataLcd_Str[17];//显示区缓存
ucharidataNum_str[17];
ucharLcd_num2_add=0;//第二个数据开始位的增量
ucharLcd_dis1_i=0;//记录显示第一行字符
ucharLcd_num1_i=0;//记录num1是几位数
ucharLcd_num2_i=0;//记录num2是几位数
ucharDian_i=0;//小数点位数
/******************************************
函数名称:
delayms;
函数功能:
延时z毫秒;
形参:
z(延时时间参数)
*******************************************/
voiddelayms(ucharz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
ucharKey_io;//暂存IO值
ucharKey_jl;//松手检测自锁变量
ucharKey_value;//返回键值
ucharKey_D_bit;
ucharsaom(void)
{
Key_value=18;
P2=0xf0;//拉低第四位
Key_io=P2;
if(Key_io!
=0xf0)//查看搞四位是否有低电平
{
Key_io|=0x0f;//保持高四位出现低电平的管脚,拉高第四位
P2=Key_io;//重新复制IO口
Key_io=P2;//读取IO信息,确定键值
if(Key_jl==0)//自锁变量,松手检测
{
Key_jl=1;
switch(Key_io)
{
case0x7e:
Key_value=1;
break;
case0x7d:
Key_value=2;
break;
case0x7b:
Key_value=3;
break;
case0x77:
Key_value=12;
break;
case0xbe:
Key_value=4;
break;
case0xbd:
Key_value=5;
break;
case0xbb:
Key_value=6;
break;
case0xb7:
Key_value=13;
break;
case0xde:
Key_value=7;
break;
case0xdd:
Key_value=8;
break;
case0xdb:
Key_value=9;
break;
case0xd7:
Key_value=14;
break;
case0xee:
Key_value=10;
break;
case0xed:
Key_value=0;
break;
case0xeb:
Key_value=11;
break;
case0xe7:
Key_value=15;
break;
}
}
}
else
{
Key_jl=0;
}
Key_io=P3;//独立按键扫描
Key_io&=0xc0;
if(Key_io!
=0xc0)
{
if(Key_D_bit==0)
{
Key_D_bit=1;
switch(Key_io)
{
case0x80:
Key_value=16;break;
case0x40:
Key_value=17;break;
}
}
}
else
{
Key_D_bit=0;
}
returnKey_value;
}
ucharXS_JG(ucharadd,floatn)
{
ucharlen,p=0;
memset(Lcd_Str,0,16);
sprintf(Lcd_Str,"%e",n);
while(Lcd_Str[p]!
='e')
{
p++;
}
if(Lcd_Str[p+2]==0x30&&Lcd_Str[p+3]<0x37)
{
sprintf(Lcd_Str,"%f",n);
len=strlen(Lcd_Str);
while(len)
{
if(Lcd_Str[len-1]=='.')
{
Lcd_Str[len-1]=0;
break;
}
if(Lcd_Str[len-1]=='0')//去除数据中多余的0与小数点
{
Lcd_Str[len-1]=0;
}
else
{
break;
}
len--;
}
}
else
{
while(p)
{
if(Lcd_Str[p-1]=='.')
{
Lcd_Str[p-1]='';
break;
}
if(Lcd_Str[p-1]=='0')//去除数据中多余的0与小数点
{
Lcd_Str[p-1]='';
}
else
{
break;
}
p--;
}
}
Dis_str(add,"");
Dis_str(add,Lcd_Str);
returnlen;
}
voidfuhao(uchars)
{
if(jjcc<5)
{
if(Num_str[0]!
='A')
{
if(Num_str[0]<=0x39&&Num_str[0]>=0x30&&jjcc!
=2)
{
num1=atof(Num_str);//从数组中取第二个数字
//XS_JG(0x8a,num1);
}
}
if(jjcc==0)
{
Num_str[Lcd_dis1_i]=s;
Lcd_dis1_i++;
Lcd_num2_add=Lcd_dis1_i;
}
else
{
if(Num_str[Lcd_num2_add]==0)
Num_str[Lcd_dis1_i-1]=s;
}
Dis_str(0x80,Num_str);
}
if(jjcc==5)
{
Lcd_dis1_i=4;
Lcd_num2_i=0;
Lcd_num2_add=4;
memset(Num_str,0,16);
Num_str[0]='A';
Num_str[1]='n';
Num_str[2]='s';
Num_str[3]=s;
Dis_str(0x80,"");
Dis_str(0x80,Num_str);
}
}
voidmain(void)
{
ucharnum_key1;
init_1602();
write_1602dat('0');
memset(Num_str,0,16);
while
(1)
{
num_key1=saom();//读按键值
delayms(10);
if(num_key1<18)//是否有按键按下,小于16时有按键按下
{
batt=0;delayms(30);batt=1;
switch(num_key1)
{
case11:
if(Num_str[Lcd_num2_add]<=0x39&&Num_str[Lcd_num2_add]>=0x30)
num2=atof(Num_str+Lcd_num2_add);//从数组中取第二个数字
else
break;
Lcd_num2_i=0;
//XS_JG(0x8a,num2);
switch(jjcc)
{
case1:
num1+=num2;//加
break;
case2:
num1-=num2;//减
break;
case3:
num1*=num2;//乘
break;
case4:
num1/=num2;//除
break;
}
XS_JG(0xc0,num1);
Dis_str(0x80+Lcd_dis1_i,"=");
jjcc=5;//等号标志
break;
case12:
if(Num_str[0]==0||Lcd_num2_i>0)
break;
fuhao('+');
jjcc=1;Dian_i=0;
break;//按下加号键
case13:
if(Num_str[0]==0||Lcd_num2_i>0)
break;
fuhao('-');
jjcc=2;Dian_i=0;
break;//按下减号键
case14:
if(Num_str[0]==0||Lcd_num2_i>0)
break;
fuhao('*');
jjcc=3;Dian_i=0;
break;//按下乘号键
case15:
if(Num_str[0]==0||Lcd_num2_i>0)
break;
fuhao('/');
jjcc=4;Dian_i=0;
break;//按下除号键
case10:
if(Dian_i==0&&(Lcd_num1_i!
=0||Lcd_num2_i!
=0))//输入小数点时前面必须有数字
{
Dian_i++;//小数点
Num_str[Lcd_dis1_i]='.';
Lcd_dis1_i++;
Dis_str(0x80,Num_str);
}
break;
case