创新课程设计曹斌_第1页
创新课程设计曹斌_第2页
创新课程设计曹斌_第3页
创新课程设计曹斌_第4页
创新课程设计曹斌_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、十进制加减乘除法计算器院 系:电子与电气工程学院专 业:电子信息工程班 级:099411姓 名:曹斌学 号:094109006指导老师:薛晓一、设计要求以52系列单片机为核心实现一个简易计算器,设计十进制加减乘除法计算器。要求能不同时显示3位输入和4位输出。二、设计目的要求计算器能实现加减乘除四种运算,具体如下:1、加法:整数加法2、减法:整数减法3、乘法:多位整数乘法4、除法:整数除法5、有去除功能6、在原有要求上扩展多位输入和输出,超出值显示乱码三、设计方案论证按照系统设计的功能的要求,初步确定设计系统由主控模块、监测模块、显示模块、键扫描接口电路共四个模块组成,主控芯片使用51系列STC

2、89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。监测模块采用三极管和蜂鸣器组成电路。键盘电路采用4*4矩阵键盘电路。显示模块采用4枚共阴极数码管和74ls138、74LS47芯片构成等器件构成。整个单片机的接口电路:P0(30)用于数码管段选显示输出;P2用于键扫描输入;P0(6.4)用于数码管位选控制;P07用于监测模块;单片机最小系统单片机最小系统就是支持主芯片正常工作的最小电路局部,包括主控芯片、复位电路和晶振电路。主控芯片选取STC89C52RC芯片,因其具有良好的性能及

3、稳定性,价格廉价应用方便。晶振选取11.0592MHz,晶振旁电容选取20pF。采用按键复位电路,电阻分别选取100和10K,电容选取10F。以下为单片机最小系统硬件电路图。2021-11-17 12:37 上传下载附件(38.67 KB)单片机最小系统硬件电路键盘接口电路采用P2口对键盘进行控制,行列式键盘这里主要用反转扫描法进行检测。原理图如下:2021-11-17 12:38 上传下载附件(92.56 KB)数码管显示电路采用8位数码管对计算数据和结果的显示实验时只用到了4位,这里选取共阴数码管,利用74LS138和74LS47对数码管进行驱动。P0.6P0.4用来作为位选端,控制哪几位

4、数码管进行显示。 P0.3P0.0控制数码管数字进行显示。以下为数码显示电路的硬件电路图2021-11-17 12:38 上传下载附件(97.03 KB)监视电路监视电路就是在按键时,发出声音提醒,以确保输入数字有效。这里就采用5V蜂鸣器作为示音设备。用p0.7口输出信号。以下为报警电路硬件电路图2021-11-17 12:38 上传下载附件(25.23 KB)1键盘扫描函数键盘电路采用4*4矩阵键盘电路。采用扫描法对键盘进行扫描,对P2口的扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘扫描的功能。unsigned char key_scan(void)unsigned ch

5、ar row,col=0,k=0xff;KEYIO=0xf0;if(KEYIO&0xf0)=0xf0)return k;delay(10);if(KEYIO&0xf0)=0xf0)return k;for(row=0;row<4;row+)KEYIO=(1<<row);k=KEYIO&0xf0;if(k!=0xf0)while(k&(1<<(col+4)col+;k=row*4+col;KEYIO=0xf0;P0&=0x7f;while(KEYIO&0xf0)!=0xf0);break;return k;键盘调用程序

6、:调用键盘扫描程序,读取按键的值。实现各个键的加减乘除的功能,采用switch功能进行读取。unsigned char key_vect(unsigned char keyValue)unsigned char nKey;switch(keyValue)case 0:nKey=7; break;case 1: nKey=8; break;case 2: nKey=9; break;case 3: nKey=ADD;break; case 4: nKey=4; break;case 5: nKey=5; break;case 6: nKey=6; break;case 7: nKey=SUB;

7、break; case 8: nKey=1; break;case 9: nKey=2; break;case 10: nKey=3; break;case 11: nKey=MUL; break; case 12: nKey=0; break;case 13: nKey=CLR;break; case 14: nKey=EQU; break;case 15: nKey=DIV;break; default : nKey=ERROR;return nKey;2数码管显示函数采用4位数码管对计算数据和结果的显示,这里选取共阴数码管,利用74LS47和74LS138芯片对数码管进行驱动。P0.6P

8、3.4用来作为位选端,控制哪几位数码管进行显示。比方当P0.6P0.4为0时,其他位全给1。此时就将扫描的数据送给指定数码管显示。void Led_display(unsigned char wei,unsigned char duan)duan&=0x0f;wei&=0x07;P0=(7-wei)<<4)|duan|0x80; 3监测模块函数采用三极管和蜂鸣器组成,利用P0.7进行控制,当P0.7端口为低电平时,此时计算结果出现问题,并报警。/蜂鸣器初始化函数void sys_init()P0|=0x80;4主程序框图2021-11-17 12:37 上传下载附件

