单片机设计简易计算器_第1页
单片机设计简易计算器_第2页
单片机设计简易计算器_第3页
单片机设计简易计算器_第4页
单片机设计简易计算器_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、简易计算器Simply CaIcuIator1设计思想此计算器有键盘部分、单片机、显示部分三部分组成,键盘部分主要完成输入功能; 单片机主要完成数据处理功能,包括确定按键,完成运算,以及输出数据;显示器部分主 要完成单片机输出的显示。本设计的思路是利用单片机性能好,稳定性强的优点来实现系统的运行。设讣大致可 以分为三个步骤:第一步,硬件的选取和设计;第二步,程序的设计和调试;第三步,Protues 系统仿真。硬件是设计的骨骼,不仅关系到设计总体方向的确定,还要综合考虑节能,环保,以 及稳定性和经济性等各种因素。因此需要花费大量的时间。硬件的选取最为重要,包括选 用的芯片,显示设备的选取,输入设

2、备的选取等。本设计是通过单片机来实现的,因此选 用了 ATMEGA16单片机作为主体,输入设备选用矩阵键盘。程疗;是硬件的灵魂,是实现设 计的中心环节。本设计使用的程序语言是C语言,在“ICC AVR”中运行,调试,直到运 行出正确结果,然后输出后缀名为.HEX格式的文件,以备在Protues中仿真使用。程序是 设讣的关键,程序的调试需要大量的时间,耐心,还够要有足的细心才能成功。本设计中 就出现了大量的错误,经过认真修改,最终才能运行出正确结果。最后的系统仿真是设计 是否成功的验证,是设计不可缺少的重要环节。这就要求能掌握Protues的一些基本操作。 2原理分析2. 1矩阵键盘的扫描图2.

3、 1矩阵键盘图如图2. 1所示,单片机的8个I/O 口和矩阵键盘相连,用8个I/O 口来控制矩阵键 盘的16个按键是非常有意思的,首先我们设置单片机的PDOPD7为输出,且PDOPD3 依次设置为低电平,而PD4-PD7设置为高电平,然后我们设置PD4-PD7为输入,而 PDOPD3仍然为输出,假如此时Ml键按下,则PDO及PD4相连,因为PDO是低电平,而 PD4是输入,所以PD4会被拉为低电平,同理,如果H2被按下,则PD5会被拉低,M3按 下,PD6会被拉低,M4按下,PD7被拉低。这是判断有无键盘按下的过程,当我们判断是 那一个键盘按下时,我们首先设置8个I/O 口为输出,输出为FE,

4、即,PDO为低电平,其 他全为高电平,然后我们设置PD4-PD7为输入,如果Ml被按下,则PD4会比被拉为低电 平,此时会变成EE,同理可以知道M2被按下时会变为DE, M3被按下时会变为BE, M4被按下 时会变为7Eo同理我们可以设置8个I/O 口输出FD来检测M5M8是否被按下,设置8个 I/O 口输出FC来来检测M9M12,设置8个I/O 口输出F7来检测Ml3Ml6,如果MlM4没 有被按下,就继续检测M4-M8, 一次类推,就可以检测出16个按键了。在这次设计中,16 个按键 MlM16 所对应检测值分别为:EE, DE, BE, 7E, ED, DD, BD, 7D, EB, D

5、B, BB, 7B, E7, D7, B7, 77。2. 2数字显示及计算本次设计选用的显示器是1602液晶显示器,此液晶显示器能显示32个字符,VSS接 地,VDD接电源正极,E为时使能信号,R/W为读写选择端(H/L), RS为数据/命令选择端 (H/L ) , DOD7为数据I/O 口。首先我们初始化液晶显示器,然后显示出第一个被按下的数,并且使光标右移,如 果有第二个数按下,则据继续显示,以此类推,然后把所有显示出来的数换算成一个数, 如果按下“ + ”号,则显示出“ + ”,并且同理显示出“ + ”号后面按下的数字,然后调用 加子程序,运算出结果,如果按下的是,则调用减子程序,如果按

6、下“*”,则调用乘 子程序,如果按下“/”,则调用除子程序。然后再调用显示结果子程序,显示出结果。3程序设计及说明3. 1流程图主程序流程图和运算子程序流程图为:图3. 1主程序流程图图3.2运算子程序流程图键盘扫描流程图为:图3. 3键盘扫描子程序流程图3. 2程序说明本次设计采用模块化设计思想,包括主程序和初始化子程序、延时子程序、输出数 据子程序、检测是否有按键按下子程序、确定按键子程序、清第二行屏及显示“Welcomew 子程序、换算第一个数子程序、运算子程序、显示结果子程序等子程序。运行程序后,首 先调用子程序清屏第二行并显示“Welcome”,然后检测是否有按键按下,如果没有,继

