单片机设计简易计算器Word文件下载.docx

上传人:b****3 文档编号:15139000 上传时间:2022-10-28 格式:DOCX 页数:17 大小:327.68KB
下载 相关 举报
单片机设计简易计算器Word文件下载.docx_第1页
第1页 / 共17页
单片机设计简易计算器Word文件下载.docx_第2页
第2页 / 共17页
单片机设计简易计算器Word文件下载.docx_第3页
第3页 / 共17页
单片机设计简易计算器Word文件下载.docx_第4页
第4页 / 共17页
单片机设计简易计算器Word文件下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

单片机设计简易计算器Word文件下载.docx

《单片机设计简易计算器Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机设计简易计算器Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。

单片机设计简易计算器Word文件下载.docx

本设计是通过单片机来实现的,因此选用了ATMEGA16单片机作为主体,输入设备选用矩阵键盘。

程序是硬件的灵魂,是实现设计的中心环节。

本设计使用的程序语言是C语言,在“ICCAVR”中运行,调试,直到运行出正确结果,然后输出后缀名为.HEX格式的文件,以备在Protues中仿真使用。

程序是设计的关键,程序的调试需要大量的时间,耐心,还够要有足的细心才能成功。

本设计中就出现了大量的错误,经过认真修改,最终才能运行出正确结果。

最后的系统仿真是设计是否成功的验证,是设计不可缺少的重要环节。

这就要求能掌握Protues的一些基本操作。

2原理分析

矩阵键盘的扫描

图矩阵键盘图

如图所示,单片机的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被拉低。

这是判断有无键盘按下的过程,当我们判断是那一个键盘按下时,我们首先设置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,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),D0—D7为数据I/O口。

首先我们初始化液晶显示器,然后显示出第一个被按下的数,并且使光标右移,如果有第二个数按下,则据继续显示,以此类推,然后把所有显示出来的数换算成一个数,如果按下“+”号,则显示出“+”,并且同理显示出“+”号后面按下的数字,然后调用加子程序,运算出结果,如果按下的是“-”,则调用减子程序,如果按下“*”,则调用乘子程序,如果按下“/”,则调用除子程序。

然后再调用显示结果子程序,显示出结果。

3程序设计与说明

流程图

主程序流程图和运算子程序流程图为:

图主程序流程图图运算子程序流程图

键盘扫描流程图为:

图键盘扫描子程序流程图

程序说明

本次设计采用模块化设计思想,包括主程序和初始化子程序、延时子程序、输出数据子程序、检测是否有按键按下子程序、确定按键子程序、清第二行屏与显示“Welcome”子程序、换算第一个数子程序、运算子程序、显示结果子程序等子程序。

运行程序后,首先调用子程序清屏第二行并显示“Welcome”,然后检测是否有按键按下,如果没有,继续检测,如果按下,则判断是否是加减乘除键被按下,如果是加减乘除被按下,则显示相应的字符并换算出字符前输入的数据和字符后输入的数字,然后检测是否有等号按下,如果有则完成相应的运算并显示相应的结果,然后检测是否有清屏键按下,如果有则清屏,相应的流程图如图2所示。

其中运算子程序的流程图如图3所示。

4调试

Protues系统仿真

打开Protues,按设计思想放相应的零部件并连好线,把HEX文件加载到单片机中运行,检测结果是否正确。

硬件连线图如图所示。

图Protues仿真图

调式过程

编写完程序后保存程序,在“ICCAVR”中运行,调试,直到运行出正确结果,然后输出后缀名为.HEX格式的文件。

刚开始有错误,是一些语法规则上的错误,不过经过几次的修改,最终输出了后缀名为.HEX格式的文件。

把后缀名为.HEX格式的文件加载到单片机后,刚开始只是显示出“Welcome”的一部分字符,仔细观察发现,程序的前后空格不对称,经过修改,最终得到了预期结果,最终运行结果如图所示。

5总结

优缺点分析

本计算器能完成加减乘除运算,结构简单,硬件较少,成本较低,另外本程序采用模块化设计思想,可读性强,具有很强的可移植性,便于调用。

在处理多任务时,可以用中断服务来实现多线程,通过设置中断,启动中断服务子程序使其自己执行任务,而CPU可以做自己的工作,当有停止中断的请求产生时,CPU再停下自己的工作做相应处理。

但是也有很多不足之处。

首先,程序有很多相同的代码,本来可以用调用的方法实现,减少代码长度,但是考虑到本程序不是很长,而且用调用的方法必然会增加算法的复杂度和逻辑思维强度,所以在这里没有采用!

