基于51单片机的计算器(附Proteus仿真图且程序有详细注释)
(完整版)基于51单片机的数码管简易计算器

基于51/52单片机的简易计算器制作11级自动化2班王栎斐宋为为闫巨东一、题目利用单片机芯片STC89C52、四位八段共阳数码管及已制作好的电路板等器件设计制作一个计算器。
二、任务与要求要求计算器能实现加减乘除四种运算具体如下1. 加法:四位整数加法计算结果若超过八位则显示计算错误2. 减法:四位整数减法计算结果若超过八位则显示计算错误3. 乘法:多位整数乘法计算结果若超过四位则显示计算错误4. 除法:整数除法5. 有清除功能三、课程设计简述总体设计思路简述1.按照系统设计的功能的要求初步确定设计系统由主控模块、显示模块、键扫描接口电路共三个模块组成。
主控芯片使用STC89C52单片机。
2.键盘电路采用4*4矩阵键盘电路。
3.显示模块采用共阳极数码管构成。
四、硬件电路五、软件编程部份#include<reg52.h>#define uchar unsigned char#define uint unsigned int//uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共阴极// 0 1 2 3 4 5 6 7 8 9 熄灭-//uchar code loc[]={0xff,0xfe,0xfd,0xfb,0xf7};//uchar code ero[]={0x79,0x50,0x5c};uchar code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x40};//共阳极uchar code loc[]={0x00,0x80,0x40,0x20,0x10};uchar code ero[]={~0x79,~0x50,~0x5c};uint n=0,n1=0,n2=0; //赋初值uchar flag=0; //计算类型选择关键字void delay(int t);void display(int n);void error();main(){while(1){uchar temp;//第一行检测P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xfe;if(temp!=0xfe){temp=P3;switch(temp){case 0xee:n1=0;n2=0;n=0;flag=0;break; //清零case 0xde:n1=10*n1+0;n=n1;break;case 0xbe: 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;case 0x7e: // +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){case 0xed:n1=10*n1+1;n=n1;break; //4case 0xdd:n1=10*n1+2;n=n1;break; //5case 0xbd:n1=10*n1+3;n=n1;break; //6case 0x7d:// -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){case 0xeb:n1=10*n1+4;n=n1;break;case 0xdb:n1=10*n1+5;n=n1;break;case 0xbb:n1=10*n1+6;n=n1;break;case 0x7b: // *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){case 0xe7:n1=10*n1+7;n=n1;break; //7case 0xd7:n1=10*n1+8;n=n1;break; //8case 0xb7:n1=10*n1+9;n=n1;break; //9case 0x77: // /n2=n1;n1=0;flag=4;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}display(n);}}//延时函数void delay(int t){int x,y;for(x=0;x<t;x++)for(y=0;y<t;y++);}//数码管显示void display(int n){//溢出处理uchar g,s,b,q;int abs;if((n>9999)||(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((n<0)&&(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%10>0)||(abs/100%10>0)){P0=num[s];P2=loc[3];;delay(2);P2=loc[0];delay(2);if((abs/100%10>0)){P0=num[b];P2=loc[2];delay(2);P2=loc[0];delay(2);if((abs/1000%10>0)){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);}}}//溢出显示void error(){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单片机的计算器设计

基于51单片机的计算器设计计算器作为一种常用的电子设备,广泛应用于各个领域。
在本文中,我们将基于51单片机来设计一个简单的计算器,并对其进行详细介绍。
一、设计目标我们所设计的计算器需要具备以下功能:1.实现基本的算术运算,包括加、减、乘、除等;2.具备显示功能,能够将输入和运算结果以数字的形式显示在液晶屏上;3.提供清零和删除功能,方便计算器的操作;4.具备较高的计算精度和稳定性。
二、硬件设计计算器的硬件设计主要包括键盘输入、液晶屏输出和计算程序控制三个部分。
1.键盘输入为了简化设计的复杂度,我们采用矩阵键盘来实现输入功能。
矩阵键盘由多个行和多个列交叉连接而成,通过扫描行和列的方式来检测键盘输入的按键信息。
2.液晶屏输出我们选择16x2字符液晶显示屏来作为计算结果的输出设备。
这种液晶屏可以显示16个字符,每个字符由5x8像素点阵组成,具备较好的显示效果。
3.计算程序控制我们将基于51单片机来编写计算器的计算程序,并通过电路连接键盘输入和液晶屏输出设备。
通过读取键盘输入的按键信息,计算程序能够判断用户输入的数字和操作符,并进行相应的计算操作。
最后,计算结果将以数字的形式显示在液晶屏上。
三、软件设计计算器的软件设计主要包括键盘扫描与输入处理、计算程序控制和液晶屏显示三个模块。
1.键盘扫描与输入处理通过循环扫描矩阵键盘的行和列,可以得到按键信息。
根据按键信息的不同,我们可以判断用户输入的数字和操作符,并将其传递给计算程序模块进行处理。
同时,我们需要对一些特殊按键(如清零和删除)做特殊处理。
2.计算程序控制计算程序模块将根据键盘输入的数字和操作符,进行相应的算术运算。
我们可以采用栈的数据结构来处理运算符和运算数,以实现复杂的算术运算。
3.液晶屏显示计算结果将以数字的形式显示在液晶屏上。
我们可以通过51单片机的GPIO口控制液晶显示屏的操作,包括写入指令和写入数据。
通过设定光标位置及写入数字数据,可以将计算结果显示在液晶屏的指定位置上。
基于51单片机的简易计算器

