电子计算器课程设计样本_第1页
电子计算器课程设计样本_第2页
电子计算器课程设计样本_第3页
电子计算器课程设计样本_第4页
电子计算器课程设计样本_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

目录TOC\o"1-2"\h\z\u1设计任务和性能指标 11.1设计任务 11.2性能指标 12设计方案 12.1需求分析 12.2方案论证 13系统硬件设计 23.1总体框图设计 23.2单片机选型 23.3单片机附属电路设计 33.4LCD液晶显示 44系统软件设计 44.1设计思路 44.2总体流程图 44.3子程序设计 54.4总程序清单 65仿真与调试 65.1调试环节 65.2仿真成果及性能分析 86总结 8参照文献 8附录1系统硬件电路图 10附录2程序清单 111设计任务和性能指标1.1设计任务电子计算器设计1、能实现4位整数加减法和2位整数乘法;2、成果通过5个LED数码管显示(4位整数加法会有进位)或通过液晶显示屏显示。1.2性能指标1.用数字键盘输入4位整数,通过LED数码显示管或液晶显示屏显示。2.完毕四位数加减法应算。当四位数想加时产生进位时,显示进位。3.显示2位,并进行2位整数乘法。4.设计4*4矩阵键盘输入线连接。2设计方案2.1需求分析咱们寻常生活开支,大额数字或是多倍小数计算都需要计算器协助,解决数字开方、正余弦都离不开计算器。虽然当前计算器价格比较低廉,但是功能过于简朴不能满足个人需求,功能多价格较贵,操作不便不说,诸多功能主线用不到。因此,咱们想到可不可以用自己所学为自己设计开发一种属于自己简朴计算器来完毕寻常生活需求。2.2方案论证使用单片机为ATMEL公司生产AT89C51,AT89C51提供如下原则功能:4K字节FLASH闪速存储器,128字节内部RAM,32个I/O口线,两个16位定期/计数器,一种向量两级中断构造,一种全双工串行通讯口,内置一种精密比较器,片内振荡器及时钟电路,同步AT89C51可降至0Hz静态逻辑操作,并支持两种软件可选工作模式,空闲方式停止CPU工作,但容许RAM,定期计数器,串行通信及中断系统继续工作。显示用LCD液晶显示屏,减少线路连接。用C言编写程序,易进行调试修改。采用4*4矩阵键盘作为输入。3系统硬件设计3.1总体框图设计电路图如附录13.2单片机选型AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)低电压,高性能、CMOS、8位单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业原则MCS-51指令集和输出管脚相兼容。AT89C51管脚图如图2.2所示。图3-13.3单片机附属电路设计一、晶体振荡电路1.晶体振荡器作用石英晶体振荡器也称石英晶体谐振器,它用来稳定频率和选取频率,是一种可以取代LC谐振回路晶体谐振元件。2.本设计所用晶体振荡电路如图2.3所示:图3-2晶振电路此晶振电路所选用石英晶振频率为12MHZ。一、晶体振荡电路单片机复位条件是:必要使RST/Vpd或RST引脚加上持续两个机器周期(即24个振荡周期)高电平。图3-2复位电路该电路除具备上电复位功能外,若要复位,只需按图中BUTTON键,此时电源VCC经电阻R1、R2分压,在RESET端产生复位高电平。3.44*4矩阵键盘控制电路矩阵式键盘构造与工作原理:在键盘中按键数量较多时,为了减少I/O口占用,普通将按键排列成矩阵形式,其内部简图如图3-3在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一种按键加以连接。这样,只需要单片机一种端口(如P1口)就可以构成4*4=16个按键,比直接将端口线用于键盘多余了一倍,并且线数越多,区别越明显,例如再多加一条线就可以构成20键键盘,而直接用端口线则只能多余一键(9键)。由此可见,在需要键数比较多时,采用矩阵法来做键盘比较是合理。由于本系统按键较多,在这里采用矩阵式4*4键盘,这样可以合理应用硬件资源,用一种8位I/O口控制,如图3-3所示:图3-3按键内部电路简图矩阵式键盘按键辨认办法一、拟定矩阵式键盘上何键被按下,咱们采用一种“行扫描法”。行扫描法:行扫描法又称为逐行(或列)扫描查询法,是一种最惯用按键辨认办法。3.4LCD液晶显示1602LCD采用原则14脚(无背光)接口,各引脚接口阐明如表所示:编号符号引脚阐明编号符号引脚阐明1VSS电源地8D1数据2VDD电源正极9D2数据3VEE液晶显示偏压10D3数据4RS数据/命令选取11D4数据5RW读/写选取12D5数据6E使能信号13D6数据7D0数据14D7数据4系统软件设计4.1设计思路1.要有显示子程序,当键入一种数值或符号时显示程序要把这个键入值给显示出来。通过运算在按下等号之后显示出本次运算成果。2.就是按键程序,当一种键盘按下时候,按键程序要判断是哪个按键按下,如果是数字键按下就要转向显示子程序来显示出这个数字,然后等待下一种键值输入,再次判断按下是什么键,如果是功能键就要依照上次功能键和输入数据来计算成果,然后保存成果和功能键,成果送显示缓冲区显示。等待下个数值输入,如此重复。4.2总体流程图开始开始初始化数据据LCD显示有键输入读键值键码是?数字键清零键功能键输入值状态清零数值送显示缓存根基功能键和输入数据计算成果保存成果成果送显示缓存等待数值输入4.3子程序设计1.读和写数据子程序voidwrite_com(charcom)//写指令函数{P0=com;//com指令付给P0口rs=0;rw=0;lcden=0;check();lcden=1;}voidwrite_date(chardate)//写数据函数{P0=date;rs=1;rw=0;lcden=0;check();lcden=1;}4.4总程序清单见附录25仿真与调试5.1调试环节1.采用KEIL开发89c51单片机应用程序调试环节:(1)在uVision集成开发环境中创立新项目(Project),扩展文献名为.UV2,并为该项目选定适当单片机CPU器件(本设计采用ATMEL公司下AT89C51)(2)用uVision文本编辑器编写源文献,可以是汇编文献(.ASM),也可以使C语言文献(扩展名.C),并将该文献添加到项目中去。一种项目文献可以包括各种文献,除了源程序文献外,还可以是库文献、头文献或文本阐明文献。(3)通过uVision2有关选取项,配备编译环境、连接定位器以及Debug调试器功能。(4)对项目中源文献进行编译连接,生成绝对目的代码和可选HEX文献,如果浮现编译连接错误则返回到第2步,修改源文献中错误后重构整个项目。图5-1Keil调试2用Proteus对于本设计仿真操作环节如下:(1)进入proteusISIS集成环境,在工作前,在systerm菜单下设立界面颜色、图形界面大小等项目,也可采用了系统默认值。