其次,为了节省空间,程序设计的注释部分不够详细,使读程序不是很方便。

再次,本计算器不能完成小数运算,也不能完成科学计算器的一些功能,而要完成这些功能,需要设置更多的键盘,加更多的程序,比较复杂,因为我时间有限,在此不再处理。

心得体会

通过课程设计,我掌握了计算器的工作原理以及设计方法,我通过对计算器的几个模块的深入理解,我掌握了计算器的组成和制作过程,并通过自己的努力,制作出了自己的计算器,提高了我的动手能力和实践能力,同时我对单片机有了更深入的理解,也学会了使用单片机的方法,加深了对课本知识的进一步理解。

加强了我思考和解决问题的能力,认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准!

在设计过程中,经常会遇到一些问题,就是心里想老着这样的接法可以行得通,但实际接上电路,总是实现不了。

所以这几天不管是吃饭还是睡觉,脑子里总是想着如何解决这些问题,功夫不负有心人,我通过认真思考,请教同学,查找资料,最后终于熟练掌握了基本理论知识,而且领悟诸多平时学习难以理解掌握的较难知识,学会了如何思考的思维方式,找到了设计的灵感。

在寻找答案的过程中,我学到了很多平时缺少的东西,对于理论知识学习不够扎实的我深感“书到用时方恨少”!

认真思考才能找到出路,当初没有思路,诚如举步维艰,茫茫大地,不见道路。

在对理论知识梳理掌握之后,茅塞顿开,柳暗花明,思路如泉涌,高歌“条条大路通罗马”。

顿悟,没有思考便无出路,雨后才能见彩虹。

失败是成功之母。

不经历多次调试,是不可能得到完好的程序的。

至善至美,是人类永恒的追求。

但是,不从忘却“金无足赤,人无完人”,我们换种思维方式,去恶亦是至善,改错亦为至美。

在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。

最终的调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。

实践课诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门思辨课,给了我许多道,给了我很多思,给了我莫大的空间。

至于建议,一言以蔽之,大学教育当如此。

我是一个急性子的人,看到那么复杂知识,我就不想做了,不过为了搞好课程设计,我硬是耐心完成每一个细节,我坚持一天呆在实验室10多个小时,虽然晚上眼睛比较酸痛,但是我感觉值。

这么多天的努力没有白费,我最后很好的完成了任务,很有成就感!

我相信我在以后的生活和学习中会更耐心,更认真的!

参考文献:

[1]陈冬云等.ATmega128单片机原理与开发指导.机械工业出版社,2006

[2]李群芳等.单片微型计算机及接口技术(第二版).电子工业出版社,2005

[3]周航慈.单片机程序设计基础.北航出版社,2005

[4]何立民.MCS-51单片机应用系统设计.北航出版社,2002

[5]马潮.高档8位单片机ATmega128原理与开发应用指南.北京航空航天大学出版社,2004

附录程序

#include<

>

constunsignedchartab1[]="

Welcome"

;

constunsignedchartab3[]="

90+-*/="

unsignedcharkey[10];

unsignedinttemp1=0,temp2=0;

unsignedcharcount1=0;

unsignedcharwei;

voiddelay(unsignedintms)

{

unsignedinti,j;

for(i=0;

i<

ms;

i++)

{for(j=0;

j<

1141;

j++);

}

voidint_port()

DDRA=0XFF;

DDRB=DDRB|0X07;

PORTB&

=~BIT(PB0);

DDRD=0XFF;

PORTD=0XFF;

DDRD=0XF0;

PORTD=PORTD&

0X0F;

voidcom_lcd(unsignedcharcom)

PORTB&

=~BIT(PB2);

=~BIT(PB1);

PORTA=com;

PORTB|=BIT(PB0);

delay

(1);

voiddata_lcd(unsignedchardata)

PORTB|=BIT(PB2);

PORTA=data;

unsignedcharkey_press()

unsignedchari;

PORTD=0XF0;

DDRD=0X0F;

i=PIND;

if(i==0XF0)

{

//没键按下

return0;

}

else

//有键按下

return1;

unsignedcharkey_scan()//键检测

unsignedcharkey1,i=0X7F,j;

delay(10);

if(key_press())

do

{

i=(i<

<

1|i>

7);

PORTD=i;

DDRD=0X0F;

key1=PIND;

j=key1&

0XF0;

}while(j==0XF0);

while(key_press());

switch(key1)

case0xEE:

key1=0x0;

break;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 临床医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1