基于51单片机的简易计算器51单片机是一种广泛应用于嵌入式系统中的常用微控制器。
我们可以利用51单片机的强大功能和丰富的外设资源,设计一个简易计算器。
这个计算器可以进行基本的加减乘除运算,并且具备显示结果的功能。
首先,我们需要准备一块51单片机开发板,一块1602液晶显示屏模块,以及一些按键开关和电阻。
我们可以将运算器主要分为以下几个模块:数码管显示模块、键盘输入模块、运算模块和存储模块。
数码管显示模块:我们使用1602液晶显示屏模块来显示计算器的结果。
我们可以通过51单片机的IO口,将计算结果发送给液晶显示屏模块,实现结果的显示。
键盘输入模块:我们可以使用几个按键开关来实现数字和运算符的输入。
通过对按键的检测,我们可以将用户输入的数字和运算符转化为字符形式,并保存到内存中。
运算模块:我们需要根据用户输入的数字和运算符,进行相应的运算。
我们可以使用栈来实现这个功能。
栈是一种常用的数据结构,具有"先进后出"的特点。
我们可以将用户输入的数字和运算符按照一定的规则入栈,然后按照相应的顺序进行出栈和运算。
最后将结果保存到内存中。
存储模块:我们可以使用内部RAM来保存运算结果。
51单片机的内部RAM具有一定的存储能力,可以满足我们的基本需求。
在编写程序时,我们可以使用汇编语言或者C语言。
通过合理的编程,我们可以实现计算器的各项功能。
总结一下,基于51单片机的简易计算器主要包括数码管显示模块、键盘输入模块、运算模块和存储模块。
我们可以通过合理的编程,将这些模块相互配合,实现一个功能完善的计算器。
这个计算器不仅可以进行基本的加减乘除运算,还可以显示结果,方便用户进行计算。
基于msc51单片机实现的四位4乘4矩阵键盘计算器的C语言程序及其PROTUES电路和仿真

单片机原理及接口技术课程设计报告设计题目:计算器设计学号:100230205姓名:费博文指导教师:张扬信息与电气工程学院二零一三年七月计算器设计单片机体积小,功耗小,价格低,用途灵活,无处不在,属专用计算机。
是一种特殊器件,需经过专门学习方能掌握应用,应用中要设计专用的硬件和软件。
近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。
与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题。
影响可靠性的因素是多方面的,如构成系统的元器件本身的可靠性、系统本身各部分之间的相互耦合因素等。
其中系统的抗干扰性能是系统可靠性的重要指标。
数学是科技进步的重要工具,数据的运算也随着科技的进步越发变得繁琐复杂,计算器的出现可以大大解放人在设计计算过程中的工作量,使计算的精度、速度得到改善,通过msc51单片机,矩阵键盘和LED数码管可以实现简单的四位数的四则运算和显示,并当运算结果超出范围时予以报错。
注:这一部分主要描述题目的背景和意义,对设计所采取的主要方法做一下简要描述。
字数不要太多,300-500字。
另注:本文要当做模板使用,不要随意更改字体、字号、行间距等,学会使用格式刷。
文中给出的各项内容都要在大家的报告中体现,可采用填空的方式使用本模板。
1. 设计任务结合实际情况,基于AT89C51单片机设计一个计算器。
该系统应满足的功能要求为:(1) 实现简单的四位十进制数字的四则运算;(2) 按键输入数字,运算法则;(3) LED数码管移位显示每次输入的数据和运算结果;(4) 当运算结果超出范围时实现报错。
主要硬件设备:AT89C51单片机、LED数码管、矩阵键盘。
注:这一部分需要写明系统功能需求,用到的主要硬件(参考实验箱的说明书)。
2. 整体方案设计计算器以AT89C51单片机作为整个系统的控制核心,应用其强大的I/O功能和计算速度,构成整个计算器。
基于51单片机计算器设计