7、续检测,如果按下,则判断是否是加减乘除键被按下,如果是加减乘除被按下,则显示相 应的字符并换算出字符前输入的数据和字符后输入的数字,然后检测是否有等号按下,如 果有则完成相应的运算并显示相应的结果,然后检测是否有清屏键按下,如果有则清屏, 相应的流程图如图2所示。其中运算子程序的流程图如图3所示。4调试4. 1 Protues系统仿真打开Protues,按设计思想放相应的零部件并连好线,把HEX文件加载到单片机中运 行,检测结果是否正确。硬件连线图如图4.1所示。3I 1312RTJJBGA16 cTEzThOS3;LCD1JD16LPCQKL PCI DAJTALIPC2WKXTALZpca

8、nroPCifTDOPAQ*ADCOPCSH-DIPAVADC1PCGT08C1POADCZPC7fT08CZP5DCZ3PA4/ADC4PD0RXDP/tffAPCSPP1HXPPA&ADC6PDznrraPAT/ADC?PDNiimPDEC 佃PBCyXCKHDPD5iX)C1APBOT1PD&CPPBIMTOAIMDPD?rt)C2pwocmmPBSW8IP临冋AWCP87iCKAREF迄 g-F 一卫一一迄力一 W1SHS图4. 1 Protues仿真图4. 2调式过程编写完程序后保存程序,在“ICCAVR”中运行,调试,直到运行出正确结果,然后输 出后缀名为.HEX格式的文件。刚开始

9、有错误,是一些语法规则上的错误,不过经过儿次的 修改,最终输出了后缀名为.HEX格式的文件。把后缀名为.HEX格式的文件加载到单片机后,刚开始只是显示出“ Welcome w的一部分 字符,仔细观察发现,程序的前后空格不对称,经过修改,最终得到了预期结果,最终运 行结果如图4.1所示。5总结5.1优缺点分析本计算器能完成加减乘除运算,结构简单,硬件较少,成本较低,列外本程序采用 模块化设计思想,可读性强,具有很强的可移植性,便于调用。在处理多任务时,可以用 中断服务来实现多线程,通过设置中断,启动中断服务子程序使其自己执行任务,而CPU 可以做自己的工作,当有停止中断的请求产生时,CPU再停下

10、自己的工作做相应处理。但是也有很多不足之处。首先,程序有很多相同的代码,本来可以用调用的方法实 现,减少代码长度,但是考虑到本程序不是很长,而且用调用的方法必然会增加算法的复 朵度和逻辑思维强度,所以在这里没有采用!其次,为了节省空间,程序设计的注释部分 不够详细,使读程序不是很方便。再次,本讣算器不能完成小数运算,也不能完成科学计 算器的一些功能,而要完成这些功能,需要设置更多的键盘,加更多的程序,比较复朵, 因为我时间有限,在此不再处理。5.2心得体会通过课程设计,我掌握了计算器的工作原理以及设计方法,我通过对计算器的儿个 模块的深入理解,我掌握了计算器的组成和制作过程,并通过自己的努力,

11、制作岀了自 己的计算器,提高了我的动手能力和实践能力,同时我对单片机有了更深入的理解,也 学会了使用单片机的方法,加深了对课本知识的进一步理解。加强了我思考和解决问题 的能力,认识来源于实践,实践是认识的动力和最终LI的,实践是检验真理的唯一标准!在设计过程中,经常会遇到一些问题,就是心里想老着这样的接法可以行得通,但实 际接上电路,总是实现不了。所以这儿天不管是吃饭还是睡觉,脑子里总是想着如何解决 这些问题,功夫不负有心人,我通过认真思考,请教同学,查找资料,最后终于熟练掌握 了基本理论知识,而且领悟诸多平时学习难以理解掌握的较难知识,学会了如何思考的思 维方式,找到了设计的灵感。在寻找答案

12、的过程中,我学到了很多平时缺少的东西,对于 理论知识学习不够扎实的我深感“书到用时方恨少”!认真思考才能找到出路,当初没有思路,诚如举步维艰,茫茫大地,不见道路。在对 理论知识梳理掌握之后,茅塞顿开,柳暗花明,思路如泉涌,高歌“条条大路通罗马”。 顿悟,没有思考便无出路,雨后才能见彩虹。失败是成功之母。不经历多次调试,是不可能得到完好的程序的。至善至美,是人类 永恒的追求。但是,不从忘却“金无足赤,人无完人”,我们换种思维方式,去恶亦是至 善,改错亦为至美。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断 获取。最终的调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。实践课诚