9、(17.27 KB)程序流程5调试步骤在焊接好器件后,先不要将芯片插在芯片座上,要先验证先板上电源是否好用,有无短路等。接上电源,用万用表测量个芯片座对应电源和地之间的电压值,观察电压值是否正常。一切正常前方可将芯片插入芯片座,以继续测试其他功能。将芯片插上后,对各个模块进行调试,按键是否工作正常,数码管是否显示正常等。编写相关局部的测试程序对其进行测试。各局部硬件检测无误后,下载程序进行整体调试,一切正常后,结束调试过程。在具体调试时首先遇到的问题是程序无法下载进入单片机,通过将电路板接线与原理电路图接线的比照发现,串口芯片与单片机连接的输入,输出接反,重新用铜线连接后,依然无法下载程序。后

10、找到原因是由于下载串口与设计封装不符,用相对应的下载线可以下载。成功下载程序后,发现数码管显示不正确,查看后发现有先没有连接,可能是制板时漏印,连接后显示正常。四、设计结果与分析对程序进行调试,经计算机仿真分析,结果说明本程序根本实现了其功能。当输入3位数字相加减乘除时,能够实现4位输出。例如“138+456=594,由硬仿件真结果可得出结果。具体见图;2021-11-17 12:37 上传下载附件(109.35 KB)2021-11-17 12:37 上传下载附件(100.48 KB)2021-11-17 12:37 上传下载附件(130.05 KB)五、心得体会通过本次课程设计我完成了对给

11、定要求系统的硬件设计、电路设计、电路板设计、软件设计以及对成品的调试过程。从整个过程中学习到了很多方面的知识,了解到以往学习中自己知识在某方面的缺乏之处,是对以往学习科目的一种贯穿和承接,从而能更好的认识和学习,也对将来从事工作大有裨益。本次实验过程中,我真正体验到了,认真对待每一个细小零件的重要性。对于实验室提供的零件要具有检错能力。实验中换取了4个键盘,最后才得到正确的结果显示。此外从本次试验中我学会到了,焊接电路布局的重要性,以及在布线时,对线路的长度要有一定的冗余,以提供纠错方便。还有最重要的一点是,要学会使用万用表对电路进行检测,查出问题。从本次课设中我也看到了自身的很多缺乏之处,对

12、知识的掌握不够扎实,有一知半解的现象。有时做事不够稳定,过于毛躁,不能平心静气的去分析所遇到的问题和错误。这在以后的工作和生活中是不可取的,通过对自身问题的认识与改正相信再遇到同样问题时会更好的解决。以后的设计实验也会更好的完成。而且我也意识到了团队合作的重要性,五人为一组的分配让我们学会了如何分配各自的工作,让我们减少了很多的时间,每一步都有每一个人去做,这样,每个人都能够从中收获不同的只是,而且,还能交换各自的收获心得,让我们的知识以及走向社会工作中有了对团队合作的全新认识。以后,做实验一定要认真对待,用心去做。参考文献1 李群芳,黄建. 单片机微型计算机与接口技术. 北京:电子工业出版社

13、,20012 徐维祥、刘旭敏. 单片微型机原理及应用. 大连:大连理工大学出版社,19963 李光飞、楼然苗、胡佳文、谢象佐. 单片机课程设计与实例指导. 北京:北京航空航天大学出版社,2004 4 周国运. 单片机原理及应用C语言版.中国水利水电出版社,2021年2月第一版附录:1、先输入一个+运算,接着输入一个减运算符,结果将运行哪个,加还是减,怎样实现的?-王东宾答复:case EQU:NumberFormat(1);switch(MathWay)case 1:resValue=fstValue+secValue;break;case 2:resValue=fstValue-secVal

