您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于AT89C51单片机简易计算器的设计
基于AT89C51单片机简易计算器的设计一、设计目的................................................2二、总体设计及功能介绍............................2三、硬件设计................................................3四、软件设计................................................4五、设计总结..............................................17参考文献:..................................................19一、设计目的单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。本设计是基于51系列单片机来进行的简单数字计算器设计,可以完成计算器的键盘输入,进行加、减、乘、除六位无符号数范围内的基本加减运算,并在LED上显示相应的结果。软件方面使用C语言编程,并用PROTUES仿真,通过硬件实现功能。二、总体设计及功能介绍根据功能和指标要求,本系统选用MCS-51系列单片机为主控机,实现对计算器的设计。具体设计及功能如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LED显示数据和结果。(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算键盘。(3)执行过程:开机显示零,等待键入数值,当键入数字,通过LED显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LED上输出运算结果。三、硬件设计本设计选用AT89C51单片机为主控单元。显示部分:采用LED动态显示。按键部分:采用4*4集成计算键盘;总电路图:实物图:四、软件设计现实生活中人们熟知的计算器,其功能主要如下:1、键盘输入;2、数值显示;3、加、减、乘、除四则运算;针对上述功能,计算器软件程序要完成以下程序的设计:1、键盘输入检测程序2、LED显示程序3、算术运算程序1、程序流程图2、程序清单/****************************************实验名称:六位无符号数加减法简易计算器*连接方式:P0口---段选*138译码器的A、B、C---P2.2、P2.3、P2.4*P1口---矩阵键盘*键盘:789+*456-*123*CLR0=***************************************/#includereg51.h//宏定义类型#defineucharunsignedchar#defineuintunsignedint//--定义使用的IO口--//#defineDUANP0#defineKEYP1sbitWEIA=P2^2;sbitWEIB=P2^3;sbitWEIC=P2^4;//段码表ucharcodeDUANMA[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0--9//显示的八位数据ucharxianshi[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//第一个数据,第二个数据,得到的数据,符号longnum[4]={0,0,0,0};/************函数名称:Delay*作用:毫秒延时*参数:延时毫秒***********/voidDelay(uintx){uinti,j;for(i=x;i0;i--)for(j=110;j0;j--);}/************函数名称:Kbscan*作用:矩阵键盘扫描*返回值:按键行列数对应的十六进制数据***********/ucharKbscan(void){ucharsccode,recode;KEY=0xf0;Delay(1);if(KEY!=0xf0){Delay(2);if(KEY!=0xf0){sccode=KEY&0xf0;KEY=0x0f;Delay(1);recode=(KEY&0x0f)|sccode;KEY=0x0f;Delay(1);while(KEY!=0x0f);returnrecode;}}return0;}/************函数名称:Keyval*作用:键值解码*返回值:按键对应功能值*10表示+,11表示-,12表示*,13表示/,14表示CLR,15表示=***********/ucharKeyval(void){ucharkey;ucharkeyval=16;//无按键key=Kbscan();switch(key){case0xee:keyval=7;break;case0xde:keyval=8;break;case0xbe:keyval=9;break;case0x7e:keyval=10;break;//+case0xed:keyval=4;break;case0xdd:keyval=5;break;case0xbd:keyval=6;break;case0x7d:keyval=11;break;//-case0xeb:keyval=1;break;case0xdb:keyval=2;break;case0xbb:keyval=3;break;case0x7b:keyval=12;break;//*case0xe7:keyval=14;break;//CLRcase0xd7:keyval=0;break;case0xb7:keyval=15;break;//=case0x77:keyval=13;break;///default:break;}returnkeyval;}/************函数名称:Ewu*作用:计算功能实现***********/voidEwu(void){uchargetkey,i;getkey=Keyval();if(getkey10)//按下的是数字{if(num[3]==0)//没有符号,表示输入第一个数{if(num[0]100000)//五位数时还可以再输入一位num[0]=num[0]*10+getkey;}if(num[3]!=0)//有符号,输入第二个数{if(num[1]100000)//五位数时还可以再输入一位num[1]=num[1]*10+getkey;}}if(getkey9&&getkey16)//特殊按键按下{if(getkey==10)//+{num[3]=1;for(i=0;i8;i++){xianshi[i]=0x00;}}if(getkey==11)//-{num[3]=2;for(i=0;i8;i++){xianshi[i]=0x00;}}if(getkey==12)//*{num[3]=3;for(i=0;i8;i++){xianshi[i]=0x00;}}if(getkey==13)///{num[3]=4;for(i=0;i8;i++){xianshi[i]=0x00;}}if(getkey==14)//CLR{for(i=0;i4;i++){num[i]=0;//清除数据}for(i=0;i8;i++){xianshi[i]=0x00;}}if(getkey==15)//={switch(num[3]){case1:num[2]=num[0]+num[1];break;case2:num[2]=num[0]-num[1];break;case3:num[2]=num[0]*num[1];break;//case4:num[2]=num[0]/num[1];break;//default:break;}num[0]=num[2];num[1]=0;num[2]=0;num[3]=0;}}}/************函数名称:Display*作用:数码管显示***********/voidDisplay(void){uchari;longDIS;if(num[3]==0)//显示第一个数或者最终结果DIS=num[0];if(num[3]!=0)//显示第二个数DIS=num[1];if(DIS==0)xianshi[7]=DUANMA[0];if(DIS0){for(i=8;i0;i--){if(DIS0){xianshi[i-1]=DUANMA[(uchar)(DIS%10)];DIS=DIS/10;}}xianshi[0]=0x00;}if(DIS0){DIS=DIS*(-1);Delay(1);for(i=8;i0;i--){if(DIS0){xianshi[i-1]=DUANMA[(uchar)(DIS%10)];DIS=DIS/10;}}xianshi[0]=0x40;//显示负号}for(i=0;i8;i++){switch(i){case0:WEIA=0;WEIB=0;WEIC=0;break;case1:WEIA=1;WEIB=0;WEIC=0;break;case2:WEIA=0;WEIB=1;WEIC=0;break;case3:WEIA=1;WEIB=1;WEIC=0;break;case4:WEIA=0;WEIB=0;WEIC=1;break;case5:WEIA=1;WEIB=0;WEIC=1;break;case6:WEIA=0;WEIB=1;WEIC=1;break;case7:WEIA=1;WEIB=1;WEIC=1;break;}//发送段码DUAN=xianshi[i];Delay(1);DUAN=0x00;//消隐}}voidmain(void){while(1){Ewu();Display();}}五、设计总结通过课程设计,我掌握了计算器的工作原理以及设计方法,我通过对计算器的几个模块的深入理解,我掌握了计算器的组成和制作过程,并通过自己的努力,制作出了自己的计算器,提高了我的动手能力和实践能力,同时我对单片机有了更深入的理解,也学会了使用单片机的方法,加深了对课本知识的进一步理解。加强了我思考和解决问题的能力,认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准!在设计过程中,经常会遇到一些问题,就是心里想老着这样的接法可以行得通,但实际接上电路,总是实现不了。所以这几天不管是吃饭还是睡觉,脑子里总是想着如何解决这些问题,功夫不负有心人,我通过认真思考,请教同学,查找资料,最后终于熟练掌握了基本理论知识,而且领悟诸多平时学习难以理解掌握的较难知识,学会了如何思考的思维方式,找到了设计的灵感。在寻找答案的过程中,我学到了很多平时缺少的东西,对于理论知识学习不够扎实的我深感“书到用时方恨少”!认真思考才能找到出路,当初没有思路,诚如举步维艰,茫茫大地,不见道路。在对理论知识梳理掌握之后,茅塞顿开,柳暗花明,思路如泉涌,高歌“条条大路通罗马”。顿悟,没有思考便无出路,雨后才能见彩虹。失败是成功之母。不经历多次调试,是不可能得到完好的程序的。至善至美,是人类永恒的追求。但是,不从忘却“金无足赤,人无完人”,我们换种思维方式,去恶亦是至善,改错亦为至美。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。实践课诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门思辨课,给了我许多道,给了我很多思,给了我莫大的空间。至于建议,一言以蔽之,大学教育当如此。我是一个急性子的人,看到那么复杂知识,我就不想做了,不过为了搞好课程设计,我硬是耐心完成每一个细节,我坚持一天呆在实验室10多个小
本文标题:基于AT89C51单片机简易计算器的设计
链接地址:https://www.777doc.com/doc-2847055 .html