《2022年单片机设计简易计算器.pdf》由会员分享,可在线阅读,更多相关《2022年单片机设计简易计算器.pdf(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、简易计算器Simply Calculator 1 设计思想此计算器有键盘部分、单片机、显示部分三部分组成,键盘部分主要完成输入功能;单片机主要完成数据处理功能,包括确定按键,完成运算,以及输出数据;显示器部分主要完成单片机输出的显示。本设计的思路是利用单片机性能好,稳定性强的优点来实现系统的运行。设计大致可以分为三个步骤:第一步,硬件的选取和设计;第二步,程序的设计和调试;第三步, Protues 系统仿真。硬件是设计的骨骼,不仅关系到设计总体方向的确定,还要综合考虑节能,环保,以及稳定性和经济性等各种因素。因此需要花费大量的时间。硬件的选取最为重要,包括选用的芯片,显示设备的选取,输入设备的
2、选取等。本设计是通过单片机来实现的,因此选用了ATMEGA16单片机作为主体,输入设备选用矩阵键盘。程序是硬件的灵魂,是实现设计的中心环节。本设计使用的程序语言是 C语言,在“ ICC AVR ”中运行,调试,直到运行出正确结果,然后输出后缀名为 .HEX格式的文件,以备在Protues 中仿真使用。程序是设计的关键,程序的调试需要大量的时间,耐心,还够要有足的细心才能成功。本设计中就出现了大量的错误,经过认真修改,最终才能运行出正确结果。最后的系统仿真是设计是否成功的验证,是设计不可缺少的重要环节。这就要求能掌握 Protues 的一些基本操作。2 原理分析矩阵键盘的扫描M 1SW -P B
3、M2S W -P BM 3S W -P BM 4S W - PBM 5SW -P BM6S W -P BM 7S W -P BM 8S W - PBM 9SW -P BM10S W -P BM 1 1S W -P BM 1 2S W - PBM 13SW -P BM14S W -P BM 1 5S W -P BM 1 6S W - PBP D 0P D 1P D 2P D 3P D 4P D 5P D 6P D 7精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 22 页 - - - - - -
4、 - - - - 图 矩阵键盘图如图所示,单片机的8 个 I/O 口和矩阵键盘相连,用8 个 I/O 口来控制矩阵键盘的 16 个按键是非常有意思的,首先我们设置单片机的PD0 PD7为输出,且 PD0 PD3依次设置为低电平,而PD4 PD7设置为高电平,然后我们设置 PD4 PD7为输入,而 PD0 PD3仍然为输出,假如此时M1键按下,则PD0与 PD4相连,因为 PD0是低电平,而 PD4是输入,所以 PD4会被拉为低电平,同理,如果 M2被按下,则 PD5会被拉低, M3按下,PD6会被拉低, M4按下,PD7被拉低。这是判断有无键盘按下的过程,当我们判断是那一个键盘按下时,我们首先
5、设置8 个 I/O 口为输出,输出为FE,即,PD0为低电平,其他全为高电平,然后我们设置PD4 PD7为输入,如果 M1被按下,则 PD4会比被拉为低电平,此时会变成EE,同理可以知道M2被按下时会变为DE,M3被按下时会变为 BE,M4被按下时会变为7E。同理我们可以设置8 个 I/O 口输出 FD来检测 M5 M8是否被按下,设置8 个 I/O 口输出 FC来来检测 M9 M12,设置8 个 I/O 口输出 F7 来检测 M13 M16,如果 M1 M4没有被按下,就继续检测M4 M8,一次类推,就可以检测出16 个按键了。在这次设计中,16 个按键M1 M16所对应检测值分别为: EE
6、 ,DE ,BE ,7E,ED ,DD ,BD ,7D ,EB ,DB ,BB ,7B,E7,D7,B7,77。数字显示与计算本次设计选用的显示器是1602液晶显示器,此液晶显示器能显示32个字符,VSS 接地,VDD 接电源正极, E为时使能信号, R/W 为读写选择端( H/L) ,RS为数据 / 命令选择端( H/L),D0D7为数据 I/O 口。首先我们初始化液晶显示器,然后显示出第一个被按下的数,并且使光标右移,如果有第二个数按下,则据继续显示,以此类推,然后把所有显示出来的数换算成一个数,如果按下“+”号,则显示出“ +”,并且同理显示出“+”号后面按下的数字,然后调用加子程序,运
7、算出结果,如果按下的是“-”, 则调用减子程序,如果按下“*” ,则调用乘子程序,如果按下“/ ”,则调用除子程序。然后再调用显示结果子程序,显示出结果。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 2 页,共 22 页 - - - - - - - - - - 3 程序设计与说明流程图主程序流程图和运算子程序流程图为:图 主程序流程图图 运算子程序流开始显示Welcome是否按键按下是否是 +-*/是否是 =是否是 ce清屏显示数字显示+-*/计算结束是否是是否否否是开始是否是 +是否是是否是 *是否是
8、 /结束Result=c+dResule=c-dResule=c*dResule=c/d精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 3 页,共 22 页 - - - - - - - - - - 程图键盘扫描流程图为:开始延时 10msDDRD=0XFE是否按键按下PORTD=0XF0DDRD=0X0F是否是第一排按键DDRD=0XFDPORTD=0XF0DDRD=0X0FDDRD=0XFBPORTD=0XF0DDRD=0X0F是否是第三排按键DDRD=0XF7PORTD=0XF0DDRD=0X0F取当
9、前状态否是否是肯定是第四排按键精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 4 页,共 22 页 - - - - - - - - - - 图 键盘扫描子程序流程图程序说明本次设计采用模块化设计思想,包括主程序和初始化子程序、延时子程序、输出数据子程序、检测是否有按键按下子程序、确定按键子程序、清第二行屏与显示“ Welcome ”子程序、换算第一个数子程序、运算子程序、显示结果子程序等子程序。运行程序后,首先调用子程序清屏第二行并显示“Welcome ”,然后检测是否有按键按下,如果没有,继续检测,如果
10、按下,则判断是否是加减乘除键被按下,如果是加减乘除被按下,则显示相应的字符并换算出字符前输入的数据和字符后输入的数字,然后检测是否有等号按下,如果有则完成相应的运算并显示相应的结果,然后检测是否有清屏键按下,如果有则清屏,相应的流程图如图2 所示。其中运算子程序的流程图如图 3 所示。4 调试 Protues系统仿真打开 Protues ,按设计思想放相应的零部件并连好线,把HEX文件加载到单片机中运行,检测结果是否正确。硬件连线图如图所示。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 22
11、 页 - - - - - - - - - - 图 Protues 仿真图调式过程编写完程序后保存程序,在“ICC AVR ”中运行,调试,直到运行出正确结果,然后输出后缀名为.HEX 格式的文件。刚开始有错误,是一些语法规则上的错误,不过经过几次的修改,最终输出了后缀名为.HEX格式的文件。把 后 缀 名为 .HEX 格式 的文 件加 载到 单片机 后 ,刚开 始 只是显 示 出“Welcome ”的一部分字符,仔细观察发现,程序的前后空格不对称,经过修改,最终得到了预期结果,最终运行结果如图所示。5 总结优缺点分析本计算器能完成加减乘除运算,结构简单,硬件较少,成本较低,另外本程序采用模块化
12、设计思想,可读性强,具有很强的可移植性,便于调用。在处理多任务时,可以用中断服务来实现多线程,通过设置中断,启动中断服务子程序使其自己执行任务,而CPU可以做自己的工作,当有停止中断的请求产生时, CPU 再停下自己的工作做相应处理。但是也有很多不足之处。首先,程序有很多相同的代码,本来可以用调用的方法实现,减少代码长度,但是考虑到本程序不是很长,而且用调用的方法必然会增加算法的复杂度和逻辑思维强度,所以在这里没有采用!其次,精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 6 页,共 22 页 - - -
13、 - - - - - - - 为了节省空间,程序设计的注释部分不够详细,使读程序不是很方便。再次,本计算器不能完成小数运算,也不能完成科学计算器的一些功能,而要完成这些功能,需要设置更多的键盘,加更多的程序,比较复杂,因为我时间有限,在此不再处理。心得体会通过课程设计,我掌握了计算器的工作原理以及设计方法,我通过对计算器的几个模块的深入理解,我掌握了计算器的组成和制作过程,并通过自己的努力,制作出了自己的计算器,提高了我的动手能力和实践能力,同时我对单片机有了更深入的理解,也学会了使用单片机的方法, 加深了对课本知识的进一步理解。加强了我思考和解决问题的能力,认识来源于实践,实践是认识的动力和
14、最终目的,实践是检验真理的唯一标准!在设计过程中, 经常会遇到一些问题, 就是心里想老着这样的接法可以行得通,但实际接上电路,总是实现不了。所以这几天不管是吃饭还是睡觉,脑子里总是想着如何解决这些问题,功夫不负有心人,我通过认真思考,请教同学,查找资料 , 最后终于熟练掌握了基本理论知识,而且领悟诸多平时学习难以理解掌握的较难知识,学会了如何思考的思维方式,找到了设计的灵感。在寻找答案的过程中 , 我学到了很多平时缺少的东西,对于理论知识学习不够扎实的我深感“书到用时方恨少”!认真思考才能找到出路,当初没有思路,诚如举步维艰,茫茫大地,不见道路。在对理论知识梳理掌握之后,茅塞顿开,柳暗花明,思
15、路如泉涌,高歌“条条大路通罗马”。顿悟,没有思考便无出路,雨后才能见彩虹。失败是成功之母。不经历多次调试,是不可能得到完好的程序的。至善至美,是人类永恒的追求。但是,不从忘却“金无足赤,人无完人”,我们换种思维方式,去恶亦是至善,改错亦为至美。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 7 页,共 22 页 - - - - - - - - - - 实践课诚然是一门专业课, 给
16、我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门思辨课,给了我许多道,给了我很多思,给了我莫大的空间。至于建议,一言以蔽之,大学教育当如此。我是一个急性子的人,看到那么复杂知识,我就不想做了,不过为了搞好课程设计,我硬是耐心完成每一个细节,我坚持一天呆在实验室10 多个小时,虽然晚上眼睛比较酸痛,但是我感觉值。这么多天的努力没有白费,我最后很好的完成了任务 ,很有成就感!我相信我在以后的生活和学习中会更耐心,更认真的!参考文献:1 陈冬云等.ATmega 128单片机原理与开发指导 . 机械工业出版社 ,20062 李群芳等. 单片微型计算机及接口技术(第二版). 电子工业出版社
17、,20053 周航慈 . 单片机程序设计基础 . 北航出版社 ,20054 何立民 .MCS-51单片机应用系统设计 . 北航出版社, 20025 马潮 .高档 8 位单片机 ATmega128 原理与开发应用指南 . 北京航空航天大学出版社, 2004精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 8 页,共 22 页 - - - - - - - - - - 附录 程序#include #include #include const unsigned char tab1= Welcome ;const
18、unsigned char tab3=90+-*/= ;精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 9 页,共 22 页 - - - - - - - - - - unsigned char key10; unsigned int temp1=0,temp2=0; unsigned char count1 = 0; unsigned char wei;void delay(unsigned int ms) unsigned int i,j; for(i=0;ims;i+)for(j=0;j1141;j+
19、);void int_port() DDRA=0XFF; DDRB=DDRB|0X07; PORTB&=BIT(PB0); DDRD=0XFF; PORTD=0XFF; DDRD=0XF0; PORTD=PORTD&0X0F;精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 10 页,共 22 页 - - - - - - - - - - void com_lcd(unsigned char com) PORTB&=BIT(PB2); PORTB&=BIT(PB1); PORTA=com; PORTB|=BI
20、T(PB0); delay(1); PORTB&=BIT(PB0);void data_lcd(unsigned char data) PORTB|=BIT(PB2); PORTB&=BIT(PB1); PORTA=data; PORTB|=BIT(PB0); delay(1); PORTB&=BIT(PB0);unsigned char key_press()精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 11 页,共 22 页 - - - - - - - - - - unsigned char i;
21、DDRD=0XFF; PORTD=0XF0; DDRD=0X0F; i=PIND; if(i=0XF0) DDRD=0XFF;/ 没键按下 return 0; else DDRD=0XFF;/ 有键按下 return 1; unsigned char key_scan()/键检测精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 12 页,共 22 页 - - - - - - - - - - unsigned char key1,i=0X7F,j; delay(10); if(key_press() do i
22、=(i7); PORTD=i; DDRD=0X0F; key1=PIND; j=key1&0XF0; while(j=0XF0);while(key_press();switch(key1) case 0 xEE:key1=0 x0;break; case 0 xDE:key1=0 x1;break; 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 13 页,共 22 页 - - - - - - - - - - case 0 xBE:key1=0 x2;break; case 0 x7E:key1=0 x
23、3;break; case 0 xED:key1=0 x4;break; case 0 xDD:key1=0 x5;break; case 0 xBD:key1=0 x6;break; case 0 x7D:key1=0 x7;break; case 0 xEB:key1=0 x8;break;精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 14 页,共 22 页 - - - - - - - - - - case 0 xDB:key1=0 x9;break; case 0 xBB:key1=0 xA;br
24、eak; case 0 x7B:key1=0 xB;break; case 0 xE7:key1=0 xC;break; case 0 xD7:key1=0 xD;break; case 0 xB7:key1=0 xE;break; case 0 x77:key1=0 xF;break;精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 15 页,共 22 页 - - - - - - - - - - default: key1=16; else key1=16; return key1;void clear_
25、lcd()unsigned char i; com_lcd(0 x01); / 清屏 delay(1); com_lcd(0 x38);/5*7,2行显示 delay(1); com_lcd(0 x06);/文字不动,光标自动右移 delay(1); com_lcd(0 x0C);/开显示 delay(1); com_lcd(0 x81);/第一行首地址精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 16 页,共 22 页 - - - - - - - - - - delay(1); for (i=0;i1
26、6;i+) data_lcd(tab1i); delay(5);void clear_lcd_2() /清第二行 unsigned char i; com_lcd(0 xc0); delay(1);for (i=0;i16;i+) data_lcd(tab11); delay(1);unsigned int qushu(unsigned char m)/第一个数 unsigned char i; unsigned int num; unsigned int temp = 0; wei=m-1;/位数精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳
27、- - - - - - - - - -第 17 页,共 22 页 - - - - - - - - - - for (i=1;i=wei;i+) if(keyi=9) num=0; elsenum=keyi+1; temp=temp*10+num; return temp;unsigned int result(unsigned int c,unsigned int d)/运算子程序 unsigned int result2; unsigned char k; k=keywei+1; switch(k) case 0 x0a:result2=c+d; break; case 0 x0b:resu
28、lt2=c-d; break; case 0 x0c:result2=c*d; break; case 0 x0d:result2=c/d;精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 18 页,共 22 页 - - - - - - - - - - default: ; return result2;void disp_result(unsigned int result_num )/显示结果子程序 unsigned char aa=0; unsigned char i,c; unsigned int
29、n = result_num ; clear_lcd_2(); com_lcd(0 xc0); delay(1); data_lcd(tab314); com_lcd(0 x04); delay(1); com_lcd(0 xcf); delay(1); if(n=0)aa=1; while(n!=0) /计算结果长度 n=n/10; aa+;精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 19 页,共 22 页 - - - - - - - - - - for (i=1;i=aa;i+) c=result
30、_num%10; if(c=0) c=10; data_lcd(tab3c-1);/显示结果 delay(1); result_num=result_num/10; void main()unsigned char wei2,i; unsigned int result1 = 0; unsigned int num2; int_port(); clear_lcd(); asm(nop);while(1) if(key_press() count1+;keycount1=key_scan();精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - -
31、- - - - - - - -第 20 页,共 22 页 - - - - - - - - - - if(keycount1=0 x0a)|(keycount1=0 x0b)|(keycount1=0 x0c)|(keycount1=0 x0d)/当按下 +-*/ 时的处理 temp1=qushu(count1); data_lcd(tab3keycount1); else if(keycount1=0 x0e)/当按下=号时的处理 wei2=count1-wei-2; for (i=1;i=wei2;i+) if(keyi=9) num2=0; elsenum2=keyi+wei+1+1; t
32、emp2=temp2*10+num2; result1=result(temp1,temp2); disp_result(result1); count1=0; else if(keycount1=0 x0f)/当按下最后一个键清1602第二行com_lcd(0 x06);精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 21 页,共 22 页 - - - - - - - - - - delay(1);clear_lcd_2();count1=0;temp1=0;temp2=0;result1 = 0;elsecom_lcd(0 xc0+count1-1);delay(1);data_lcd(tab3keycount1);delay(1); 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 22 页,共 22 页 - - - - - - - - - -