您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于51单片机的数码管简易计算器
基于51/52单片机的简易计算器制作11级自动化2班王栎斐宋为为闫巨东一、题目利用单片机芯片STC89C52、四位八段共阳数码管及已制作好的电路板等器件设计制作一个计算器。二、任务与要求要求计算器能实现加减乘除四种运算具体如下1.加法:四位整数加法计算结果若超过八位则显示计算错误2.减法:四位整数减法计算结果若超过八位则显示计算错误3.乘法:多位整数乘法计算结果若超过四位则显示计算错误4.除法:整数除法5.有清除功能三、课程设计简述总体设计思路简述1.按照系统设计的功能的要求初步确定设计系统由主控模块、显示模块、键扫描接口电路共三个模块组成。主控芯片使用STC89C52单片机。2.键盘电路采用4*4矩阵键盘电路。3.显示模块采用共阳极数码管构成。四、硬件电路五、软件编程部份#includereg52.h#defineucharunsignedchar#defineuintunsignedint//ucharcodenum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共阴极//0123456789熄灭-//ucharcodeloc[]={0xff,0xfe,0xfd,0xfb,0xf7};//ucharcodeero[]={0x79,0x50,0x5c};ucharcodenum[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x40};//共阳极ucharcodeloc[]={0x00,0x80,0x40,0x20,0x10};ucharcodeero[]={~0x79,~0x50,~0x5c};uintn=0,n1=0,n2=0;//赋初值ucharflag=0;//计算类型选择关键字voiddelay(intt);voiddisplay(intn);voiderror();main(){while(1){uchartemp;//第一行检测P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xfe;if(temp!=0xfe){temp=P3;switch(temp){case0xee:n1=0;n2=0;n=0;flag=0;break;//清零case0xde:n1=10*n1+0;n=n1;break;//0case0xbe:if(flag==1)n=n2+n1;//=if(flag==2)n=n2-n1;if(flag==3)n=n2*n1;if(flag==4)n=n2/n1;n1=0;break;case0x7e://+n2=n1;n1=0;flag=1;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第二行P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case0xed:n1=10*n1+1;n=n1;break;//4case0xdd:n1=10*n1+2;n=n1;break;//5case0xbd:n1=10*n1+3;n=n1;break;//6case0x7d://-n2=n1;n1=0;flag=2;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第三行P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case0xeb:n1=10*n1+4;n=n1;break;case0xdb:n1=10*n1+5;n=n1;break;case0xbb:n1=10*n1+6;n=n1;break;case0x7b://*n2=n1;n1=0;flag=3;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第四行P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case0xe7:n1=10*n1+7;n=n1;break;//7case0xd7:n1=10*n1+8;n=n1;break;//8case0xb7:n1=10*n1+9;n=n1;break;//9case0x77:///n2=n1;n1=0;flag=4;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}display(n);}}//延时函数voiddelay(intt){intx,y;for(x=0;xt;x++)for(y=0;yt;y++);}//数码管显示voiddisplay(intn){//溢出处理ucharg,s,b,q;intabs;if((n9999)||(n-999))error();//正数if((n=0)&&(n=9999)){g=n%10;s=n/10%10;b=n/100%10;q=n/1000%10;P0=num[g];delay(5);P2=loc[4];delay(2);P2=loc[0];delay(3);if(n=10){P0=num[s];P2=loc[3];delay(2);P2=loc[0];delay(3);}if(n=100){P0=num[b];P2=loc[2];delay(2);P2=loc[0];delay(3);}if(n=1000){P0=num[q];P2=loc[1];delay(2);P2=loc[0];delay(3);}}//负数if((n0)&&(n=-999)){abs=-n;g=abs%10;s=abs/10%10;b=abs/100%10;q=abs/1000%10;P0=num[g];P2=loc[4];delay(2);P2=loc[0];delay(2);if((abs/10%100)||(abs/100%100)){P0=num[s];P2=loc[3];;delay(2);P2=loc[0];delay(2);if((abs/100%100)){P0=num[b];P2=loc[2];delay(2);P2=loc[0];delay(2);if((abs/1000%100)){P0=num[q];P2=loc[1];delay(2);P2=loc[0];delay(2);}else{P0=num[11];P2=loc[1];delay(2);P2=loc[0];delay(2);}}else{P0=num[11];P2=loc[2];delay(2);P2=loc[0];delay(2);}}else{P0=num[11];P2=loc[3];delay(2);P2=loc[0];delay(2);}}}//溢出显示voiderror(){P2=loc[1];P0=ero[0];delay(2);P2=loc[0];delay(3);P2=loc[2];P0=ero[1];delay(2);P2=loc[0];delay(3);P2=loc[3];P0=ero[1];delay(2);P2=loc[0];delay(3);P2=loc[4];P0=ero[2];delay(2);P2=loc[0];delay(3);}
本文标题:基于51单片机的数码管简易计算器
链接地址:https://www.777doc.com/doc-1894574 .html