13、然是一门专业课,给我很多专业知识以及专业技能上的提升,同时乂是一门 讲道课,一门思辨课,给了我许多道,给了我很多思,给了我莫大的空间。至于建议,一 言以蔽之,大学教育当如此。我是一个急性子的人,看到那么复朵知识,我就不想做了,不过为了搞好课程设计,我硬是耐心完成每一个细节,我坚持一天呆在实验室10多个小时,虽然晚上眼睛比较酸 痛,但是我感觉值。这么多天的努力没有白费,我最后很好的完成了任务,很有成就感!我 相信我在以后的生活和学习中会更耐心,更认真的!参考文献:1 陈冬云等.ATmega 128单片机原理及开发指导.机械工业出版社,20062 李群芳等.单片微型计算机及接口技术(第二版).电子

14、工业出版社,20053 周航慈.单片机程序设计基础.北航出版社,20054 何立民.MCS-51单片机应用系统设计.北航出版社,20025 马潮.高档8位单片机ATmegal28原理及开发应用指南.北京航空航天大学出版社,2004附录程序include #include include const unsigned char tabl=/z Welcome “;const unsigned char tab3 =z/1234567890+-*/= unsigned char key10;unsigned int temp1=0, temp2=0;unsigned char count 1 =

15、0;unsigned char wei;void delay(unsigned int ms)unsigned int i,j;for(i=0;ims;i+)for(j=0;j1141;j+);void int_port()DDRA二OXFF;DDRB二DDRB 0X07;PORTB&=BIT(PBO);DDRD二OXFF;PORTD二OXFF;DDRD二OXFO;PORTD二PORTD&OXOF;void com_lcd(unsigned char com)P0RTB&=BIT(PB2);PORTB&BIT(PB1);PORTA二com;PORTBl二BIT(PBO);delay(l);PO

16、RTB&BIT(PBO);void data_lcd(unsigned char data)PORTBl二BIT (PB2);PORTB&BIT(PB1);PORTA二data;PORTBl二BIT(PBO);delay(l);PORTB&BIT(PBO);unsigned char key_press()unsigned char i:DDRD二OXFF;PORTD二OXFO;DDRD二OXOF;i二PIND;if(i=OXFO)DDRD二OXFF; /没键按下 return 0;elseDDRD二OXFF;/有键按下 return 1;unsigned char key_scan() /键

17、检测unsigned char keyl,i二0X7F, j: delay(10);if (key_press ()doi=(il|i7);PORTD二i;DDRD二OXOF;keyl二PIND;j二keyl&OXFO;wh订e(j=OXFO);while(key_press();switch(keyl)case OxEE:key1=0x0;break;case OxDE: keyl=0xl; break;case OxBE:key1=0x2; break;case 0x7E:key1=0x3; break;case OxED:key1=0x4; break;case OxDD:key1=0x

18、5; break;case OxBD:key1=0x6; break;case 0x7D: keyl二0x7; break;case OxEB:key1=0x8; break;case OxDB:key1=0x9; break;case OxBB:keyl=OxA;break;case Ox7B:keyl二OxB;break;case 0xE7:keyl二OxC;break;case 0xD7:keyl二OxD;break;case 0xB7:keyl二OxE;break;case 0x77:keyl二OxF;break;default:keyl二16;elsekeyl=16;return k

19、eyl;void clear_lcd()unsigned char i:com_lcd(0x01) ;/清屏delay (1);com_lcd(0x38) ;/5*7, 2 行显示delay (1);com_lcd(0x06);/文字不动,光标自动右移delay (1);com_lcd(OxOC) ;/开显示delay (1);com_lcd(0x81) ;/第一行首地址delay (1);for (i二0;i16;i+) data_lcd(tabli):delay(5);void clear_lcd_2 ()/清第二行 unsigned char i;com_lcd(0xc0);delay(

20、l);for (i二0;i16;i+) data_lcd(tabl1);delay(l);unsigned int qushu(unsigned char m)/第一个数unsigned char i:unsigned int num;unsigned int temp = 0;wei=m-l;/位数for (i=l;i=wei;i+)if(keyi=9) num=0; elsenum=keyi+l;t emp=t emp*10+num;return temp;unsigned int result (unsigned int c, unsigned int d)/运算子程序 unsigned

21、 int result2;unsigned char k;k二keywei+1;switch(k)case 0x0a:result2=c+d;break;case 0x0b:result2=c-d;break;case 0x0c:result2=c*d;break;case OxOd:result2=c/d;default:;return result2;void disp_result(unsigned int result_num )/显示结果子程序unsigned char aa=0;unsigned char i, c;unsigned int n 二 result_num ;clear_lcd_2();com_lcd(OxcO);delay(l);data.lcd (tab3 14);com_lcd(0x04);delay (1);com_lcd(Oxcf);delay (1);辻(n=0)aa=l;wh订e (n!=0)/计算结果长度n=n/10

温馨提示

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

评论

0/150

提交评论