资源描述:
《单片机课程设计-基于aduc848的电子计算器》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、湖南大学电气与信息工程学院本科生课程设计课 程:单片机课程设计题 目:电子计算器专 业:电气工程及其自动化班 级:学 号:姓 名:指导 老师:设计 时间:2012年6月20日21/21一.设计任务及要求:1、任务设计一个四则运算的电子计算器,采用LED或LCD显示。2、要求1)利用小键盘作为数据和命令的输入装置2)利用LED或LCD作为过程和结果的输出装置3)可实现基本的数据运算,包括:加、减、乘、除、开方等4)未工作时显示北京时间,可调整5)当数据超出范围,可声音提示或报警6)可通过按键控制,随机模拟滚动显示乘法口诀表2
2、1/21二.设计原理及原理图:通过单片机的计算、控制功能和数码管的显示功能,行列键盘的输入功能,可以实现一个计算器的基本功能如加、减、乘、除、乘n次方,开n次方的功能,但由于ADuC848单片机位数的限制和内存的不足,限制了显示的位数和计算功能。本计算器只能在0到65535的计数范围内正确的处理和显示得数,因为采用按键复用的设计,克服了键盘上按键不够的难题。由于内存不足和函数调用不精确等原因,在本计算器内并没有使用keil自带的math头文件来获取乘方开方的函数,而是自己编写了一个整数的乘方开方函数,在适用范围内有可以得到正确得数。同时,利用了中
3、断子程序设计了一个简易的时间显示。可以显示出小时和分钟,同时可以看出秒钟的闪动,显示的时间可调。在计算器进行计算的同时,时钟程序也在运行,不会因计算的过程对时间的参数造成影响。21/21三.设计流程图21/21四.硬件原理图图一:MPU的电路图21/21图2:行列键盘结构图三:数码管连接图四:电源供电电路图中可以看出,行列式键盘的行扫描由P1口的第四位构成,列扫描由高四位构成。而数码管的0-7位(从右往左)的位控制由P3.3,P3.5,P4.6,P4.7,P2.4,P2.1,P2.2,P2.3,其段控制由P0口控制。数码管为共阳极,即P0口输出低
4、电平时会亮。而蜂鸣器的接口为2.6,由于并无特殊电路,故并未在图中标出。21/21五.程序清单1.主要变量和函数声明部分#include#defineulongunsignedlong#defineuintunsignedintsbitpwm1=P2^6;sbitdc0=P3^3;sbitdc1=P3^5;sbitdc2=P3^6;sbitdc3=P3^7;sbitdc4=P2^4;sbitdc5=P2^1;sbitdc6=P2^2;sbitdc7=P2^3;//staticunsignedintn;voiderror();
5、uinterr[]={0x11,0x03,0x11,0x11,0x61};voidtime();voidshowtime(uinth,min);voiddelay(uintt);voidshow(ulongn,uintd1,d2,d3,d4,d5);ulonga,b,a1,ru1;uintse,s1,s,i,j,sq,gk,mod,shift,keyvalue,second,second1,minute,hour;uintdat1[5];uintdat2[5];unsignedintdis[]={0x03,0x9f,0x25,0x0d,0x99,
6、0x49,0x41,0x1f,0x01,0x09,0xfd,0xff};ulongswitchdat(uintd1,d2,d3,d4,d5);uintkeytest();ulongcalculator(ulongc,d,uintmod1);uintgetkey();uintget,ru;uintswitchcode(uintk);2、主函数部分voidmain()//主函数,模拟EDA状态法{second=0;second1=0;minute=0;hour=0;21/21EA=1;ET0=1;TH0=0x00;TL0=0x00;TR0=1;以上为
7、时间的参数,由于复位不需要进行重置,因此把它设置在res(即reset)复位的标签之后。下面开始进行复位后各个变量的赋初值res:pwm1=0;dc5=0;dc6=0;dc7=0;s=0;se=0;a=0;shift=0;for(j=0;j<=4;j++)dat1[j]=0;for(j=0;j<=4;j++)dat2[j]=0;show(a,dat1[0],dat1[1],dat1[2],dat1[3],dat1[4]);在下面就是主函数的精华部分,即状态法的实现。本次主要使用了4种状态,分别是状态0--输入a状态,状态1--确定符号状态,状态2
8、--输入b状态,状态3—得到得数状态,为防止偶尔的程序异常,将其余状态(即default)设置为归0。while(1){switch(s