

免费预览已结束,剩余19页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
湖南大学电气与信息工程学院本科生课程设计课程:单片机课程设计题目:电子计算器专业:电气工程及其自动化班级: 学号:姓名: 指导老师:设计时间:2012年6月20日一设计任务及要求:1、任务设计一个四则运算的电子计算器,采用led或lcd显示。2、要求1)利用小键盘作为数据和命令的输入装置2)利用led或lcd作为过程和结果的输出装置3)可实现基本的数据运算,包括:加、减、乘、除、开方等4)未工作时显示北京时间,可调整5)当数据超出范围,可声音提示或报警6)可通过按键控制,随机模拟滚动显示乘法口诀表二设计原理及原理图:通过单片机的计算、控制功能和数码管的显示功能,行列键盘的输入功能,可以实现一个计算器的基本功能如加、减、乘、除、乘n次方,开n次方的功能,但由于aduc848单片机位数的限制和内存的不足,限制了显示的位数和计算功能。本计算器只能在0到65535的计数范围内正确的处理和显示得数,因为采用按键复用的设计,克服了键盘上按键不够的难题。由于内存不足和函数调用不精确等原因,在本计算器内并没有使用keil自带的math头文件来获取乘方开方的函数,而是自己编写了一个整数的乘方开方函数,在适用范围内有可以得到正确得数。同时,利用了中断子程序设计了一个简易的时间显示。可以显示出小时和分钟,同时可以看出秒钟的闪动,显示的时间可调。在计算器进行计算的同时,时钟程序也在运行,不会因计算的过程对时间的参数造成影响。三设计流程图四硬件原理图图一:mpu的电路图图2:行列键盘结构图三:数码管连接图四:电源供电电路图中可以看出,行列式键盘的行扫描由p1口的第四位构成,列扫描由高四位构成。而数码管的0-7位(从右往左)的位控制由p3.3,p3.5,p4.6,p4.7,p2.4,p2.1,p2.2,p2.3,其段控制由p0口控制。数码管为共阳极,即p0口输出低电平时会亮。而蜂鸣器的接口为2.6,由于并无特殊电路,故并未在图中标出。五程序清单1.主要变量和函数声明部分#include#define ulong unsigned long#define uint unsignedintsbit pwm1= p26;sbit dc0=p33;sbit dc1=p35;sbit dc2=p36;sbit dc3=p37;sbit dc4=p24;sbit dc5=p21;sbit dc6=p22;sbit dc7=p23;/static unsigned int n;void error();uint err=0x11,0x03,0x11,0x11,0x61;void time();void showtime(uinth,min);void delay(uint t);void show(ulongn,uint d1,d2,d3,d4,d5);ulong a,b,a1,ru1;uint se,s1,s,i,j,sq,gk,mod,shift,keyvalue,second,second1,minute,hour;uint dat15;uint dat25;unsigned int dis=0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfd,0xff;ulongswitchdat(uint d1,d2,d3,d4,d5);uintkeytest();ulong calculator(ulongc,d,uint mod1);uintgetkey();uintget,ru;uintswitchcode(uint k);2、主函数部分void main()/主函数,模拟eda状态法 second=0;second1=0;minute=0;hour=0;ea=1;et0=1;th0=0x00;tl0=0x00;tr0=1;以上为时间的参数,由于复位不需要进行重置,因此把它设置在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+) dat1j=0;for(j=0;j=1;j-) dat1j=dat1j-1 ;dat10=switchcode(keyvalue);if(keyvalue=14) goto res;a=switchdat(dat10,dat11,dat12,dat13,dat14);if(se=1) goto res;show(a,dat10,dat11,dat12,dat13,dat14);case 1:/确定符号模式if(shift=1) if(keyvalue!=3&keyvalue!=7&keyvalue!=11&keyvalue!=14&keyvalue!=15) error();if(keyvalue=3) mod=1;s+; if(keyvalue=7) mod=3;s+; if(keyvalue=11) mod=5;s+; if(keyvalue=14) goto res;if(keyvalue=15) time(); goto res; show(a,dat10,dat11,dat12,dat13,dat14); if(shift=0)if(keyvalue=3) mod=0;s+; if(keyvalue=7) mod=2;s+; if(keyvalue=11) mod=4;s+; if(keyvalue=13)goto res;show(a,dat10,dat11,dat12,dat13,dat14);case 2: /确定输入2模式for(j=0;j=1;j-) dat2j=dat2j-1 ;dat20=switchcode(keyvalue);if(keyvalue=14) goto res;b=switchdat(dat20,dat21,dat22,dat23,dat24);if(se=1) goto res;show(b,dat20,dat21,dat22,dat23,dat24);case 3:/得到得数模式a=calculator(a,b,mod);if(se=1) goto res;if(keyvalue=14) goto res;break;show(a,dat10,dat11,dat12,dat13,dat14);if(keyvalue!=3&keyvalue!=7&keyvalue!=11&keyvalue!=15) for(j=0;j=4;j+) dat1j=0;s=0; break; if(keyvalue=3|keyvalue=7|keyvalue=11) shift=0; s=1; break; if(keyvalue=15) shift=1; goto r1;default:/清零模式goto res;/应该不会有了吧 /while 结尾3、从下面开始即为各个辅助函数的设定,这个部分比较庞杂,但是各个部分作用清晰,程序清晰易懂。下面为延迟函数,短暂延迟,用于防止抖动和显示数字时所用的延迟void delay(uint t) /延迟while(-t);/立刻返回取得的按键4、下面2个函数共同作用来取得键盘值,键盘返回值为0-15uintkeytest()uintrow,col;p1&=0xf0;p2&=0xf0;/行检测switch(p1&0x0f)case 0x07:row=3;break;/0111 11case 0x0b:row=2;break;/1011 10case 0x0d:row=1;break;/1101 01case 0x0e:row=0;break;/1110 00default:return 0xff;/列检测for(col=0;col4;col+)p2|=0x0f;p2-=(1col);if(p1!=0xff) return row*4+3-col;return 0xff;/按键弹起后返回取得的按键uintgetkey()uint key;key=keytest();delay(1000);if(key=0xff | key!=keytest()return 0xff;while(1)if(key!=keytest()delay(1000);if(key!=keytest()return key;5、下面的函数为键盘返回码转换为输入数字码的函数/键盘码转数字uintswitchcode(uint k)if(k=0) ru=1;if(k=1) ru=2;if(k=2) ru=3;if(k=4) ru=4;if(k=5) ru=5;if(k=6) ru=6;if(k=8) ru=7;if(k=9) ru=8;if(k=10) ru=9;if(k=12) ru=0;return ru; 6、下面为确定了a,b两个输入值以后的计算部分为了节约空间,在乘方和开方的部分采用自己编的实用于整数计算的代码。即可提高速度,也可节约空间。同时在得到得数之后,把所得到的得数的个、十、百、千、万位分别存放在dat1数组的0-4这5个单元中,以方便显示函数的显示。ulong calculator(ulongc,d,uint mod1) /计算函数ru1=(ulong)1;sq=1;if(mod1=0) ru1=(ulong)c+(ulong)d;if(mod1=1) if(cd) error(); ru1=(ulong)c-d;if(mod1=2) ru1=c*d;if(mod1=3) if (d=0) error(); ru1=(ulong)c/(ulong)d;if(mod1=4) if (d=0) ru1=1; for(i=1;i=d;i+) ru1=(ulong)c*ru1; if(mod1=5) if (d=0) error(); for(i=1;i=c/2;i+)for(j=1;jc)ru1=i-1;break;ru1=1;dat14=ru1/10000;dat13=(ru1-dat14*10000)/1000;dat12=(ru1-dat14*10000-dat13*1000)/100;dat11=(ru1-dat14*10000-dat13*1000-dat12*100)/10;dat10=ru1-dat14*10000-dat13*1000-dat12*100-dat11*10;if(ru165535) error();return ru1;7、下面的函数把依次输入的键盘码在转换为数字码之后,通过计算得到应该表示的数字。ulongswitchdat(uint d1,d2,d3,d4,d5) a1=0; a1=d1*(ulong)1+d2*(ulong)10 +d3*(ulong)100+d4*(ulong)1000+d5*(ulong)10000; if(a165535) error(); return a1;8、下面为显示核心函数,该函数较为复杂,笔者也倾注了较多心血。从函数重复的过程、条件到语句的顺序,基本处处调试时都曾被修改过。void show(ulongn,uint d1,d2,d3,d4,d5)dc0=0;dc1=0;dc2=0;dc3=0;dc4=0;while(1)keyvalue=getkey(); if(keyvalue!=0xff)break;if(n=0) dc4=0;dc3=0;dc2=0;dc1=0;dc0=1;p0=dis0;continue; if(n/10=0) dc4=0;dc3=0;dc2=0;dc1=0;dc0=1;p0=disd1;continue; if(n/100=0) dc4=0;dc3=0;dc2=0;for(i=0;i=1;i+)if(i=0) dc1=0; dc0=1; p0=disd1;delay(100);if(i=1) dc1=1; dc0=0; p0=disd2;delay(100); continue;if(n/1000=0) dc4=0; dc3=0;for(i=0;i=2;i+)if(i=0) dc2=0; dc1=0; dc0=1; p0=disd1;delay(100); if(i=1) dc2=0; dc1=1; dc0=0; p0=disd2;delay(100); if(i=2) dc2=1; dc1=0; dc0=0; p0=disd3;delay(100);continue;if(n/10000=0) dc4=0;for(i=0;i=3;i+)if(i=0) dc3=0;dc2=0; dc1=0; dc0=1; p0=disd1;delay(100);if(i=1) dc3=0;dc2=0; dc1=1; dc0=0; p0=disd2;delay(100); if(i=2) dc3=0;dc2=1; dc1=0; dc0=0; p0=disd3;delay(100);if(i=3) dc3=1;dc2=0; dc1=0; dc0=0; p0=disd4;delay(100);continue;if(n/10000!=0) for(i=0;i=4;i+)/if(getkey()!=0xff) dat10=9; dat11=9;dat12=9;dat13=9;dat14=9;if(i=0) dc4=0;dc3=0;dc2=0; dc1=0; dc0=1; p0=disd1;delay(100);if(i=1) dc4=0;dc3=0;dc2=0; dc1=1; dc0=0; p0=disd2;delay(100); if(i=2) dc4=0;dc3=0;dc2=1; dc1=0; dc0=0; p0=disd3;delay(100);if(i=3) dc4=0;dc3=1;dc2=0; dc1=0; dc0=0; p0=disd4;delay(100);if(i=4) dc4=1;dc3=0;dc2=0; dc1=0; dc0=0; p0=disd5;delay(100);continue;9、下面是报错函数。在应该显示错误的情况下,数码管将显示error,同时蜂鸣器发出声响。void error() se=1; while(getkey()=0xff)pwm1=1;for(i=0;i=95) dc4=0;dc3=0;dc2=1; dc1=0; dc0=0; p0=dis11;delay(100);if(second195) dc4=0;dc3=0;dc2=1; dc1=0; dc0=0; p0=dis10;delay(100);12、最后一段为计时器的中断函数,包含了时间参数的自动调整和秒针的调整。void count() interrupt 1 using 1second1=second1+1;if(second1=190) second1=0;+second;if(second=60) second=0; +minute; if(minute=60) minute=0; +hour; if(hour=24) hour=0;th0=0x00;tl0=0x00;六计算器说明首先介绍本计算器的输入键盘部分:123+(-)456*(/)789xn(nx)0=clrshift(time)在处于计算状态时,本计算器的键盘输入对应如上。开机后,即可输入一个小于65535的整数,按下计算符号键后,再输入另一个数(此数也需要小于65535),如果需要结果,直接按下等号,如果要对得数再进行计算,按下计算符号键也可以得到得数,然后直接键入下一个需要与之做计算的数即可,依次类推。shift键的用法包含于介绍计算之中。下面为基本用法:1.加法,乘法:开机后直接按下所需数字,按下+或*号键,再输入另一个数字,按下等号即可得到所需数字。2.减法,除法:在输入一个数字之后,需要按下shift键,按下后松开,然后按照键盘说明部分括号内的符号,按下对应的-号,/号。在按下shift后,如果按下除最右边一列的按键,会显示error。3.乘,开n次方:与加减法相似,其中x为第一个输入的值,n为第二个输入的值。注意事项:1、在计算中需要保证符合数学规则,例:如果除数为0,会显示error,并发生报警。2.得数如果超过65535,本计算器会显示error,并发生报警。3.输入的数字如果大于65535,会显示error,并发生报警。4.如果输入不符合语法规则,例如在按下数字键后不键入计算符号而直接输入等号,会显示error,并发生报警。5.如有输入错误,按下clr可以清零,从头输入计算的第一个值。6.如果在某个过程中出现error键,直接按clr清零即可,这时需要重新输入需计算的值。上面所介绍的是计算模式下的使用方法,本计算器还带有显示时间功能,下面介绍时间显示功能部分。下面为时间显示部分的键盘:hour+minute+(开始、停止)调整时间shift进入计算模式开机后或计算清零后,按下shift键进入时间显示
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国育婴师行业发展潜力分析及投资方向研究报告
- 2024年全球及中国外延片检测系统行业头部企业市场占有率及排名调研报告
- 2025-2030年中国四耳接线盒项目投资可行性研究分析报告
- 2024年全球及中国商业养老服务中心行业头部企业市场占有率及排名调研报告
- 洪洞格宾石笼施工方案
- 2025年海上风电场工程项目可行性研究报告
- 进度分析报告示例
- 证券知识培训课件
- 中国制伞市场深度调查及发展前景研究预测报告
- 2025年中国弹性水泥防水涂料行业市场发展前景及发展趋势与投资战略研究报告
- 腹腔镜下肾盂输尿管成形术
- 医疗器械公司咨询培训记录表(全套)-
- JJG 1000-2005电动水平振动试验台
- 天津地理会考知识要点精华版
- 绿壳蛋鸡的养殖课件
- 小学语文扩句、缩句专题
- 农村公路安全生命防护工程施工方案
- (部编版)统编版小学语文教材目录(一至六年级上册下册齐全)
- 抗滑桩专项的施工组织方案[专家评审]
- 常用弹簧钢号对照表
- 小学二年级下册劳动教案
评论
0/150
提交评论