(2)通过工具栏中(从库中选取元件命令)命令,在pickdevices窗口中选取电路所需元件,放置元件到编辑区并调节其相对位置,进行元件参数设立,元器件间连线。(3)连线并加上设立参数,并完毕仿真原理图,如图5-2所示。(4)加载程序。将编译调试完毕简易计算器机器码程序(hex文献)加载到AT89C51单片机中。(5)单击仿真工具栏中仿真键,观测仿真成果。可以按暂停、继续、单步、等按钮,查看效果。图5-2操作阐明:1)本计算器实现4位数加减,2位数乘除运算。2)按下数值键,显示按下“数字”,按运算符,显示符号,按第2个操作数,显示,按“=”键,得到运算成果。3)按“清零”键清除运算成果,可重新开始。(6)调试与思考5.2仿真成果及性能分析6总结通过这段时间设计,终于完毕了我计算器设计,虽然只是一种非常简朴计算器,可是我也通过了一翻很大努力才完全达到设计规定,从心底里说,还是挺高兴,毕竟这次设计所规定东西都做了出来,然而高兴之余不得不深思呀!在本次设计过程中,我发现诸多问题,虽然此前还做过这样设计但这次设计真让我长进了诸多,单片机设计重点就在于软件程序设计,需要有很巧妙编程办法,在编程时,由于粗心大意马虎,有些语句看似没问题,可就是不出效果,经仔细揣摩修改后,程序才正常运营。学习单机片机更是如此,程序只有在经常写与读过程中才干提高。从这次课程设计中,我真真正正意识到,在后来学习中,要理论联系实际,把咱们所学理论知识用到实际当中,理论指引实践,在实践中对理论知识加以理解。还要有独立思考能力和团队协作精神,个人能力固然重要,集体力量更是伟大。由于时间比较仓促,我所设计这个计算器非常简朴,咱们可以考虑在以日后改进一下,使它功能更加完善,强大。参照文献[1]刘和平,刘跃,单片机原理及应用,重庆:重庆大学出版社,[2]杨西明,朱骐,单片机编程与入门,北京:机械工业出版社,[3]陈明荧,89C51单片机课程设计实训教材,北京:北京清华大学出版社,[4]刘瑞新,单片机原理及应用教程,北京:机械工业出版社,[5楼然苗,李光飞,51系列单片机设计实例,北京:北京航空航天大学出版社,附录1系统硬件电路图附录2程序清单#include<reg51.h>//头文献#defineuintunsignedint//#defineucharunsignedcharsbitlcden=P2^3;//定义引脚sbitrs=P2^4;sbitrw=P2^0;sbitbusy=P0^7;chari,j,temp,num,num_1;inta,b,c;//a,第一种数b,第二个数c,得数floata_c,b_c;ucharflag,fuhao;//flag表达与否有符号键按下,fuhao表征按下是哪个符号ucharcodetable[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0};ucharcodetable1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30};voiddelay(ucharz)//延迟函数{uchary;for(z;z>0;z--)for(y=0;y<100;y++);}voidcheck()//判断忙或空闲{do{P0=0xFF;rs=0;//指令rw=1;//读lcden=0;//禁止读写delay(1);//等待,液晶显示屏解决数据lcden=1;//容许读写}while(busy==1);//判断与否为空闲,1为忙,0为空闲}voidwrite_com(charcom)//写指令函数{P0=com;//com指令付给P0口rs=0;rw=0;lcden=0;check();lcden=1;}voidwrite_date(chardate)//写数据函数{P0=date;rs=1;rw=0;lcden=0;check();lcden=1;}voidinit()//初始化{num=-1;lcden=1;//使能信号为高电平write_com(0x38);//8位,2行write_com(0x0c);//显示开,光标关,不闪烁*/write_com(0x06);//增量方式不移位显竟獗暌贫柚?write_com(0x80);//检测忙信号write_com(0x01);//显示开,光标关,不闪烁num_1=0;i=0;j=0;a=0;//第一种参加运算数b=0;//第二个参加运算数c=0;flag=0;//flag表达与否有符号键按下,fuhao=0;//fuhao表征按下是哪个符号}voidkeyscan()//键盘扫描程序{P3=0xfe;if(P3!=0xfe){delay(20);if(P3!=0xfe){temp=P3&0xf0;switch(temp){case0xe0:num=0;break;case0xd0:num=1;break;case0xb0:num=2;break;case0x70:num=3;break;}}while(P3!=0xfe);if(num==0||num==1||num==2)//如果按下是'7','8'或'9{if(j!=0){write_com(0x01);j=0;}if(flag==0)//没有按过符号键{ do{a=a*10+table[num]; } while(a>10000);}else//如果按过符号键 { do{ b=b*10+table[num];} while(b>10000); }}else//如果按下是'/'{if(a<100) {flag=1;fuhao=4; }; //4表达除号已按}i=table1[num];write_date(0x30+i);}P3=0xfd;if(P3!=0xfd){delay(5);if(P3!=0xfd){temp=P3&0xf0;switch(temp){case0xe0:num=4;break;case0xd0:num=5;break;case0xb0:num=6;break;case0x70:num=7;break;}}while(P3!=0xfd);if(num==4||num==5||num==6&&num!=7)//如果按下是'4','5'或'6'{if(j!=0){write_com(0x01);j=0;}if(flag==0)//没有按过符号键{ do {a=a*10+table[num];} while(a>10000); }else//如果按过符号键{do {b=b*10+table[num]; } while(B>10000);}}else//如果按下是'*'{if(a<100){flag=1;fuhao=3; }//3表达乘号已按}i=table1[num];write_date(0x30+i);}P3=0xfb;if(P3!=0xfb){delay(5);if(P3!=0xfb){temp=P3&0xf0;switch(temp){case0xe0:num=8;break;case0xd0:num=9;break;case0xb0:num=10;break;case0x70:num=11;break;}}while(P3!=0xfb);if(num==8||num==9||num==10)//如果按下是'1','2'或'3'{if(j!=0){write_com(0x01);j=0;}if(flag==0)//没有按过符号键{ do {a=a*10+table[num];} while(a>10000); }else//如果按过符号键{ do {b=b*10+table[num];} while(b>10000);}}elseif(num==11)//如果按下是'-'{flag=1;fuhao=2;//2表达减号已按}i=table1[num];write_date(0x30+i);}P3=0xf7;if(P3!=0xf7){delay(5);if(P3!=0xf7){temp=P3&0xf0;switch(temp){case0xe0:num=12;break;case0xd0:num=13;break;case0xb0:num=14;break;case0x70:num=15;break;}}while(P3!=0xf7);switch(num){case12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下是"清零"break;case13:{//按下是"0"if(flag==0)//没有按过符号键{a=a*10;write_date(0x30);P1=0;}elseif(flag==1)//如果按过符号键{b=b*10;write_date(0x30);}}break;case14:{j=1;if(fuhao==1){write_com(0x80+0x4f);//按下等于键,光标迈进至第二行最后一种显示处write_com(0x04);//设立从后住前写数据,每写完一种数据,光标后退一格c=a+b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);//再写"="a=0;b=0;flag=0;fuhao=0;}elseif(fuhao==2){write_com(0x80+0x4f);//光标迈进至第二行最后一种显示处write_com(0x04);//设立从后住前写数据,每写完一种数据,光标后退一格(这个照理说顺序不对,可显示和上段同样)if(a-b>0)c=a-b;elsec=b-a;while(c!=0){write_date(0x30+c%10);c=c/10;}if(a-b<0)write_date(0x2d);write_date(0x3d);//再写"="

温馨提示

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

评论

0/150

提交评论