单片机4X4键盘计算器课程设计_第1页
单片机4X4键盘计算器课程设计_第2页
单片机4X4键盘计算器课程设计_第3页
单片机4X4键盘计算器课程设计_第4页
单片机4X4键盘计算器课程设计_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电气与电子信息工程学院单片机课设设计 《单片机课程设计报告》教学院:专业班级:学号:学生姓名:指导教师:时间:地点:单片机课程设计任务书一、课题名称单片机课程设计二、设计目的为了进一步巩固学习的理论知识,增强学生对所学知识的实际应用能力和运用所学的知识解决实际问题的能力,开始为期两周的单片机课程设计。通过实训使学生在巩固所学知识的基础之上具有初步的单片机系统设计与应用能力。三、设计内容设计基于51单片机的简易计算器系统电路,并以该电路为基础进行编程,要求能够实现0-99之间的数进行加、减、乘、除运算的功能。四、设计要求1、设计简易计算器,要求能对0-99之间的数进行加、减、乘、除运算。2、用4×4的键盘作为输入设备。3、用LED或LCD进行显示。4、编写无符号数加、减、乘、除运算、输入和显示的程序。5、对系统的进行综合和调试,使其具有对0-99之间的数进行加、减、乘、除运算的功能。6、编写课程设计的总结五、设计进度表序号设计内容所用时间1布置任务,学习简易计算器的工作原理以及硬件电路设计3天2完成键盘、显示和计算功能的程序设计3天3制作电路板1天4答辩、撰写设计报告书3天合计10天六、设计报告课程设计报告的基本内容至少包括封面、正文、附录三部分。课程设计报告要求统一格式,字体工整规范。1、封面封面包括“《单片机课程设计》课程设计报告”、班级、姓名、学号以及完成日期等。2、正文正文是实践设计报告的主体,具体由以下几部分组成:图44位数码管的动态显示(3)方案三:采用LCD1602液晶显示采用LCD1602液晶显示,其特点是:可以调节其背光亮度,这种显示方式接口,编程虽然有些麻烦,但管理较方便,占用的I/O口资源线也不多。3.2、方案比较与选择本设计中的显示模块使用的是LCD1602液晶显示。在计算器运算中,需显示的数字、符号较多,按很据个方面的特点,而后可以发现LCD液晶显示,虽然在价格上的确是稍贵于LED数码管;但数码管在硬件设计电路中,会因线太多、线路复杂而过于繁琐,则舍弃LED数码管,选择LCD液晶显示。通过对比,故采用方案三作为系统显示模块。三、整体方案原理框图1.1硬件与软件系统设计依据系统分析及实现功能,硬件小系统方框图如图1所示:单片机单片机振荡电路键盘输入液晶显示对比度调节复位电路图5依据系统硬件设计,软件系统主要包括:单片机控制程序模块:作为系统的主控制程序模块,用KeilC编程控制其他程序模块的协调工作;键盘程序模块:用来输入用户的功能,使单片机完成相应的控制功能;液晶显示模块:使用字符型液晶显示器显示用户的选择。1.2单片机模块单片机控制主程序流程图如下:开始开始初始化扫描键盘得键值显示定位显示结束图6单片机外围扩展电路程序模块 为了节约成本,本设计中液晶显示模块与单片机之间采用模拟口线的方式控制,键盘与单片机之间采用扫描的工作方式。键盘程序流程图(扫描方式)键盘程序流程图如下所示:开始开始有键按下?键盘消抖扫描键盘得键值存入累加器结束有键按下?YYNN图7LCM程序流程图如下所示:开开始LCD初始化LCD是否为忙?单片机向LCD写命令单片机向LCD写数据显示数据结束YN图8本设计的软件系统分别用伟福E6000和KeilC编写及编译。4*4键盘程序模块用汇编语言和C语言编写,实现直接从P2口扫描得到键盘码,并采用查询方式得到与之对应的LCD字型码,在LCD上显示出来。四、单元电路设计1.1键盘输入计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式。为此,我们引入了矩阵键盘的应用,采用四条I/O线作为行线,四条I/O线作为列线组成键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。矩阵键盘的工作原理:计算器的键盘布局如图5所示:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。/*/*-+CLC963=8520741图9键盘布局图图10矩阵键盘内部电路图键盘上的每一个按键都有一个键值。给键赋值的最直接办法是将行、列线按二进制顺序排列,当某一键按下时,键盘扫描程序执行到给该列置低电平0,若读出各行状态为非全1,这时的行、列数据组合成键值。键盘键值从左到右、从上到下依次是77,7B,7D,7E;B7,BB,BD,BE,…,E7,EB,ED,EE。这种负逻辑表示往往不够直观,因而采用行、列线加反向器或软件求反的方法将键盘改成正逻辑。这时,键值依次为88,84,82,81;48,44,42,41,…,18,14,12,11。不论是正逻辑还是负逻辑,这种键值表示方式分散度在且不等距,用于指令不太方便。对于不是4*4或8*4或8*8键盘,使用也不容易,故在许多场合下,采用依次排列键值的方法。这时的键值与键号相一致。1.2单片机控制MCS-51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能。图11单片机控制电路的时钟电路和复位电路LCD1602显示图12LCD1602显示 1602点阵字符液晶模块(LCM)引脚及功能 1脚(VDD/VSS):电源5V±10%或接地。 2脚(VSS/VDD):接地或电源(5±0.5)V。 3脚(VO):反视度调整。使用可变电阻调整,通常接地。 4脚(RS):寄存器选择(1:选择数据寄存器;0:选择指令寄存器)。 5脚(R/W):读/写选择(1:读;0:写)。 6脚(E):使能操作(1:LCM可做读写操作;0:LCM不可做读写操作)。 7脚(DB0):双向数据总线的第0位。 8脚(DB1):双向数据总线的第1位。 9脚(DB2):双向数据总线的第2位。 10脚(DB3):双向数据总线的第3位。 11脚(DB4):双向数据总线的第4位。 12脚(DB5):双向数据总线的第5位。 13脚(DB6):双向数据总线的第6位。 14脚(DB7):双向数据总线的第7位。 15脚(VDD):背光显示器电源+5V。 16脚(VSS):背光显示器接地。五、实物效果图图13实物效果图六、心得体会两周的时间,终于顺利完成了单片机的课程设计。由于自己对单片机编程还不是很熟悉,结果在设计的时候遇到了一系列问题,程序总是调试部处理,不过还好,最后在同学的帮助下终于把程序调试出来了,虽然程序设计实现的功能与老师要求的不尽相同,不过勉强还算可以。从这里我知道了基本知识的重要性。其实进行程序设计的时候主要是对各功能模块的把握。计算器里面最难的一部分是矩阵键盘的扫描和编码,那个费了很大力气。另外一点就是硬件焊接调试部分。焊接的时候到时轻松,一个下午就焊接好了,然后是调试部分。调试花费的时间还是比较长的。不过有了上个学期数字电路焊接调试的经验,这次单片机调试还算是比较顺利。我也是从电路板的正负电源检测起,一步一步来,最终得到了想要的结果。调试的时候主要遇到了两个问题。一个是键盘总是没有反应,为了这个自己调试了很久,前前后后把电路板检查了几次,最后才发现是键盘本身的问题,和同学们换了个好键盘才行。另一个问题是总是显示不出来1、4、7这三个数字。检测来检测去,发现来是在测试最小系统时在一个位选端接了高电平,对位选信号产生了影响。当把那个高电平去掉后,终于得到了正确的结果。总的来说这次课程设计达到了完成了基本任务,达到了基本要求。通过亲身对程序设计和电路焊接调试的体会,自己对单片机有了进一步的了解,单片机编程能力也得到了提高。电路板的焊接与调试,使自己电路调试的方法和思想进一步加强了。这次单片机课程设计应该说是比较成功的。七、参考文献[1]李朝青.单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出版社,1998[2]李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994[3]阎石.数字电子技术基础(第三版).北京:高等教育出版社,1989[4]廖常初.现场总线概述[J].电工技术,1999.八、附录1.系统程序#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitrs=P1^0;sbitrw=P1^1;sbite=P1^2;voidwrite_dat(uchardat);voidwrite_com(ucharcom);voidkeyscan();/**********************功能说明:显示编码,加上0x30,分别为'1','2','3','+','4','5','6','-',等**********************/ucharcodetable1[]={1,2,3,0x2b-0x30,4,5,6,0x2d-0x30,7,8,9,0x2a-0x30,0,0x3d-0x30,0x01-0x30,0x2f-0x30};uchark=0,flag=0,num,fuhao,i;longa,b,c;voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidkeyscan(){uchartemp;P2=0xfe;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P2;temp=temp&0xf0;while(temp!=0xf0){temp=P2;switch(temp){case0xee:num=0;break;case0xde:num=1;break;case0xbe:num=2;break;case0x7e:num=3;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}/*当按下1,2,3,松手后执行下面这段语句*/if(num==0||num==1||num==2){if(flag==0)a=a*10+table1[num];//如果没有按符号键,符号前的数值为aelseif(flag==1)b=b*10+table1[num];//如果按了符号键,符号后的数值为bif(k==1)//如果之前按了'='号,再按键时清屏,进行下一次计算{k=0;write_com(0x01);}}elseif(num==3)//判断按下'+'{flag=1;fuhao=1;}i=table1[num];//显示按下的键write_dat(0x30+i);}P2=0xfd;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P2;temp=temp&0xf0;while(temp!=0xf0){temp=P2;switch(temp){case0xed:num=4;break;case0xdd:num=5;break;case0xbd:num=6;break;case0x7d:num=7;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}if(num==4||num==5||num==6)//判断是否按下'4','5','6'{if(k==1){k=0;write_com(0x01);}if(flag==0)a=a*10+table1[num];elseif(flag==1)b=b*10+table1[num];}elseif(num==7){flag=1;fuhao=2;}i=table1[num];//显示按下的键write_dat(0x30+i);}P2=0xfb;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P2;temp=temp&0xf0;while(temp!=0xf0){temp=P2;switch(temp)//{case0xeb:num=8;break;case0xdb:num=9;break;case0xbb:num=10;break;case0x7b:num=11;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}if(num==8||num==9||num==10)//判断是否按下'7','8','9'{if(k==1){k=0;write_com(0x01);}if(flag==0)a=a*10+table1[num];elseif(flag==1)b=b*10+table1[num];}elseif(num==11)//判断是否按下'*'{flag=1;fuhao=3;}i=table1[num];write_dat(0x30+i);}P2=0xf7;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P2;temp=temp&0xf0;while(temp!=0xf0){temp=P2;switch(temp){case0xe7:num=12;//0键break;case0xd7:num=13;//'='break;case0xb7:num=14;//清零键break;case0x77:num=15;//'/'break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}switch(num){case12:{if(k==1){k=0;write_com(0x01);}if(flag==0)a=a*10;elseif(flag==1)b=b*10;write_dat(0x30);}break;case13://按=键{k=1;if(fuhao==1)//如果符号键是+,执行+运算{write_com(0x80+0x4f);write_com(0x04);c=a+b;while(c!=0){write_dat(0x30+c%10);c=c/10;}write_dat(0x3d);fuhao=0;a=0;b=0;flag=0;}if(fuhao==2) //如果符号键是-,执行-运算{write_com(0x80+0x4f);write_com(0x04);if(a>=b){c=a-b;while(c!=0){write_dat(0x30+c%10);c=c/10;}}elseif(a<b){c=b-a;while(c!=0){write_dat(0x30+c%10);c=c/10;}write_dat(0x2d);}write_dat(0x3d);a=0;b=0;flag=0;fuhao=0;}if(fuhao==3)//如果符号键是*{write_com(0x80+0x4f);write_com(0x04);c=a*b;while(c!=0){write_dat(0x30+c%10);c=c/10;}write_dat(0x3d);a=0;b=0;flag=0;fuhao=0;}if(fuhao==4)//如果符号键是/{i=0;write_com(0x80+0x4f);write_com(0x04);c=(long)(((float)a/b)*1000000);//结果保留6位小数while(c!=0){write_dat(0x30+c%10);c=c/10;i++;if(i==6)//显示完六位小数后,显示·write_dat(0x2e);}if(a/b<=0)write_dat(0x30);write_dat(0x3d);a=0;b=0;flag=0;fuhao=0;}}break;case14:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}break;case15:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论