十进制加减乘除法计算器院系:电子与电气工程学院专业:电子信息工程班级:099411姓名:候亭亭学号:094109013指导老师:薛晓一、设计要求以52系列单片机为核心实现一个简易计算器,设计十进制加减乘除法计算器。
要求能(不同时)显示3位输入和4位输出。
二、设计目的要求计算器能实现加减乘除四种运算,具体如下:1、加法:整数加法2、减法:整数减法3、乘法:多位整数乘法4、除法:整数除法5、有清除功能6、在原有要求上扩展多位输入和输出,超出值显示乱码三、设计方案论证按照系统设计的功能的要求,初步确定设计系统由主控模块、监测模块、显示模块、键扫描接口电路共四个模块组成,主控芯片使用51系列STC89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。
它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。
监测模块采用三极管和蜂鸣器组成电路。
键盘电路采用4*4矩阵键盘电路。
显示模块采用4枚共阴极数码管和74ls138、74LS47芯片构成等器件构成。
整个单片机的接口电路:P0(3…0)用于数码管段选显示输出;P2用于键扫描输入;P0(6..4)用于数码管位选控制;P0(7)用于监测模块;单片机最小系统单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。
主控芯片选取STC89C52RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。
晶振选取11.0592MHz,晶振旁电容选取20pF。
采用按键复位电路,电阻分别选取100Ω和10K,电容选取10μF。
以下为单片机最小系统硬件电路图。
单片机最小系统硬件电路键盘接口电路采用P2口对键盘进行控制,行列式键盘这里主要用反转扫描法进行检测。
原理图如下:数码管显示电路采用8位数码管对计算数据和结果的显示(实验时只用到了4位),这里选取共阴数码管,利用74LS138和74LS47对数码管进行驱动。
P0.6~P0.4用来作为位选端,控制哪几位数码管进行显示。
P0.3~P0.0控制数码管数字进行显示。
以下为数码显示电路的硬件电路图监视电路监视电路就是在按键时,发出声音提醒,以确保输入数字有效。
这里就采用5V蜂鸣器作为示音设备。
用p0.7口输出信号。
以下为报警电路硬件电路图(1)键盘扫描函数键盘电路采用4*4矩阵键盘电路。
采用扫描法对键盘进行扫描,对P2口的扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘扫描的功能。
unsigned 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;{while(k&(1<<(col+4)))col++;k=row*4+col;KEYIO=0xf0;P0&=0x7f;while((KEYIO&0xf0)!=0xf0);break;}}return k;}键盘调用程序:调用键盘扫描程序,读取按键的值。
实现各个键的加减乘除的功能,采用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;nKey=ADD; break; case 4: nKey=4; break; case 5: nKey=5; break; case 6: nKey=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;nKey=CLR;break;case 14:nKey=EQU;break;case 15:nKey=DIV;break;default :nKey=ERROR;}return nKey;}(2)数码管显示函数采用4位数码管对计算数据和结果的显示,这里选取共阴数码管,利用74LS47和74LS138芯片对数码管进行驱动。
P0.6~P3.4用来作为位选端,控制哪几位数码管进行显示。
比如当P0.6~P0.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)主程序框图程序流程(5)调试步骤在焊接好器件后,先不要将芯片插在芯片座上,要先验证先板上电源是否好用,有无短路等。
接上电源,用万用表测量个芯片座对应电源和地之间的电压值,观察电压值是否正常。
一切正常后方可将芯片插入芯片座,以继续测试其他功能。
将芯片插上后,对各个模块进行调试,按键是否工作正常,数码管是否显示正常等。
编写相关部分的测试程序对其进行测试。
各部分硬件检测无误后,下载程序进行整体调试,一切正常后,结束调试过程。
在具体调试时首先遇到的问题是程序无法下载进入单片机,通过将电路板接线与原理电路图接线的对比发现,串口芯片与单片机连接的输入,输出接反,重新用铜线连接后,依然无法下载程序。
后找到原因是由于下载串口与设计封装不符,用相对应的下载线可以下载。
成功下载程序后,发现数码管显示不正确,查看后发现有先没有连接,可能是制板时漏印,连接后显示正常。
四、设计结果与分析对程序进行调试,经计算机仿真分析,结果表明本程序基本实现了其功能。
当输入3位数字相加减乘除时,能够实现4位输出。
例如“138+456=594”,由硬仿件真结果可得出结果。
具体见图;五、心得体会整个体会还是比较多的。
首先是题目的选择,各方面的原因,自己还是想选个简单点的题目,不过最后选来选去,还是选择了计算器。
由于自己对单片机编程可以,结果在设计的时候遇到了一系列问题,程序总是调试部处理,不过还好,最后在同学的帮助下终于把程序调试出来了,虽然程序设计实现的功能与老师要求的有所扩展,不过勉强还算可以。
从这里我知道了基本知识的重要性。
其实进行程序设计的时候主要是对各功能模块的把握。
计算器里面最难的一部分是矩阵键盘的扫描和编码,那个费了很大力气。
另外一点就是硬件焊接调试部分。
焊接的时候到时轻松,一个下午就焊接好了,然后是调试部分。
调试花费的时间还是比较长的。
不过有了上个学期数字电路焊接调试的经验,这次单片机调试还算是比较顺利。
我也是从电路板的正负电源检测起,一步一步来,最终得到了想要的结果。
调试的时候主要遇到了个问题。
一个是键盘总是没有反应,为了这个自己调试了很久,前前后后把电路板检查了几次,最后才发现是键盘本身的问题,和同学们换了个好键盘才行。
总的来说这次课程设计达到了完成了基本任务,达到了基本要求。
通过亲身对程序设计和电路焊接调试的体会,自己对单片机有了进一步的了解,单片机编程能力也得到了提高。
电路板的焊接与调试,使自己电路调试的方法和思想进一步加强了。
这次单片机课程设计应该说是比较成功的。
通过本次课程设计我真正的自己完成了对给定要求系统的硬件设计、电路设计、电路板设计、软件设计以及对成品的调试过程。
从本次课设中我也看到了自身的很多不足之处,对知识的掌握不够扎实,有一知半解的现象。
有时做事不够稳定,过于毛躁,不能平心静气的去分析所遇到的问题和错误。
这在以后的工作和生活中是不可取的,通过对自身问题的认识与改正相信再遇到同样问题时会更好的解决。
以后的设计实验也会更好的完成。
而且我也意识到了团队合作的重要性,五人为一组的分配让我们学会了如何分配各自的工作,让我们减少了很多的时间,每一步都有每一个人去做,这样,每个人都能够从中收获不同的只是,而且,还能交换各自的收获心得,让我们的知识以及走向社会工作中有了对团队合作的全新认识。
了解到以往学习中自己知识在某方面的不足之处,是对以往学习科目的一种贯穿和承接,从而能更好的认识和学习,也对将来从事工作大有裨益。
参考文献[1] 李群芳,黄建. 单片机微型计算机与接口技术. 北京:电子工业出版社,2001[2] 徐维祥、刘旭敏. 单片微型机原理及应用. 大连:大连理工大学出版社,1996[3] 李光飞、楼然苗、胡佳文、谢象佐. 单片机课程设计与实例指导. 北京:北京航空航天大学出版社,2004[4] 周国运. 单片机原理及应用(C语言版).中国水利水电出版社,2009年2月第一版附录:1、先输入一个+运算,接着输入一个减运算符,结果将运行哪个,加还是减,怎样实现的?---------——王东宾回答: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;程序的流程,不管按几次,只默认是最后一次的符号有效。
2、74LS138和74LS47是怎么对数码管进行驱动的.........张玉崇回答:138和47都是译码器,138通过对输入端A/B/C输入的电平进行译码输出端输出相应的电平,然后对数码管的位选进行控制。
47也是通过输入端端口输入的电平进行译码,但他是4个输入端口A/B/C/D,对其输入的数字转换为相应的二进制编码,然后输出端输出对应于数码管的段选端的控制电平!3、如何实现数码管的位选自动选择,如2*5=10,原来是1位的,如何最终变成两位的??--卢春林回答:位选的选择是通过P0(3..0)口控制的。