单片机设计报告设计题目:计算器学院:班级:学生姓名:指导教师:成绩:目录第1章绪论 (2)1.1 课题简介 (2)1.2 设计目的 (2)1.3 设计任务 (2)第2章电路结构及工作原理 (4)2.1 总体设计方案 (4)2.2 51系列单片机简介 (4)2.3 矩阵按键 (5)2.4 LCD显示 (6)2.5运算模块 (7)2.6总设计图 (7)第3章软件设计 (8)3.1软件流程图 (8)3.1.1 键盘模块设计流程图 (8)3.1.2显示模块流程图 (9)3.1.3计算模块程序流程 (9)3.2程序设计 (10)第4章调试与仿真 (20)4.1 C51单片机软件开发系统Keil (20)4.2 proteus的操作 (20)结论 (21)心得体会 (22)致谢 (23)参考文献 (24)第1章绪论1.1 课题简介当今社会,随着人们物质生活的不断提高,电子产品已经走进了家家户户,无论是生活还是学习,还是娱乐和消遣几乎样样都离不开电子产品,大型复杂的计算能力是人脑所不能胜任的,而且比较容易出错。
计算器作为一种快速通用的计算工具方便了用户的使用。
计算器可谓是我们最亲密的电子伙伴之一。
本设计着重在于分析计算器软件可开发过程中的环节和步骤,并从时间经验出发对计算器设计做了详细的分析和研究。
单片机由于其微小的体积和极低的成本,广泛的应用于家电、工业控制等领域中。
在工业生产中,单片微型计算机是微型计算机的一个重要的分支,也是颇具生命力的机种。
单片微型计算机简称单片机,特别适用于控制领域,故又称微控制器。
本系统就是充分利用了AT89C51芯片的I/O引脚。
系统以采用51单片机实现能根据实际输入值显示并存储的功能,计算程序是参照课件。
至于数和功能,如果需要可以通过设计扩充系统来实现。
1.2设计目的通过本次项目设计,应用所学相关知识资料,来完成简易计算器的设计,以达到理论与实际更好相结合进一步提高综合运用所学知识和设计能力的目的。
做一个计算器_用51单片机做一个简单的计算器小程序