14、ue;break;case 3:resValue=fstValue*secValue;break;case 4:resValue=fstValue/secValue;break;程序的流程,不管按几次,只默认是最后一次的符号有效。2、74LS138和74LS47是怎么对数码管进行驱动的.张玉崇答复:138和47都是译码器,138通过对输入端A/B/C输入的电平进行译码输出端输出相应的电平,然后对数码管的位选进行控制。47也是通过输入端端口输入的电平进行译码,但他是4个输入端口A/B/C/D,对其输入的数字转换为相应的二进制编码,然后输出端输出对应于数码管的段选端的控制电平!3、如何实现数码管的

15、位选自动选择,如2*5=10,原来是1位的,如何最终变成两位的?-卢春林答复:位选的选择是通过P0(3.0)口控制的。原来一位变成两位的时候将之前的数乘10,然后数码管往左移一位显示高位,然后第二个数码管再显示地位,以此类推。下面是原计算程序:fstValue=0; FormatLoop=nValideLed;for(;FormatLoop>0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)>0;tmp1-)tmp*=10; /高位乘10fstValue+=keyValueForma

16、tLoop-1*tmp; /高位乘10后相加4、如果除法有余数时怎么处理-任小丽答复:这是硬件的一个缺点,因为数码管不能够显示小数点位,所以在处理计算小数点的过程时,舍弃掉了小数点位,只保存整数。case EQU:NumberFormat(1);switch(MathWay)case 1:resValue=fstValue+secValue;break;case 2:resValue=fstValue-secValue;break;case 3:resValue=fstValue*secValue;break;case 4:resValue=fstValue/secValue; /除法brea

17、k;如果要处理余数的话,可在后面求余除法resValue=fstValue%secValue;5、计算处理子程序的设计思路-朱阿松答复:void NumberFormat(unsigned char bSec)if(bSec)secValue=0;FormatLoop=nValideLed;for(;FormatLoop>0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)>0;tmp1-)tmp*=10; secValue+=keyValueFormatLoop-1*tmp; els

18、efstValue=0; FormatLoop=nValideLed; /获取按键获取的次数for(;FormatLoop>0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)>0;tmp1-) /按键次数进行循环*10的次数tmp*=10; fstValue+=keyValueFormatLoop-1*tmp; /将获取的值进行组合相加首先从按键获取第一个数值显示,然后当输入第二个数值时,将第一个数值存入一个数组缓存起来,存入keyValue里面,然后乘于10在加上获取的第二个数值,

19、然后组合起来送入fstValue,最后得到最后的数值。最后再将获取的第一个输入的数值和第二个输入数值进行加、减、乘、除运算。 case EQU:NumberFormat(1);switch(MathWay)case 1:resValue=fstValue+secValue; /加法运算break;case 2:resValue=fstValue-secValue; /减法运算break;case 3:resValue=fstValue*secValue; /乘法运算break;case 4:resValue=fstValue/secValue; /除法运算break;resFormat();b

20、reak; 然后主程序调用void main(void)sys_init();for(;) Calculate();DisplayLoop=nValideLed;if(DisplayLoop=0)Led_display(0,0);elsefor(;DisplayLoop>0;DisplayLoop-)Led_display(DisplayLoop-1,keyValueDisplayLoop-1);/将缓存的数值赋给数码管的段选delay(5); 6、请问你们的设计计算器的优缺点是什么?-王坡答复:优点是可以实现任意位的计算输入和输出。缺点是不能算小数。7、如果我要计算的是100*100得

21、到的结果怎么显示?-董艳波答复:按照原先题目要求和设计发现,结果超值,显示错误。这如果要设计计算器的话太不方便。经改正之后,可以显示其100*100的值,。为10000.8、如果输入的数字是负数怎么处理-周丹阳答复:按要求是没有负数的,但如果想要用到负数的话,可以用按键进行判断。可以在unsigned char key_vect(unsigned char keyValue)函数加个case语句,然后在void Calculate(void)函数里加个IF语句进行判断,如:IF/所按的键/加个符号;,但由于硬件限制,数码管不能显示符号,所以不能用到。9、程序能不能实现两个数相加之后数值直接显示

