单片机课程设计报告-设计十进制加减乘法计算器.doc_第1页
单片机课程设计报告-设计十进制加减乘法计算器.doc_第2页
单片机课程设计报告-设计十进制加减乘法计算器.doc_第3页
单片机课程设计报告-设计十进制加减乘法计算器.doc_第4页
单片机课程设计报告-设计十进制加减乘法计算器.doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

任务书一 课程设计题目及任务要求设计十进制加减乘法计算器,要求能显示三位输入和四位输出。二 设计思路1.操作显示设备显示设备采用八片七段共阴极LED显示器,共设置16个键,其中数字键0-9共十个,接下来依次是加号键,减号键,乘号键,除号键,清除键,操作设备是4*4的矩阵键盘。 2程序实现功能(1)十进制加减乘除计算:输入范围为1-999,改程序输入两个定点数,每个3位,输出四位,A为加,B为减,C为等于,输出为四位计算结果。(2)计算机复位功能:DEC均为清零重启,任何时候按下DEC中一个将重新开始。 绪论 现时学习或生活中,常会遇到一些数目较大数据,繁杂的数据运算,徒手运算起来很困难,这时候我们就必须用到计算器。人们对计算器的要求不断提高,现在,已经有一些功能较为强大,涵盖面较广的计算软件,而且各种平台的小工具仍不断出现,这些大大方便了我们的生活给我们更多的悬着和实现方式,本程序实现了加,减,乘,除的功能,但是,每次只能运算一个表达式,按DEC清空后再计算下一组式子。 方案论证方案一:采用计算器专用芯片实现。用计算器专用芯片进行设计并编程实现。这种设计方案计算效率高、速度快、而且成本也相对较低,是厂家做计算器的最佳方案。但是本人对计算器专用芯片掌握的不够,还不足以实现设计计算器,所以这个方案不可去。方案二:用单片机实现。由于单片机集成了运算器电路、控制电路、存储器、中断系统、定时器/计数器以及输入/输出口电路等,所以用单片机设计控制电路省去了很多分立元器件。由于单片机是可编程芯片,并且它可以运用C语言编写,对于一些复杂的计算功能,可以调用C语言库函数。使编写程序变得非常简单。所以该课题用单片机实现,不仅功能易于实现,而且精确度高,稳定性好,抗干扰能力强。并且由于其成本低、体积小、技术成熟和功耗小等优点,且技术比较成熟。性价比也相当高。更重要的是本人经过几年的学习,对单片机已有深刻的理解,并且可以灵活运用。 方案说明按照系统设计的功能的要求,初步确定设计系统由主控模块、显示模块、错误报警模块、键扫描接口电路共四个模块组成,电路系统构成框图如图1.1所示。主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。键盘电路采用4*4矩阵键盘电路。显示模块采用2枚四位一体共阴极数码管和74ls273锁存芯片构成等器件构成。 系统硬件设计1单片机最小系统单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。主控芯片选取STC89C52RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。晶振选取11.0592MHz,晶振旁电容选取30pF。采用按键复位电路,电阻分别选取100和10K,电容选取10F。.2键盘接口电路 计算器所需按键有: 数字键:1,2,3,4,5,6,7,8,9,0 功能键:+, - , *, / , = , C( 清零)共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P3.0P3.7,这样扫描P1口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P3口德扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘的功能。.3数码管显示电路 采用4位数码管对计算数据和结果的显示,这里选取共阳数码管,利用NPN三极管对数码管进行驱动,为了节省I/O资源,采取动态显示的方法来显示计算数据及结果。 利用74273锁存器来实现数码管的动态显示,P0口输出显示值,P2.4为段选口,控制273锁存器的时钟引脚,从而得到对数码管输入数据的控制。P2.0P2.3用来作为位选端,控制哪几位数码管进行显示。 系统软件设计要进行数据的计算就必须先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对键盘进行扫描,从而确定究竟是哪个键按下。以下为键盘扫描子程序的程序清单void dujian() uchar i=0,temp; P3=0xf0; if(P3!=0xf0) delay(10); if(P3!=0xf0) temp=0xfe; for(i=0;i4;i+) P3=temp; switch(P3&0xf0) case 0xe0: k=0+i*4; break; case 0xd0: k=1+i*4; break; case 0xb0: k=2+i*4; break; case 0x70: k=3+i*4; break; default : break; temp=temp1|0x01; switch(k) case 0: num2flag_wei=0; break; case 1: num2flag_wei=1; break; case 2: num2flag_wei=2; break; case 3: num2flag_wei=3; break; case 4: num2flag_wei=4; break; case 5: num2flag_wei=5; break; case 6: num2flag_wei=6; break; case 7: num2flag_wei=7; break; case 8: num2flag_wei=8; break; case 9: num2flag_wei=9; break; case 10: flag_fuhao=1; / + switch(flag_wei) case 1: shu1=num20; break; case 2: shu1=num20*10+num21; break; case 3: shu1=num20*100+num21*10+num22; break; default : break; for(i=0;i8;i+) num2i=0; flag_wei=-1; j=0; break; case 11: flag_fuhao=2; / - switch(flag_wei) case 1: shu1=num20; break; case 2: shu1=num20*10+num21; break; case 3: shu1=num20*100+num21*10+num22; break; default : break; for(i=0;i8;i+) num2i=0; flag_wei=-1; j=0; break; case 12: flag_fuhao=3; / * switch(flag_wei) case 1: shu1=num20; break; case 2: shu1=num20*10+num21; break; case 3: shu1=num20*100+num21*10+num22; break; default : break; for(i=0;i8;i+) num2i=0; flag_wei=-1; j=0; break; case 13: flag_fuhao=4; / / switch(flag_wei) case 1: shu1=num20; break; case 2: shu1=num20*10+num21; break; case 3: shu1=num20*100+num21*10+num22; break; default : break; for(i=0;i8;i+) num2i=0; flag_wei=-1; j=0; break; case 14: switch(flag_wei) case 1: shu2=num20; break; case 2: shu2=num20*10+num21; break; case 3: shu2=num20*100+num21*10+num22; break; default : break; switch(flag_fuhao) case 1: jieguo= shu1+shu2; break; case 2: jieguo= shu1-shu2; break; case 3: jieguo= (ulong)shu1*shu2; break; case 4: jieguo= (ulong)shu1/shu2; break; default : break; if(jieguo10) flag=1; num20=jieguo; if(jieguo=10) flag=2; num20=jieguo/10; num21=jieguo%10; if(jieguo=100) flag=3; num20=jieguo/100; num21=jieguo%100/10; num22=jieguo%100%10; if(jieguo=1000) flag=4; num20=jieguo/1000; num21=jieguo%1000/100; num22=jieguo%1000%100/10; num23=jieguo%1000%100%10; if(jieguo=10000) flag=5; num20=jieguo/10000; num21=jieguo%10000/1000; num22=jieguo%10000%1000/100; num23=jieguo%10000%1000%100/10; num24=jieguo%10000%1000%100%10; if(jieguo=100000) flag=6; num20=jieguo/100000; num21=jieguo%100000/10000; num22=jieguo%100000%10000/1000; num23=jieguo%100000%10000%1000/100; num24=jieguo%100000%10000%1000%100/10; num25=jieguo%100000%10000%1000%100%10; j=0; break; case 15: flag=0;flag_wei=-1;shu1=0;shu2=0;jieguo=0;j=0; break; default : break; flag_wei+; if(flag_wei3) flag_wei=3; if(k=14) flag_wei=flag; P3=0xf0; while(P3!=0xf0); 以下为显示程序设计void T_() interrupt 1 TH0=-3000/256; TL0=-3000%256; if(j=flag_wei) j=0; if(flag_wei=0) P1=0xfe;P2=zixing0; else P1=zimaj;P2=zixingnum2j; j+;调试 在焊接好器件后,先不要将芯片插在芯片座上,要先验证先板上电源是否好用,有无短路等。接上USB电源,用万用表测量个芯片座对应电源和地之间的电压值,观察电压值是否正常。一切正常后方可将芯片插入芯片座,以继续测试其他功能。 将芯片插上后,对各个模块进行调试,按键是否工作正常,数码管是否显示正常等。编写相关部分的测试程序对其进行测试。 各部分硬件检测无误后,下载程序进行整体调试,一切正常后,结束调试过程。 技术小结 这次做课程设计感觉自己挺没经验的,又做了不少乌龙事件,写程序和做仿真的时候用的是共阳极的数码管,后来买元器件的时候,粗心大意买了两个四位一体共阴极的数码管,没办法,只得重新修改程序和仿真,按照自己的想法修改好之后,程序就是无法编译,老是看见target not created 这几个单词,纠结了两天,后来想到到百度上查一下原因,大致上是因为我使用的keil没有破解成功,最后我把自己的keil给卸载了,安装了keil2,才编译成功。 自认为用了十分的心思把实物焊接好之后,以为能一次成功的,哪知道数码管就是不亮,真是急人,后来在老师的建议下分模块检查,先写了一个很简单的程序进51芯片,发现芯片根本没工作,怀疑是晶振的问题,把晶振拆了下来,发现晶振根本没有问题,最后,经同学提醒说可能是短路了,那万用表检查发现真的是短路了,正负电源不下心焊短路了,自己又修整了一番,接上电源,下载好程序,结果就出来了。 这次课程设计,有一个很大的失误,焊接数码管的时候没想过用排针插,结果将其中的一个数码管的两个段选给焊烧了,很遗憾啊,不是很完美。 参考文献(1)谭浩强 C程序设计 清华大学出版社(2)戴佳 51单片机C语言应用程序设计实例精讲 电子工业出版社(3) 李陪金 C语言程序设计案例教程 西安电子科技大学出版社(4) 郭天祥 51单片机C语言教程 电子工业出版社 附录 完整的程序#include #include #define uchar unsigned char /宏定义#define uint unsigned int#define ulong unsigned longuchar k=20,j=0; / k是键号,j用于数码管显示时uint shu1=0,shu2=0;ulong jieguo=0;char flag_wei=0; /输入位数标志uchar flag_fuhao=0,flag=0; / flag_fuhao是运算标志;flag是运算结果位数uchar num28=0; /存输入数据二uchar code zixing=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/段选uchar code zima=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/位选void delay(uchar t)/延时函数 uchar i,jj; for(i=0;it;i+) for(jj=0;jj200;jj+);void dujian() uchar i=0,temp; P3=0xf0; if(P3!=0xf0) delay(10);/去抖动 if(P3!=0xf0) temp=0xfe;/第一行 for(i=0;i4;i+) ;/共四列 P3=temp; switch(P3&0xf0) case 0xe0: k=0+i*4; break; case 0xd0: k=1+i*4; break; case 0xb0: k=2+i*4; break; case 0x70: k=3+i*4; break; default : break; temp=temp1|0x01; / 改变P3口的值 switch(k) case 0: num2flag_wei=0; break; case 1: num2flag_wei=1; break; case 2: num2flag_wei=2; break; case 3: num2flag_wei=3; break; case 4: num2flag_wei=4; break; case 5: num2flag_wei=5; break; case 6: num2flag_wei=6; break; case 7: num2flag_wei=7; break; case 8: num2flag_wei=8; break; case 9: num2flag_wei=9; break; case 10: flag_fuhao=1; / + switch(flag_wei) case 1: shu1=num20; break; case 2: shu1=num20*10+num21; break; case 3: shu1=num20*100+num21*10+num22; break; default : break; for(i=0;i8;i+) 按下运算键“+”回到初始状态 num2i=0; flag_wei=-1; j=0; break; case 11: flag_fuhao=2; / - switch(flag_wei) case 1: shu1=num20; break; case 2: shu1=num20*10+num21; break; case 3: shu1=num20*100+num21*10+num22; break; default : break; for(i=0;i8;i+) num2i=0; flag_wei=-1; j=0; break; case 12: flag_fuhao=3; / * switch(flag_wei) case 1: shu1=num20; break; case 2: shu1=num20*10+num21; break; case 3: shu1=num20*100+num21*10+num22; break; default : break; for(i=0;i8;i+) num2i=0; flag_wei=-1; j=0; break; case 13: flag_fuhao=4; / / switch(flag_wei) case 1: shu1=num20; break; case 2: shu1=num20*10+num21; break; case 3: shu1=num20*100+num21*10+num22; break; default : break; for(i=0;i8;i+) num2i=0; flag_wei=-1; j=0; break; case 14: switch(flag_wei) /等于 case 1: shu2=num20;/定义输入的数2 break; case 2: shu2=num20*10+num21; break; case 3: shu2=num20*100+num21*10+num22; break; default : break; switch(flag_fuhao) case 1: jieguo= shu1+shu2; break; case 2: jieguo= shu1-shu2; break; case 3: jieguo= (ulong)shu1*shu2; break; case 4: jieguo= (ulong)shu1/shu2; break; default : break; if(jieguo10) flag=1;/结果为一位 num20=jieguo; if(jieguo=10) flag=2;/结果为两位 num20=jieguo/10; num21=jieguo%10; if(jieguo=100) flag=3;/结果为三位 num20=jieguo/100; num21=jieguo%100/10; num22=jieguo%100%10; if(jieguo=1000) flag=4;/结果为四位 num20=jieguo/1000; num21=jieguo%1000/100; num22=jieguo%1000%100/10; num23=jieguo%1000%100%10; if(jieguo=10000) flag=5;/结果为五位 num20=jieguo/10000; num

温馨提示

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

评论

0/150

提交评论