做⼀个计算器_⽤51单⽚机做⼀个简单的计算器⼩程序⼀:硬件仿真图分别为8位数码管和4位数码管注意:本仿真案例有偿提供,请点击⽂章最下⽅的阅读原⽂,查看仿真图和程序下载地址。
本仿真仅供参考,如有需要修改电路和程序,请联系管理员有偿修改。
当然,如果你动⼿能⼒强,完全可以按照本⽂提供的电路图和程序源码⾃⾏搭建。
硬件部分⽐较简单,当键盘按键按下时它的那⼀⾏、那⼀列的端⼝为低电平。
因此,只要扫描⾏、列端⼝是否都为低电平就可以确定是哪个键被按下。
本计算器是以80C51单⽚机为核⼼构成的简易计算器系统。
该系统通过单⽚机控制,实现对4*4键盘扫描进⾏实时的按键检测,并把检测数据和计算结果存储下来,显⽰在LED数码管上,并可实现清零。
整个系统主要可分为四个主要功能模块:功能模块⼀:实时键盘扫描;功能模块四:清零整个计算器系统的⼯作过程为:⾸先初始化参数,送LED低位显⽰“0”,功能键位不显⽰。
然后扫描键盘看是否有键输⼊,若有,读取键码。
判断键码是数字键、清零键还是“+” 、“—” 、“*” “/” ,是数值键则送LED显⽰并保存数值,是清零键则做清零处理,是功能键则⼜判断是“=”、清零、还是运算键,若是“=”则计算最后结果并送LED显⽰,若是运算键则保存相对运算程序的⾸地址,若是清零键则跳转回初始化阶段使所有值清零。
⼆、主程序流程图程序的主要思想是:将按键抽象为字符,然后就是对字符的处理。
将操作数分别转化为字符串存储,操作符存储为字符形式。
然后调⽤compute()函数进⾏计算并返回结果。
具体程序及看注释还有流程图。
三:键盘扫描程序流程图四:显⽰程序流程图五:程序源码#include#include /* isdigit()函数 */#include /* atoi()函数 */#define uchar unsigned char#define uint unsigned intuchar operand1[9], operand2[9]; /* 操作数 */uchar operator; /* 操作符 */void delay(uint);uchar keyscan();void disp(void);void buf(uint value);uint compute(uint va1,uint va2,uchar optor);uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; /* 字符码表 */uchar dbuf[8] = {10,10,10,10,10,10,10,10}; /* 显⽰缓存 */ /* 延时函数 */void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*******************************************键盘扫描程序将按键转化为字符并作为输出'$','#'分别表⽰清零键和没有键按下*******************************************/uchar keyscan(){uchar skey; /* 按键值标记变量 *//***********************扫描键盘第1⾏while((P1 & 0xf0) != 0xf0) /* 有按键按下 */ {delay(3); /* 去抖动延时 */while((P1 & 0xf0) != 0xf0) /* 仍有键按下 */{switch(P1) /* 识别按键并赋值 */{case 0xee: skey = '7'; break;case 0xde: skey = '8'; break;case 0xbe: skey = '9'; break;case 0x7e: skey = '/'; break;default: skey = '#';}while((P1 & 0xf0) != 0xf0) /* 等待按键松开 */;}}/***********************扫描键盘第2⾏************************/P1 = 0xfd;while((P1 & 0xf0) != 0xf0){delay(3);while((P1 & 0xf0) != 0xf0){switch(P1){case 0xed: skey = '4'; break;case 0xdd: skey = '5'; break;case 0xbd: skey = '6'; break;case 0x7d: skey = '*'; break;while((P1 & 0xf0) != 0xf0) ;}}/***********************扫描键盘第3⾏************************/P1 = 0xfb;while((P1 & 0xf0) != 0xf0) {delay(3);while((P1 & 0xf0) != 0xf0) {switch(P1){case 0xeb: skey = '1'; break; case 0xdb: skey = '2'; break; case 0xbb: skey = '3'; break; case 0x7b: skey = '-'; break; default: skey = '#';}while((P1 & 0xf0) != 0xf0) ;}}/***********************扫描键盘第4⾏************************/P1 = 0xf7;while((P1 & 0xf0) != 0xf0) {delay(3);{case 0xe7: skey = '$'; break;case 0xd7: skey = '0'; break;case 0xb7: skey = '='; break;case 0x77: skey = '+'; break;default: skey = '#';}while((P1 & 0xf0) != 0xf0);}}return skey;}void main(){uint value1, value2, value; /* 数值1,数值2,结果 */uchar ckey, cut1 = 0, cut2 = 0; /* ckey键盘输⼊字符 */ uchar operator; /* 运算符 */uchar i, bool = 0;init: /* goto语句定位标签 */buf(0); /* 初始化 */disp();value = 0;cut1 = cut2 = 0;bool = 0;for(i = 0;i < 9;i++){operand1[i] = '\0';operand2[i] = '\0';} /* 初始化 */while(1){ /* isdigit函数,字符是阿拉伯数字返回⾮0值,否则返回0 */if(isdigit(ckey)){switch(bool){case 0:operand1[cut1] = ckey;operand1[cut1+1] = '\0';value1 = atoi(operand1); /* atoi函数,将字符串转化为,int整数 */ cut1++;buf(value1);disp();break;case 1:operand2[cut2] = ckey;operand2[cut2+1] = '\0';value2 = atoi(operand2);cut2++;buf(value2);disp();break;default: break;}}else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/'){bool = 1;operator = ckey;buf(0);dbuf[7] = 10;disp();{value = compute(value1,value2,operator);buf(value);disp();while(1) /* 计算结束等待清零键按下 */ {ckey = keyscan();if(ckey == '$') /* 如果有清零键按下跳转到开始 */ goto init;else{buf(value);disp();}}}else if(ckey == '$'){ goto init;}}disp();}}/******************************************运算函数输⼊:操作数和操作符输出:计算结果*******************************************/uint compute(uint va1,uint va2,uchar optor){uint value;switch(optor){case '*' : value = va1*va2; break; case '/' : value = va1/va2; break; default : break;}return value;}/******************************************* 更新显⽰缓存输⼊:⽆符号整数输出:将输⼊送⼊显⽰缓存*******************************************/ void buf(uint val){uchar i;if(val == 0){dbuf[7] = 0;i = 6;}elsefor(i = 7; val > 0; i--){dbuf[i] = val % 10;val /= 10;}for( ; i > 0; i--)dbuf[i] = 10;}/******************************************* 显⽰函数*******************************************/ void disp(void)bsel=0x01;for(n=0;n<8;n++) {P2=bsel;P0=table[dbuf[n]]; bsel=_crol_(bsel,1); delay(3);P0=0xff;}}。
基于proteus的AT89C51单片机实现计算器的加减乘数开方等功能