22、,然后自动保存,再乘或除运算之后显示结果?-袁一方答复:我们设计的程序不可以实现,程序只可进行一步运算,但可以把结果作为第一个输入的值继续进行运算,也就是说多步运算只能一步一步来。10、是否可以实现两个整数相减而得到负数?-黄文淑答复:不可以实现,本程序会显示乱码。程序代码:unsigned char key_scan(void);unsigned char key_vect(unsigned char keyValue);voidsys_init();#include "common.h"#include "sys_init.h"voidsys_ini

23、t()P0|=0x80;#include "reg52.h"#define ADD21#define SUB 22#define MUL 23#define DIV 24#define CLR 25#define EQU 26#define ERROR 27void delay(unsigned char z);#include "common.h"void delay(unsigned char z)unsigned char x,y;for(x=50;x>0;x-)for(y=z;y>0;y-);voidLed_display(unsig

24、ned char wei,unsigned char duan);#include "common.h"#include "display.h"voidLed_display(unsigned char wei,unsigned char duan)duan&=0x0f;wei&=0x07;P0=(7-wei)<<4)|duan|0x80;void Calculate(void);voidNumberFormat(unsigned char bSec);voidresFormat(void);#include "co

25、mmon.h"#include "key.h"#define KEYIO P2unsigned char key_scan(void)unsigned char row,col=0,k=0xff;KEYIO=0xf0;if(KEYIO&0xf0)=0xf0)return k;delay(10);if(KEYIO&0xf0)=0xf0)return k;for(row=0;row<4;row+)KEYIO=(1<<row);k=KEYIO&0xf0;if(k!=0xf0)while(k&(1<<(col+

26、4)col+;k=row*4+col;KEYIO=0xf0;P0&=0x7f;while(KEYIO&0xf0)!=0xf0);break;return k;unsigned char key_vect(unsigned char keyValue)unsigned char nKey;switch(keyValue)case 0:nKey=7; break;case 1:nKey=8;break;case 2:nKey=9;break;case 3:nKey=ADD;break;case 4:nKey=4;break;case 5:nKey=5;break;case 6:nK

27、ey=6;break;case 7:nKey=SUB;break;case 8:nKey=1;break;case 9:nKey=2;break;case 10:nKey=3;break;case 11:nKey=MUL;break; case 12:nKey=0;break;case 13:nKey=CLR;break;case 14:nKey=EQU;break;case 15:nKey=DIV;break;default: nKey=ERROR;returnnKey;#include "common.h"#include "calculate.h"

28、#include "key.h"#include "display.h"unsigned char nkey;signed char nValideLed=0,nLoop,FormatLoop,ResLoop;unsigned char keyValue8;unsigned long fstValue,secValue,resValue;unsigned char MathWay=0;voidNumberFormat(unsigned char bSec)if(bSec)secValue=0;FormatLoop=nValideLed;for(;Form

29、atLoop>0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)>0;tmp1-)tmp*=10;secValue+=keyValueFormatLoop-1*tmp;elsefstValue=0;FormatLoop=nValideLed;for(;FormatLoop>0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)>0;tmp1-)tmp*=10;fstValue+

30、=keyValueFormatLoop-1*tmp;voidresFormat(void)signed char reschar=7;for(;reschar>-1;reschar-)unsigned long tmp=1;signed char tmp1=reschar;for(;tmp1>0;tmp1-)tmp*=10;keyValuereschar=(unsigned char)(resValue/tmp);resValue-=keyValuereschar*tmp;for(nValideLed=8;nValideLed>0;nValideLed-)if(keyValuenValideLed-1!=0)break;void Calculate(void) nkey=key_vect(key_scan();if(nkey!=ERROR)if(nkey<10)nLoop=nValideLed;for(;nLoop>0;nLoop-)keyValuenLoop=keyValuenLoop-1;nValideLed+;ke

温馨提示

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

评论

0/150

提交评论