单片机设计简易计算器Word格式.docx
- 文档编号:19133838
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:16
- 大小:165.88KB
单片机设计简易计算器Word格式.docx
《单片机设计简易计算器Word格式.docx》由会员分享,可在线阅读,更多相关《单片机设计简易计算器Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
2.2数字显示与计算
本次设计选用的显示器是1602液晶显示器,此液晶显示器能显示32个字符,VSS接地,VDD接电源正极,E为时使能信号,R/W为读写选择端(H/L),RS为数据/命令选择端(H/L),D0—D7为数据I/O口。
首先我们初始化液晶显示器,然后显示出第一个被按下的数,并且使光标右移,如果有第二个数按下,则据继续显示,以此类推,然后把所有显示出来的数换算成一个数,如果按下“+”号,则显示出“+”,并且同理显示出“+”号后面按下的数字,然后调用加子程序,运算出结果,如果按下的是“-”,则调用减子程序,如果按下“*”,则调用乘子程序,如果按下“/”,则调用除子程序。
然后再调用显示结果子程序,显示出结果。
3程序设计与说明
3.1流程图
主程序流程图和运算子程序流程图为:
图3.1主程序流程图图3.2运算子程序流程图
键盘扫描流程图为:
图3.3键盘扫描子程序流程图
3.2程序说明
本次设计采用模块化设计思想,包括主程序和初始化子程序、延时子程序、输出数据子程序、检测是否有按键按下子程序、确定按键子程序、清第二行屏与显示“Welcome”子程序、换算第一个数子程序、运算子程序、显示结果子程序等子程序。
运行程序后,首先调用子程序清屏第二行并显示“Welcome”,然后检测是否有按键按下,如果没有,继续检测,如果按下,则判断是否是加减乘除键被按下,如果是加减乘除被按下,则显示相应的字符并换算出字符前输入的数据和字符后输入的数字,然后检测是否有等号按下,如果有则完成相应的运算并显示相应的结果,然后检测是否有清屏键按下,如果有则清屏,相应的流程图如图2所示。
其中运算子程序的流程图如图3所示。
4调试
4.1Protues系统仿真
打开Protues,按设计思想放相应的零部件并连好线,把HEX文件加载到单片机中运行,检测结果是否正确。
硬件连线图如图4.1所示。
图4.1Protues仿真图
4.2调式过程
编写完程序后保存程序,在“ICCAVR”中运行,调试,直到运行出正确结果,然后输出后缀名为.HEX格式的文件。
刚开始有错误,是一些语法规则上的错误,不过经过几次的修改,最终输出了后缀名为.HEX格式的文件。
把后缀名为.HEX格式的文件加载到单片机后,刚开始只是显示出“Welcome”的一部分字符,仔细观察发现,程序的前后空格不对称,经过修改,最终得到了预期结果,最终运行结果如图4.1所示。
5总结
5.1优缺点分析
本计算器能完成加减乘除运算,结构简单,硬件较少,成本较低,另外本程序采用模块化设计思想,可读性强,具有很强的可移植性,便于调用。
在处理多任务时,可以用中断服务来实现多线程,通过设置中断,启动中断服务子程序使其自己执行任务,而CPU可以做自己的工作,当有停止中断的请求产生时,CPU再停下自己的工作做相应处理。
但是也有很多不足之处。
首先,程序有很多相同的代码,本来可以用调用的方法实现,减少代码长度,但是考虑到本程序不是很长,而且用调用的方法必然会增加算法的复杂度和逻辑思维强度,所以在这里没有采用!
其次,为了节省空间,程序设计的注释部分不够详细,使读程序不是很方便。
再次,本计算器不能完成小数运算,也不能完成科学计算器的一些功能,而要完成这些功能,需要设置更多的键盘,加更多的程序,比较复杂,因为我时间有限,在此不再处理。
5.2心得体会
通过课程设计,我掌握了计算器的工作原理以及设计方法,我通过对计算器的几个模块的深入理解,我掌握了计算器的组成和制作过程,并通过自己的努力,制作出了自己的计算器,提高了我的动手能力和实践能力,同时我对单片机有了更深入的理解,也学会了使用单片机的方法,加深了对课本知识的进一步理解。
加强了我思考和解决问题的能力,认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准!
在设计过程中,经常会遇到一些问题,就是心里想老着这样的接法可以行得通,但实际接上电路,总是实现不了。
所以这几天不管是吃饭还是睡觉,脑子里总是想着如何解决这些问题,功夫不负有心人,我通过认真思考,请教同学,查找资料,最后终于熟练掌握了基本理论知识,而且领悟诸多平时学习难以理解掌握的较难知识,学会了如何思考的思维方式,找到了设计的灵感。
在寻找答案的过程中,我学到了很多平时缺少的东西,对于理论知识学习不够扎实的我深感“书到用时方恨少”!
认真思考才能找到出路,当初没有思路,诚如举步维艰,茫茫大地,不见道路。
在对理论知识梳理掌握之后,茅塞顿开,柳暗花明,思路如泉涌,高歌“条条大路通罗马”。
顿悟,没有思考便无出路,雨后才能见彩虹。
失败是成功之母。
不经历多次调试,是不可能得到完好的程序的。
至善至美,是人类永恒的追求。
但是,不从忘却“金无足赤,人无完人”,我们换种思维方式,去恶亦是至善,改错亦为至美。
在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。
最终的调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。
实践课诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门思辨课,给了我许多道,给了我很多思,给了我莫大的空间。
至于建议,一言以蔽之,大学教育当如此。
我是一个急性子的人,看到那么复杂知识,我就不想做了,不过为了搞好课程设计,我硬是耐心完成每一个细节,我坚持一天呆在实验室10多个小时,虽然晚上眼睛比较酸痛,但是我感觉值。
这么多天的努力没有白费,我最后很好的完成了任务,很有成就感!
我相信我在以后的生活和学习中会更耐心,更认真的!
参考文献:
[1]陈冬云等.ATmega128单片机原理与开发指导.机械工业出版社,2006
[2]李群芳等.单片微型计算机及接口技术(第二版).电子工业出版社,2005
[3]周航慈.单片机程序设计基础.北航出版社,2005
[4]何立民.MCS-51单片机应用系统设计.北航出版社,2002
[5]马潮.高档8位单片机ATmega128原理与开发应用指南.北京航空航天大学出版社,2004
附录程序
#include<
iom16v.h>
macros.h>
math.h>
constunsignedchartab1[]="
Welcome"
;
constunsignedchartab3[]="
1234567890+-*/="
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;
case0xDE:
key1=0x1;
case0xBE:
key1=0x2;
case0x7E:
key1=0x3;
case0xED:
key1=0x4;
case0xDD:
key1=0x5;
case0xBD:
key1=0x6;
case0x7D:
key1=0x7;
case0xEB:
key1=0x8;
case0xDB:
key1=0x9;
case0xBB:
key1=0xA;
case0x7B:
key1=0xB;
case0xE7:
key1=0xC;
case0xD7:
key1=0xD;
case0xB7:
key1=0xE;
case0x77:
key1=0xF;
default:
key1=16;
}
returnkey1;
voidclear_lcd()
{unsignedchari;
com_lcd(0x01);
//清屏
com_lcd(0x38);
//5*7,2行显示
com_lcd(0x06);
//文字不动,光标自动右移
com_lcd(0x0C);
//开显示
com_lcd(0x81);
//第一行首地址
for(i=0;
16;
{data_lcd(tab1[i]);
delay(5);
voidclear_lcd_2()//清第二行
{unsignedchari;
com_lcd(0xc0);
{data_lcd(tab1[1]);
delay
(1);
unsignedintqushu(unsignedcharm)//第一个数
unsignedintnum;
unsignedinttemp=0;
wei=m-1;
//位数
for(i=1;
=wei;
if(key[i]==9){num=0;
else{num=key[i]+1;
temp=temp*10+num;
returntemp;
unsignedintresult(unsignedintc,unsignedintd)//运算子程序
{unsignedintresult2;
unsignedchark;
k=key[wei+1];
switch(k)
case0x0a:
result2=c+d;
break;
case0x0b:
result2=c-d;
case0x0c:
result2=c*d;
case0x0d:
result2=c/d;
;
returnresult2;
voiddisp_result(unsignedintresult_num)//显示结果子程序
unsignedcharaa=0;
unsignedchari,c;
unsignedintn=result_num;
clear_lcd_2();
data_lcd(tab3[14]);
com_lcd(0x04);
com_lcd(0xcf);
if(n==0){aa=1;
while(n!
=0)//计算结果长度
{n=n/10;
aa++;
for(i=1;
=aa;
c=result_num%10;
if(c==0){c=10;
data_lcd(tab3[c-1]);
//显示结果
result_num=result_num/10;
voidmain()
{unsignedcharwei2,i;
unsignedintresult1=0;
unsignedintnum2;
int_port();
clear_lcd();
asm("
nop"
);
while
(1)
{
if(key_press())
{count1++;
key[count1]=key_scan();
if((key[count1]==0x0a)|(key[count1]==0x0b)|(key[count1]==0x0c)|(key[count1]==0x0d))//当按下+-*/时的处理
{
temp1=qushu(count1);
data_lcd(tab3[key[count1]]);
}
elseif(key[count1]==0x0e)//当按下=号时的处理
wei2=count1-wei-2;
for(i=1;
=wei2;
if(key[i]==9){num2=0;
else{num2=key[i+wei+1]+1;
temp2=temp2*10+num2;
result1=result(temp1,temp2);
disp_result(result1);
count1=0;
elseif(key[count1]==0x0f)//当按下最后一个键清1602第二行
{com_lcd(0x06);
delay
(1);
clear_lcd_2();
temp1=0;
temp2=0;
result1=0;
}
else
com_lcd(0xc0+count1-1);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 设计 简易 计算器