目录一、任务说明 (2)二、原理图绘制说明 (3)三、流程图绘制以及说明 (5)1显示程序设计 (5)2键盘识别程序设计 (6)3运算程序设计 (8)4风鸣器程序设计 (9)四、PROTEUS仿真说明 (10)五、课程设计体会 (15)附I:计算器电路原理图 (16)附II:源程序代码 (17)参考文献 (34)一、任务说明本设计是一个实现加、减、乘、除的计算器,它的硬件主要由四部分组成,一个AT89C51单片机芯片,一个八位共阳极的数码管,一个四乘四的键盘,一个排阻做P0口的上拉电阻,它可以实现结果低于65535的加、减、乘、除运算。
采用动态显示,由八位共阳极数码管通过P0口,P2口与单片机相连,数码管的A,B,C,D,E,F,G,DP分别依次与单片机的P0.0—P0.7相连,P0口做为字码控制端,数码管的1,2,3,4,5,6,7,8各引脚分别与单片机的P2.0—P2.7相连,P2口做为数码管的位控制端,动态显示是每次数码管只显示一位,由于人的视觉停留是0.05到0.2秒之间,当数码管依次点亮各个位时,使循环的频率高于人的视觉停留时间,人们就会认为数码管是同时点亮的,就可以达到动态显示的效果。
采用4*4键盘。
采用软件识别键值并执行相应的操作,键盘的第0行到第3行依次与单片机的P3.4—P3.7管脚相连,键盘的第0列到第3列依次与单片机的P1.0—P1.3管脚相连,程序运行时依次扫描各行,查询是否有键按下,如果有则进入键盘识别处理程序,实现相应的运算,然后通过数码管输出结果,如果没有按键就调用显示程序显示一个0,等待按键按下,在进入按键扫描程序。
这样循环执行。
基本功能如下:1.计算器可显示8位数字,开机运行时,只有数码管最低位显示为“0”,其余位全部不显示;2.第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三次按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音,并且输入的第九个数不接收,仍然显示原来的八位数;3.可以对计算结果小于65535的两个无符号数进行+、-、*、/运算,并显示计算结果,如果输入的预计算的数超过65535,则运算时报错,显示“ERROR”,如果结果超过65535仍然报错,显示“ERROR”,以提示使用者输入错误,应清零后在从新输入。
基于51单片机的计算器设计

