您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于单片机的计算器设计(1602完整版)
3.1硬件连接图3-1所示为简易计算器的电路原理图。P3口用于键盘输入,接4*4矩阵键盘,键值与键盘的对应表如表----所示,p0口和p2口用于显示,p2口用于显示数值的高位,po口用于显示数值的低位。图3-1简易计算器电路原理图键值与功能对应表键值0123456789+-×/=ON/C功能0123456789+-×÷=清零表3-13.2计算器的软件设计#includereg51.h//头文件#defineuintunsignedint//#defineucharunsignedcharsbitlcden=P2^3;//定义引脚sbitrs=P2^4;sbitrw=P2^0;sbitbusy=P0^7;chari,j,temp,num,num_1;longa,b,c;//a,第一个数b,第二个数c,得数floata_c,b_c;ucharflag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号ucharcodetable[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0};ucharcodetable1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30};voiddelay(ucharz)//延迟函数{uchary;for(z;z0;z--)for(y=0;y110;y++);}voidcheck()//判断忙或空闲{do{P0=0xFF;rs=0;//指令rw=1;//读lcden=0;//禁止读写delay(1);//等待,液晶显示器处理数据lcden=1;//允许读写}while(busy==1);//判断是否为空闲,1为忙,0为空闲}voidwrite_com(ucharcom)//写指令函数{P0=com;//com指令付给P0口rs=0;rw=0;lcden=0;check();lcden=1;}voidwrite_date(uchardate)//写数据函数{P0=date;rs=1;rw=0;lcden=0;check();lcden=1;}voidinit()//初始化{num=-1;lcden=1;//使能信号为高电平write_com(0x38);//8位,2行write_com(0x0c);//显示开,光标关,不闪烁*/write_com(0x06);//增量方式不移位显竟獗暌贫柚?write_com(0x80);//检测忙信号write_com(0x01);//显示开,光标关,不闪烁num_1=0;i=0;j=0;a=0;//第一个参与运算的数b=0;//第二个参与运算的数c=0;flag=0;//flag表示是否有符号键按下,fuhao=0;//fuhao表征按下的是哪个符号}voidkeyscan()//键盘扫描程序{P3=0xfe;if(P3!=0xfe){delay(20);延迟20msif(P3!=0xfe){temp=P3&0xf0;switch(temp){case0xe0:num=0;break;case0xd0:num=1;break;case0xb0:num=2;break;case0x70:num=3;break;}}while(P3!=0xfe);if(num==0||num==1||num==2)//如果按下的是'7','8'或'9{if(j!=0){write_com(0x01);j=0;}if(flag==0)//没有按过符号键{a=a*10+table[num];}else//如果按过符号键{b=b*10+table[num];}}else//如果按下的是'/'{flag=1;fuhao=4;//4表示除号已按}i=table1[num];write_date(0x30+i);}P3=0xfd;if(P3!=0xfd){delay(5);if(P3!=0xfd){temp=P3&0xf0;switch(temp){case0xe0:num=4;break;case0xd0:num=5;break;case0xb0:num=6;break;case0x70:num=7;break;}}while(P3!=0xfd);if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'{if(j!=0){write_com(0x01);j=0;}if(flag==0)//没有按过符号键{a=a*10+table[num];}else//如果按过符号键{b=b*10+table[num];}}else//如果按下的是'/'{flag=1;fuhao=3;//3表示乘号已按}i=table1[num];write_date(0x30+i);}P3=0xfb;if(P3!=0xfb){delay(5);if(P3!=0xfb){temp=P3&0xf0;switch(temp){case0xe0:num=8;break;case0xd0:num=9;break;case0xb0:num=10;break;case0x70:num=11;break;}}while(P3!=0xfb);if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'{if(j!=0){write_com(0x01);j=0;}if(flag==0)//没有按过符号键{a=a*10+table[num];}else//如果按过符号键{b=b*10+table[num];}}elseif(num==11)//如果按下的是'-'{flag=1;fuhao=2;//2表示减号已按}i=table1[num];write_date(0x30+i);}P3=0xf7;if(P3!=0xf7){delay(5);if(P3!=0xf7){temp=P3&0xf0;switch(temp){case0xe0:num=12;break;case0xd0:num=13;break;case0xb0:num=14;break;case0x70:num=15;break;}}while(P3!=0xf7);switch(num){case12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是清零break;case13:{//按下的是0if(flag==0)//没有按过符号键{a=a*10;write_date(0x30);P1=0;}elseif(flag==1)//如果按过符号键{b=b*10;write_date(0x30);}}break;case14:{j=1;if(fuhao==1){write_com(0x80+0x4f);//按下等于键,光标前进至第二行最后一个显示处write_com(0x04);//设置从后住前写数据,每写完一个数据,光标后退一格c=a+b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);//再写=a=0;b=0;flag=0;fuhao=0;}elseif(fuhao==2){write_com(0x80+0x4f);//光标前进至第二行最后一个显示处write_com(0x04);//设置从后住前写数据,每写完一个数据,光标后退一格(这个照理说顺序不对,可显示和上段一样)if(a-b0)c=a-b;elsec=b-a;while(c!=0){write_date(0x30+c%10);c=c/10;}if(a-b0)write_date(0x2d);write_date(0x3d);//再写=a=0;b=0;flag=0;fuhao=0;}elseif(fuhao==3){write_com(0x80+0x4f);write_com(0x04);c=a*b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}elseif(fuhao==4){write_com(0x80+0x4f);write_com(0x04);i=0;c=(long)(((float)a/b)*1000);while(c!=0){write_date(0x30+c%10);c=c/10;i++;if(i==3)write_date(0x2e);}if(a/b=0)write_date(0x30);write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}}break;case15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}break;}}}main(){init();while(1){keyscan();}}第4章仿真和调试下面用KEILuVision与porteus仿真软件实现简易计算器的仿真与调试。4.1keil软件的介绍单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。KeilC51开发系统基本知识KeilC51开发系统基本知识1.系统概述KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍KeilC51开发系统各部分功能和使用。2.KeilC51单片机软件开发系统的整体结构C51工具包的整体结构中,其中uVision与Ishell分别是C51forWindows和forDos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及A51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。3.采用KEIL开发的89c51单片机应用程序一般需要以下步
本文标题:基于单片机的计算器设计(1602完整版)
链接地址:https://www.777doc.com/doc-5121237 .html