目录第一章引言 (3)1、1 简述简易计算器、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、31、2 本设计主要任务、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、31、3 系统主要功能、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、4第二章系统主要硬件电路设计、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、42、1 系统的硬件构成及功能、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、42、2 键盘电路设计、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、52、3 显示电路设计、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、6第三章系统软件设计、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、73、1 计算器的软件规划、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、73、2 键盘扫描的程序设计、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、73、3 显示模块的程序设计、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、83、4 主程序的设计、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、93、5 软件的可靠性设计、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、9第四章调试、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、9 第五章结束语、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、10参考文献、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、11 附录源程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、11第一章引言1、1 简述简易计算器近几年单片机技术的发展很快,其中电子产品的更新速度迅猛。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
while(temp!=0xf0)
{
temp=P1;temp=temp&0xf0;
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P1;
x--;
delay(3);
}
}
}
else if ((flag1==1)&&(flag2==1))
{
for(i=7;i>=px3;i--)
{
display(i,RESUIT[i]);
delay(3);
}
}
}
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P1;
switch(temp)
{
case 0xee: key=0;flag=1;break;
case 0xde: key=1;flag=1;break;
case 0xbe: key=2;flag=1;break;
{
k=k*10;
}
x1=x1+k;
}
x1=x1+DATA1[px1-1];
for(i=0;i<(px2-1);i++) //把第二个数组中的数处理成十进制数
{
k=DATA2[i];
for(j=0;j<(px2-i-1);j++)
{
k=k*10;
}
x2=x2+k;
}
x2=x2+DATA2[px2-1];
case 15 : f1=0;f2=0;f3=0;f4=1;break;// "/"
}
}
}
void DisplayHandle() //将数据显示在数码管上
{
uchar i,x;
if((flag1==0)&&(flag2==0))
{
x=px1;
if(px1==0) display(7,0);
else
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P1;
switch(temp)
{
case 0xeb: key=8; flag=1;break;
case 0xdb: key=9; flag=1;break;
case 0xbb: key=10;flag1=1;display(7,0);break;
{
case 0xed: key=4;flag=1;break;
case 0xdd: key=5;flag=1;break;
case 0xbd: key=6;flag=1;break;
case 0x7d: key=7;flag=1;break;
}
while(temp!=0xf0)
{
temp=P1;temp=temp&0xf0;
}
while(temp!=0xf0)
{
temp=P1;temp=temp&0xf0;
}
}
}
void DataOper()
{
uchar i,j,m=0;
lint k=0;
for(i=0;i<(px1-1);i++) //把第一个数组中的数处理成十进制数
{
k=DATA1[i];
for(j=0;j<(px1-i-1);j++)
switch(temp)
{
case 0xe7: key=12;flag2=1;Init();break;
case 0xd7: key=13;flag2=1;DataOper();break;
case 0xb7: key=14;flag1=1;display(7,0);break;
case 0x77: key=15;flag1=1;display(7,0);break;
{
DATA2[px2]=key;
px2++;
flag=0;
}
else i(key)
{
case 10 : f1=1;f2=0;f3=0;f4=0;break;// "+"
case 11 : f1=0;f2=1;f3=0;f4=0;break;// "-"
case 14 : f1=0;f2=0;f3=1;f4=0;break;// "*"
px3=m;
}
void DataHandle() //把每次按键的结果记录下来,并存到适当的位置
{
if((key<10)&&(flag==1)&&(flag1==0))
{
DATA1[px1]=key;
px1++;
flag=0;
}
else if((key<10)&&(flag==1)&&(flag1==1))
RESUIT[2]=(y%1000000)/100000;
RESUIT[3]=(y%100000)/10000;
RESUIT[4]=(y%10000)/1000;
RESUIT[5]=(y%1000)/100;
RESUIT[6]=(y%100)/10;
RESUIT[7]=y%10;
while(!RESUIT[m]) m++;
{
for(i=0;i<px1;i++)
{
display(8-x,DATA1[i]);
x--;
delay(5);
}
}
}
else if((flag1==1)&&(flag2==0))
{
x=px2;
if(px2==0) display(7,0);
else
{
for(i=0;i<px2;i++)
{
display(8-x,DATA2[i]);
case 0x7e: key=3;flag=1;break;
}
while(temp!=0xf0)
{
temp=P1;temp=temp&0xf0;
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P1;
switch(temp)
{
uchar i;
px1=0;px2=0;px3=0;
flag=0;flag1=0;flag2=0;flag3=0;
f1=0;f2=0;f3=0;f4=0;
x1=0;x2=0;y=0;
for(i=0;i<8;i++)
{DATA1[i]=0;DATA2[i]=0;RESUIT[i]=0;}
}
void delay(msx) //msx为延时毫秒数
uchar temp,key;
lint x1=0,x2=0,y=0; //输入的数及其结果
void Init(); //系统初始化
void keyscan(); //键盘检测
void delay(uint); //延时
void DataOper(); //数据运算
void DataHandle(); //数据接收
0x7f,0x6f
};
uchar DATA1[8]={0,0,0,0,0,0,0,0}; //第一个数
uchar DATA2[8]={0,0,0,0,0,0,0,0}; //第二个数
uchar RESUIT[8]={0,0,0,0,0,0,0,0};//结果
uchar px1=0,px2=0,px3=0,flag=0,flag1=0,flag2=0,flag3=0,f1=0,f2=0,f3=0,f4=0; //各全局变量
if(f1==1) y=x1+x2; //根据标志位进行运算
else if(f2==1) y=x1-x2;
else if(f3==1) y=x1*x2;
else if(f4==1) y=x1/x2;
RESUIT[0]=y/10000000; //把各位分离出来存入结果数组中
RESUIT[1]=(y%10000000)/1000000;
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define lint unsigned long int
uchar SMG[10]={0x3f,0x06,0x5b,0x4f, //数码管取模
0x66,0x6d,0x7d,0x07,
case 2 :P2=0xfb;break;
case 3 :P2=0xf7;break;
case 4 :P2=0xef;break;
case 5 :P2=0xdf;break;
case 6 :P2=0xbf;break;
case 7 :P2=0x7f;break;
}
P3=SMG[m];
}
void keyscan() //矩阵键盘扫描子函数