单片机实验报告 计算器

合集下载

计算器实验报告

计算器实验报告

计算器实验报告一实验目的学习使用AT89S52单片机实现简易计算器。

二实验要求1:可以通过键盘输入,并能显示输入相对应的数字.2:能够进行加,减,乘,除准确的基本运算.3:能够进行3位或3位的以上的乘,除运算.4:自由发挥其他功能.三实验基本原理本设计利用AT89S52单片机来控制液晶显示器和矩阵式键盘,实现了简易的计算器功能。

通过键盘输入需要计算的计算式子,该式子会显示在液晶的第一行,当键入等于号后,计算结果会显示在液晶的第二行。

本设计中液晶选用1602字符型液晶显示器,显示参与运算的数字以及最终的运算结果,键盘采用 4*4 矩阵式键盘。

四实验要求实现1.硬件设计如下图:2.软件设计程序流程图:程序:#include<reg52.h>char code V[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x80,0x48,0x70,0x40,0x5c,0x0c}; // 17. 18= 19+ 20- 21x 22/char code D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};int temp,num,keyp,n1,n2,n3,n4,n5,n6,n7,n8,f;long tn,store;void delay(unsigned int x0); //延迟x0*2毫秒void display(long);void showError();void enter();void key();void main(){x: P0=0x00;tn=0;f=16;store=0;while(1){enter();if(num<23&&num>17){if(store>9999999||store<-999999)while(1){showError();key();if(keyp==1)goto x;}else display(store);}else display(tn);}}void delay(unsigned int x0){int x1,x2;for(x1=0;x1<x0;x1++)for(x2=0;x2<113;x2++);}void display(long disnum){if(disnum>=0){n1=disnum%10;if(disnum>9)n2=disnum/10%10;else n2=16;if(disnum>99)n3=disnum/100%10;else n3=16;if(disnum>999)n4=disnum/1000%10;else n4=16;if(disnum>9999)n5=disnum/10000%10;else n5=16;if(disnum>99999)n6=disnum/100000%10;else n6=16;if(disnum>999999)n7=disnum/1000000%10;else n7=16;}if(disnum<0){disnum=disnum*(-1);n1=disnum%10;if(disnum>9)n2=disnum/10%10;else n2=16;if(disnum>99)n3=disnum/100%10;else n3=16;if(disnum>999)n4=disnum/1000%10;else n4=16;if(disnum>9999)n5=disnum/10000%10;else n5=16;if(disnum>99999)n6=disnum/100000%10;else n6=16;n7=20;}n8=f;P0=V[n1];P2=D[0];delay(1);P2=D[8];P0=V[n2];P2=D[1];delay(1);P2=D[8];P0=V[n3];P2=D[2];delay(1);P2=D[8];P0=V[n4];P2=D[3];delay(1);P2=D[8];P0=V[n5];P2=D[4];delay(1);P2=D[8];P0=V[n6];P2=D[5];delay(1);P2=D[8];P0=V[n7];P2=D[6];delay(1);P2=D[8];P0=V[n8];P2=D[7];delay(1);P2=D[8]; }void showError(){P0=V[14];P2=D[5];delay(1);P2=D[8];P0=0x50;P2=D[4];delay(1);P2=D[8];P0=0x50;P2=D[3];delay(1);P2=D[8];P0=0x5c;P2=D[2];delay(1);P2=D[8];P0=0x50;P2=D[1];delay(1);P2=D[8];f=16;store=0;}void enter(){x1: key();if(keyp==1&&num<16&&num>=0){if(f==18){f=16;store=0;}if(tn<=999999)tn=tn*10+num;keyp=0;}if(keyp==1&&num<23&&num>17){if(f==19||f<=16)store=store+tn;if(f==20)store=store-tn;if(f==21){store=store*tn;}if(f==22){if(tn==0){while(1){showError();keyp=0;key();if(keyp==1)goto x1;}}else store=store/tn;}f=num;tn=0;keyp=0;}}void key(){P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(10);while(temp!=0xf0){temp=P3;keyp=1;switch(temp){case 0xe7: num=1;break;case 0xd7: num=2;break;case 0xb7: num=3;break;case 0x77: num=19;break; //+}while(temp!=0xf0) //松开跳出{temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(10);while(temp!=0xf0){keyp=1;temp=P3;//num++;if(num==10)num=0;switch(temp){case 0xeb: num=4;break;case 0xdb: num=5;break;case 0xbb: num=6;break;case 0x7b: num=20;break; //- }while(temp!=0xf0) //松开跳出{temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(10);while(temp!=0xf0){keyp=1;temp=P3;//num++;if(num==10)num=0;switch(temp){case 0xed: num=7;break;case 0xdd: num=8;break;case 0xbd: num=9;break;case 0x7d: num=21;break; //* }while(temp!=0xf0) //松开跳出{temp=P3;temp=temp&0xf0;}}}P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(10);while(temp!=0xf0){keyp=1;temp=P3;//num++;if(num==10)num=0;switch(temp){case 0xee: num=0;break;case 0xde: num=17;break; //.case 0xbe: num=18;break; //=case 0x7e: num=22;break; ///}while(temp!=0xf0) //松开跳出{temp=P3;temp=temp&0xf0;}}}}五设计总结对于我们这些实践中的新手来说,设计一个简易计算器,这是一次考验。

单片机计算器报告

单片机计算器报告

基于51单片机实验报告(计算器)一.计算器模块1.功能介绍利用8051 单片机硬件资源和常用外围电路如LCD1602,七段数码管,时钟(DS1302)温度传感器(18B20)等实现一个能做简单四则运算,并具有时钟显示,温度显示附加功能的计算器。

2.设计方案利用STC89C52为内核的单片机,PC机。

四则运算利用4*4矩阵键盘实现从0—9和运算符号的输入,并将操作过程和结果显示在LCD1602上。

时钟显示和温度显示,可以利用DS1302产生年份,月份,日期,星期,时,分,秒的数据,并将数据送往LCD1602显示,同样可以利用单片机开发板上面集成的DS18B20温度传感器来测试周围环境的温度,将获取的温度通过在LCD1602来显示。

系统设计框图3.具体实现代码计算器四则运算部分主要分为键盘扫描的键值读取,判断运算符号实现乘除优先级计算,LCD1602显示。

键盘扫描常用的有行扫描法,线反转法,此处我们用行扫描法,可以更明了读取键值。

unsigned char temp;key = null;//第一行按键P3 = 0xfe;temp = P3;temp = temp & 0xf0;if (temp != 0xf0){delay(10); //延时软件去抖动temp = P3;temp = temp & 0xf0;if (temp != 0xf0) //确认有键按下{temp = P3;switch (temp){case 0xee:key = 'D'; //读键值break;case 0xde:key = 0;break;case 0xbe:key = '=';break;case 0x7e:key = '/';break;}flag++;}}读完按键值之后我们需要读取运算的数字与运算符号,通过判断键值为数字则通过nun=nun*10+key,计算出数字,判断键值为运算符号则读出数字和键值。

单片机实践简易计算器实验报告

单片机实践简易计算器实验报告

零基础DIY单片机简易计算器实践
单片机是一种很有趣的微处理器,它广泛应用于电子产品中。

学习单片机可以帮助我们更深入理解计算机原理和底层运作。

本实验将介绍如何使用单片机来制作一个简易计算器。

所需材料:
1. 单片机开发板
2. 4位7段显示器
3. 数字按键开关
4. 杜邦线
5. 电位器
6. 板子外壳
步骤1:连接电路
将数码管和数字按键开关与单片机开发板连接。

使用杜邦线将每个组件的引脚连接到开发板的相应引脚。

电位器可用于调节数码管显示的亮度。

步骤2:编写程序
使用C语言编写程序。

程序需要识别按键输入的数字和运算符,
并根据不同的情况显示计算结果。

程序中需要使用条件语句、循环语
句和函数等基本语言结构。

步骤3:测试程序
将编写好的程序上传到单片机开发板中。

测试程序的过程中要注
意按键输入的顺序和正确性。

如果按键输入错误,程序需要能够正确
地识别并给出错误提示。

步骤4:完成外壳
将单片机开发板和数码管装进铝盒中,并将数字按键开关与外壳
相连。

在外壳上打开一个窗口,以便能看到数码管和按键。

为了美观,可以涂上一些喜欢的颜色或加上小贴纸等装饰。

通过这个实验,我们深入了解了单片机的基本原理和运作方式,
掌握了C语言编程语言基础知识,并制作了一个实用的计算器。

在实
践中,我们不仅锻炼了问题解决能力和动手能力,还增强了对电子产
品的兴趣和信心。

单片机实践简易计算器实验报告

单片机实践简易计算器实验报告

单片机实践简易计算器实验报告本次实验的目的是通过单片机实现一个简易计算器,实现加减乘除四则运算。

在实验过程中,我们使用了STC89C52单片机,通过编写程序实现计算器的功能。

实验步骤:1. 确定硬件电路连接我们需要确定硬件电路连接。

本次实验使用的是STC89C52单片机,需要将其与LCD1602液晶屏、4x4矩阵键盘、蜂鸣器等硬件连接。

具体连接方式如下:STC89C52单片机:P0口:连接LCD1602液晶屏的数据线D0-D7P1口:连接LCD1602液晶屏的控制线RS、RW、EP2口:连接4x4矩阵键盘的行线R1-R4P3口:连接4x4矩阵键盘的列线C1-C4P4口:连接蜂鸣器2. 编写程序接下来,我们需要编写程序实现计算器的功能。

程序主要分为以下几个部分:(1)LCD1602液晶屏初始化(2)4x4矩阵键盘扫描(3)计算器功能实现(4)LCD1602液晶屏显示结果3. 调试程序编写完程序后,我们需要进行调试。

在调试过程中,我们需要注意以下几点:(1)检查硬件连接是否正确(2)检查程序是否有语法错误(3)检查程序是否能够正常运行4. 实验结果经过调试,我们成功实现了一个简易计算器。

在使用过程中,用户可以通过4x4矩阵键盘输入数字和运算符,计算器会自动进行计算,并在LCD1602液晶屏上显示结果。

同时,计算器还具有清零、退格等功能,方便用户进行操作。

总结:通过本次实验,我们学习了单片机的基本原理和编程方法,掌握了如何使用单片机实现一个简易计算器。

同时,我们还学习了如何进行硬件电路连接和程序调试,提高了我们的实践能力和动手能力。

基于51单片机简易计算器课程设计报告

基于51单片机简易计算器课程设计报告

基于51单片机简易计算器课程设计报告
基于51单片机简易计算器课程设计报告
1. 研究背景
•计算器是人们日常生活和工作中常用的工具之一。

•通过设计简易计算器,可以加深学生对51单片机的理解和应用。

2. 目标和需求
•设计一个基于51单片机的简易计算器,能够进行基本的四则运算和开方运算。

•要求计算器能够显示输入和计算结果。

•要求计算器具备简单的界面和操作。

3. 设计方案
•使用51单片机作为计算器的控制核心。

•通过键盘输入数字和运算符,并显示在液晶屏上。

•根据输入的运算符,进行相应的计算,并将结果显示在液晶屏上。

4. 硬件设计
•使用51单片机作为主控芯片。

•连接液晶屏模块,用于显示输入和计算结果。

•连接键盘模块,用于输入数字和运算符。

5. 软件设计
•使用C语言进行编程。

•设计主程序,包括初始化、输入处理和计算输出等功能。

•设计函数,实现基本的四则运算和开方运算。

6. 实验结果
•成功设计并实现了基于51单片机的简易计算器。

•可以正常进行基本的四则运算和开方运算。

•输入和计算结果能够准确显示在液晶屏上。

7. 总结与展望
•通过设计这个简易计算器,学生对51单片机的理解和应用能力有了提高。

•下一步可以考虑增加更多的功能,如科学计算和数据存储等。

以上是本次基于51单片机简易计算器课程设计的报告。

通过这个实验,学生对51单片机的应用能力得到了提升,进一步增强了对计算器的理解。

在未来的课程设计中,可以进一步拓展功能,提升计算器的实用性和功能性。

51单片机简易计算器设计报告(一)

51单片机简易计算器设计报告(一)

51单片机简易计算器设计报告(一)背景介绍在数字化时代,计算器作为一种简单易用的工具,越来越得到人们的关注和热爱。

而基于51单片机的简易计算器,不仅可以成为一种学习电子技术的手段,还具有满足简单计算需求的实用性。

设计思路本计算器采用键盘输入和数码管输出的电路设计,为用户提供加、减、乘、除、小数点、退位以及等于等功能。

1.键盘输入采用矩阵键盘的方式,将所有按键按行列排列,并利用51单片机中断方式来读取键值。

2.计算处理通过编写相应的程序代码,计算出用户输入的两个数值及操作符的结果,并将结果存储在数据缓存器中,最后将其输出至数码管。

3.数码管显示根据计算结果的数据类型,将其经过相应的转换处理后,通过数码管将结果输出至用户。

设计技术1.软件编写软件编写方面,采用汇编语言进行编写,代码总长度为2.2KB 左右。

其中,以中断方式读取键值、实现数值存储与判断、计算处理、数码管的结果输出等作为关键点进行编写。

2.硬件搭建硬件搭建方面,需要按照电路图进行搭建,并将51单片机与相关周边电路进行连接。

根据设计思路,将键盘、数码管、电源、指示灯等设备按照需求进行连接。

可改进之处虽然 51单片机的简易计算器的搭建能够满足基本计算需求,但其在以下几方面还有可改进之处:•添加计算科学函数,如三角函数、对数函数等。

•改进操作方式,使其更加符合人体工程学原理。

•添加储存器,使用户能够将计算结果进行存储和调用。

总结通过本次对基于51单片机的简易计算器的设计与实现,我们深入了解了电子技术的基本概念和硬件搭建原理,并了解到了简单嵌入式系统的工作原理。

虽然该计算器在功能和效率方面还有待改进,但对于初学者来说,其对于电子技术的学习和实验还是很有价值和意义的。

•编写的汇编代码过于繁琐,可考虑使用高级语言编写以提高效率和易读性。

•在电路搭建时需注意布线的合理性,尽量避免出现干扰和信号损失的问题。

综上所述,基于51单片机的简易计算器的设计和实现虽存在一些不足,但还是很有价值的。

单片机实训计算器报告

单片机实训计算器报告

一、引言随着科技的飞速发展,单片机技术作为嵌入式系统的重要组成部分,已经在各个领域得到了广泛的应用。

为了提高学生对单片机技术的理解和实践能力,我们开展了单片机实训课程。

本次实训报告以设计一个简易计算器为例,详细介绍单片机在计算器中的应用及其设计过程。

二、实训目的1. 熟悉单片机的基本原理和编程方法。

2. 掌握单片机外围设备的接口技术。

3. 培养学生的实际动手能力和创新意识。

三、实训内容1. 设计要求本次实训要求设计一个基于单片机的简易计算器,能够实现以下功能:(1)加、减、乘、除四则运算;(2)结果显示在LCD1602显示屏上;(3)具有简单的错误处理功能。

2. 系统组成本计算器系统主要由以下几部分组成:(1)AT89C51单片机:作为系统的核心控制器,负责控制整个计算器的运行;(2)LCD1602显示屏:用于显示输入的数字、运算符和计算结果;(3)矩阵键盘:用于输入数字和运算符;(4)按键:用于控制计算器的开关、清零和退出等功能。

3. 硬件设计(1)AT89C51单片机:选用AT89C51单片机作为核心控制器,具有丰富的I/O端口和片内资源,可以满足计算器的需求。

(2)LCD1602显示屏:通过单片机的PORTD端口与LCD1602显示屏相连,实现数据显示功能。

(3)矩阵键盘:采用4x4矩阵键盘,将行线连接到单片机的PB0-PB3端口,列线连接到PB4-PB7端口。

(4)按键:设置三个按键,分别用于控制计算器的开关、清零和退出功能。

4. 软件设计(1)初始化:首先对单片机的I/O端口、LCD1602显示屏和矩阵键盘进行初始化。

(2)键盘扫描:通过扫描矩阵键盘,获取用户输入的数字和运算符。

(3)运算逻辑处理:根据用户输入的数字和运算符,进行相应的运算。

(4)结果显示:将计算结果显示在LCD1602显示屏上。

(5)错误处理:当输入错误或发生溢出时,显示错误信息。

四、实训过程1. 硬件电路搭建:根据设计要求,将AT89C51单片机、LCD1602显示屏、矩阵键盘和按键连接到一起,搭建计算器的硬件电路。

单片机实验-计算器

单片机实验-计算器

键盘功能示意:
四、实验代码 ORG 0000H SJMP START ORG 0030H START: CLR 00H CLR 01H CLR P3.0 MOV R7, #00H ; 按键次数计数器 LOOP: ACALL KEY CJNE R7, #01H, NEXT1 MOV R0, #30H ;存放第一个数的个位 MOV 31H, @R0 NEXT1: JB 00H,NEXT2 CJNE R7, #02H, NEXT2 MOV R0, #30H ;存放第一个数的十位 MOV A, #09H SUBB A, @R0 MOV32H,#00H ;异常处理 INC R7 JC NEXT2 DEC R7 MOV R2,31H MOV 31H, @R0 MOV 32H,R2 SETB 00H ;重来时要记得清 0 NEXT2: CJNE R7, #03H, NEXT3 MOV R0, #30H ; 存放操作数 有 “加减乘除”四 种情况 MOV 33H, @R0 NEXT3: CJNE R7, #04H, NEXT4 MOV R0, #30H ;存放第二个数的个位 MOV 34H, @R0 NEXT4: JB 01H,NEXT5 CJNE R7, #05H, NEXT5 MOV R0, #30H ;存放第二个数的十位 MOV A, #09H SUBB A, @R0 MOV 35H,#00H ;异常处理 INC R7 JC NEXT5 DEC R7 MOV R2,34H MOV 34H, @R0 MOV 35H,R2 SETB 01H ;重来时要记得清 0 NEXT5: CJNE R7, #06H, NEXT6 MOV R0, #30H ;存放操作数 等于号 0EH MOV 36H, @R0 NEXT6: LCALL DISPLAY CJNE R7, #06H, LOOP MOV R0, #36H CJNE @R0, #0EH, FU;存放开始计算的操作数 等待 等号 的键值 SJMP CK FU: DEC R7 LJMP LOOP ;开始计算 CK: MOV R7, #00H CLR 00H
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机原理及其应用实验报告基于51单片机的简易计算器的设计班级:12电子1班姓名:***学号:**********2015年1月6日摘要一个学期的51单片机的课程已经随着期末的到来落下了帷幕。

“学以致用”不仅仅是一句口号更应该是践行。

本设计秉承精简实用的原则,采用AT89C51单片机为控制核心,4X4矩阵键盘作为输入,LCD1602液晶作为输出组成实现了基于51单片机的简易计算器。

计算器操作方式尽量模拟现实计算器的操作方式,带有基本的运算功能和连续运算能力。

并提供了良好的显示方式,与传统的计算器相比,它能够实时显示当前运算过程和上一次的结果,更加方便用户记忆使用。

本系统制作简单,经测试能达到题目要求。

关键词:简易计算器、单片机、AT89C51、LCD1602、矩阵键盘目录一、系统模块设计........................................................................................... 错误!未定义书签。

1.1 单片机最小系统 (1)1.2 LCD1602液晶显示模块 (1)1.3 矩阵按键模块 (2)1.4 串口连接模块 (1)二、C51程序设计 (2)2.1 程序功能描述及设计思路 (2)2.1.1按键服务函数 (2)2.1.2 LCD驱动函数 (2)2.1.3 结果显示函数 (2)2.1.4状态机控制函数 (2)2.1.5串口服务函数 (2)2.2 程序流程图 (3)2.2.1系统总框图 (3)2.2.2计算器状态机流程转换图 (3)三、测试方案与测试结果 (4)3.1测试方案 (4)3.3 测试结果及分析 (7)4.3.1测试结果(仿真截图) (7)4.3.2测试分析与结论 (7)四、总结心得 (7)五、思考题 (8)附录1:整体电路原理图 (9)附录2:部分程序源代码 (10)基于51单片机的简易计算器的设计一、系统模块设计本系统主要由51单片机最小系统、串口模块、显示模块、矩阵键盘输入模块组成,下面分别论证这几个模块的选择。

1.1单片机最小系统 51单片机的最小系统包括电源、时钟电路、复位电路,搭建最小系统是实现单片操作的最基本的硬件电路要求。

由于程序上需要使用串口工作在11920的波特率,为了更好地匹配该波特率,晶振采用11.0592MHz 的晶振而不是常用的12MHz 晶振。

1.2 LCD1602液晶显示模块为了便于计算器的计算过程以及结果的显示,方案采用了LCD1602的液晶来显示。

使用液晶比数码管的优势很多,占用较少的IO 口、更低的功耗、更简单的控制过程、更强大的显示能力: 51单片机 矩阵按键LCD 液晶显示串口输出1.3 矩阵按键模块计算器的输入通过4X4的矩阵按键来实现,由于软件上做了相应的映射处理,因此该4X4按键可以实现在极少代码更改下随意安排每个按键的实际意义。

矩阵按键通过行列扫描的方式快速求出当前的按下按键并等待起弹起以防止重复触发:1.4 串口连接模块由于使用Proteus仿真,这里的串口电路进行了简化,没有使用实际中将会用于进行电平转换的232芯片,而直接使用串口观察控件进行串口接收以及显示:二、C51程序设计由于本系统对系统的响应速度要求并不高,不需要进行高速的大量数据运算操作,因此不采用汇编方式编写程序。

使用C语言编写程序能够清晰地分析系统的整体思路。

本程序的主要思想是状态机,利用状态机的不同状态对程序的流程进行分段控制,在本系统中,较大限度的提高了系统的运行效率,同时具有了便于分析、改进和查错的天然优势2.1程序功能描述与设计思路2.1.1、按键服务函数:将4X4矩阵按键封装至按键服务函数中,利用映射表(数组)对4X4的对应按键进行键值映射,这样不仅仅完成了按键判断的函数封装更便于实际操作时对按键的定义的灵活改动,另外,按键的返回值采用ASCII码形式,这样更加利于程序上的可读性;2.1.2、LCD驱动函数:按照LM016模块的操作时序编写的LM016(LCD1602液晶)的驱动函数,使用C和H文件组合的形式既完成了底层的液晶驱动又开放了操作液晶的接口函数,使整体程序更加清晰明了;2.1.3、结果显示函数:由于计算结果涉及到小数点、负数以及长度的不确定性,这里直接通过调用stdio.h中的sprintf字符串格式化函数进行格式化,得到15个字符长度的ASCII形式数据显示,并在程序中进行范围限定以避免数据过大而产生显示不完整造成结果“不正确”的现象。

同时该函数还通过调用串口输出函数对单片机串口进行输出,可在计算机上位机端得到每次的计算结果信息;2.1.4、状态机控制函数:该函数直接在main函数的内部实现,并融合状态机的程序思想,利用状态机判断计算器输入时的各种可能状态并在不同程序状态中跳转实现灵活的程序流程控制,实践表明这种方式是非常适合计算器的程序设计的,能较大限度地提高系统的运行效率;2.1.5、串口服务函数:串口服务主要负责实现单片机向计算机上位机端的数据结果输出以及灵活的字符串显示。

2.2 程序流程图2.2.1、系统总框图2.2.2、计算器状态机流程转换图三、仿真方案与仿真结果3.1仿真方案1、硬件仿真使用Proteus7.8进行硬件仿真。

2、软件仿真使用Keil4For51 Debug工具进行软件编写和仿真3、硬件软件联调利用Proteus7.8和Keil4进行联合软硬件调试,方便查错和仿真展现3.2 测试结果及分析3.2.1测试结果(仿真截图)1、加、减、乘、除基本运算展示:2、连续运算展示:3、溢出和除0判断展示:4、串口通信展示:5、开机效果显示:3.3.2测试分析与结论根据上述测试数据,综上所述,本设计总体来说可以达到大部分设计要求。

四、总结与心得经过本次的实验设计学习,又一次深刻感受到了51单片机虽然已经过去几十年,现在也不断地收到16位、32位低价单片机的冲击,但仍然是一款性能优越的单片机,在处理生活中常用的简单任务时,51单片机依然能够焕发出青春般的光彩。

同时,51单片机也是学习和理解其他高级单片机的最好的入门平台,本次的实验也将增强了我对学习好其他高级单片机的决心和信心。

五、思考题1.描述完整所设计的计算器能完成的各项功能及实现方法。

(如几位数以内的运算;连加;复合运算等等)本实例实现了加减乘除基本运算、连续运算、最大长度14位的数据输入、超过14位数据后程序为避免不良显示自动显示溢出2.计算器设计过程中碰到的问题及解决的方法?使用时原本打算使用double型变量,但在实际测试中并没有发现精度很高,通过联合调试发现KEILC51编译器将double型自动转换为float型;3.如何实现掉电保护?使用E2PROM或者外部的SD卡等存储设备,通过一定的时序操作控制这些外部设备实现存储数据的接口,在每一步计算操作后都将过程和结果存储到存储设备中,在下次上电后直接读取实现掉电保护;4.日常生活中计算器光敏单元的功能及实现原理?光敏单元可看作为一个电流源,通过电阻进行简单的I/V转换,然后用ADC转换为数字量,通过单片机处理后调节液晶偏压或占空比来调节显示对比度以实现不同光强下的正常显示;5.如何与上位机进行计算结果的通信?本实例中已经简单实现了基于串口的单片机与计算机上位机之间的通信,不过是单向的,为了实现真正的通信,可定义相关协议,通过串口收发管理这些数据和操作来实现。

附录1:整体电路原理图附录2:部分源程序/*头文件引用部分*/#include "mySys.h"#include "LM016.h"#include "stdio.h"#include "MyUsart.h"/*端口定义部分*/#define PORT_KEY P1/*全局变量*/float CalNum1=0; //待计算数1float CalNum2=0; //待计算数2float ResNum =0; //计算结果unsigned char AppendNum=0; //判断是否为连续模式unsigned char NumsBegin=0; //判断是否真的开始有数字输入这里是为了避免重复输入前面的0 unsigned char FirstZero=0; //第一个是否为0 unsigned char NumPen=0; //书写坐标,会随着数字的输入而向后移动unsigned char AllNumsLen; //当前待计算数和运算符总长度,定义该变量是为了避免式子过长code unsigned char CalSymbolTable[]={0,'+','-','*','/'}; //运算符表unsigned char CalSymbol=0; //运算符unsigned char SysStatus=0; //程序运行状态//0程序初始化状态1正在输入第一个数2正在输入第二个数3得到运算结果/*函数声明部分*/unsigned char KeyScan(void);void ShowLogo(void);void ShowCalResult(float Value);/*函数实现部分*/void main(void){u nsigned char TempKey;L M016_Init();M yUsart_Init();M yUsart_Print("This is 51 Calculator Program!");M yUsart_Print("Usart Mode : TX BAD=19200bps");S howLogo(); //显示LOGOM yUsart_Print("System Init Done! Have Fun!");w hile(1){switch(SysStatus){case 0: //【程序初始化状态】LM016_Clear(); //清屏CalNum1=0;CalNum2=0;ResNum =0;NumPen =0;AppendNum=0;NumsBegin=0;FirstZero=0;AllNumsLen =0;CalSymbol=0;SysStatus=1; //进入正在输入第一个数状态break;case 1: //【正在输入第一个数字】TempKey = KeyScan();if(!TempKey) break; //没有按键按下则快速跳出if(TempKey>= '0' && TempKey <='9') //*****数字键{if(!NumsBegin) //现在还没有开始正式输入数字{if(TempKey == '0'){if(!FirstZero) //第一次输入0FirstZero = 1; //给了一次输入0的机会,后面就不给了else break;}else{NumsBegin = 1; //开头是非零,已经开始正式输入数字了NumPen=0; //书写坐标归位,此时将会覆盖原有的0}}if(AllNumsLen >= 10) break; //长度过长则快速跳出不在接受数字输入CalNum1 *= 10;CalNum1 += (TempKey - '0'); //求得当前数值LM016_PutChar(0,NumPen, TempKey);NumPen++; //书写坐标向右边移动AllNumsLen++;}else //*****符号键{switch(TempKey){case '+':case '-':case '*':case '/':if((!NumsBegin)&&(!FirstZero)) //若没有任何数字按键按下则补充这个0{LM016_PutChar(0,0, '0');NumPen++;}CalSymbol=TempKey;LM016_PutChar(0,NumPen, TempKey);NumPen++;AllNumsLen++;NumsBegin=0;FirstZero=0;AppendNum=0;CalNum2 = 0; //把第二个数值清空SysStatus=2;break;case '=':ResNum = CalNum1;ShowCalResult(ResNum);FirstZero=0;AppendNum=0;NumsBegin=0;NumPen=0;AllNumsLen=0;SysStatus=3; //进入过度阶段break;case 'C':SysStatus=0;break;}break;}case 2: //【正在输入第二个数字】TempKey = KeyScan();if(!TempKey) //没有按键按下则快速跳出break;if(TempKey>= '0' && TempKey <='9') //*****数字键{if(!NumsBegin) //现在还没有开始正式输入数字{if(TempKey == '0'){if(!FirstZero) //第一次输入0FirstZero = 1; //给了一次输入0的机会,后面就不给了else break;}else{NumsBegin = 1; //开头是非零,已经开始正式输入数字了if(FirstZero) NumPen--; //书写坐标归位,此时将会覆盖原有的0 }}if(AllNumsLen >= 16) break; //长度过长则快速跳出不在接受数字输入CalNum2 *= 10;CalNum2 += (TempKey - '0'); //求得当前数值LM016_PutChar(0,NumPen, TempKey);NumPen++; //书写坐标向右边移动AllNumsLen++;}else //*****符号键{switch(TempKey){case '=':switch(CalSymbol){case '+':ResNum = CalNum1 + CalNum2;reak;case '-':ResNum = CalNum1 - CalNum2;break;case '*':ResNum = CalNum1 * CalNum2;break;case '/':ResNum = CalNum1 / CalNum2;break;}if((!NumsBegin)&&(!FirstZero)) //若没有任何数字按键按下则补充这个0{LM016_PutChar(0,NumPen, '0');CalNum2 = 0;NumPen++;}ShowCalResult(ResNum);FirstZero=0;AppendNum=0;NumsBegin=0;NumPen=0;AllNumsLen=0;SysStatus=3; //进入过度阶段break;case 'C':SysStatus=0;break;}}break;case 3: //【当前是过度阶段】TempKey = KeyScan();if(!TempKey) break; //没有按键按下则快速跳出if(TempKey>= '0' && TempKey <='9') //*****数字键{LM016_Clear(); //清屏if(!NumsBegin) //现在还没有开始正式输入数字{if(TempKey == '0'){if(!FirstZero) //第一次输入0FirstZero = 1; //给了一次输入0的机会,后面就不给了elsebreak;}else{NumsBegin = 1; //开头是非零,已经开始正式输入数字了NumPen=0; //书写坐标归位,此时将会覆盖原有的0 }}CalNum1 = (TempKey - '0'); //求得当前数值这里直接赋值就OK了CalNum2 = 0; //把第二个数值清空LM016_PutChar(0,NumPen, TempKey);NumPen=1; //书写坐标向右边移动AllNumsLen=1;SysStatus=1; //进入输入第一个数值状态}else //*****符号键{switch(TempKey){case '+':case '-':case '*':case '/':LM016_Print(0,0,"Ans ");AppendNum=1;CalNum1 = ResNum;CalNum2 = 0;NumPen=2;if((!NumsBegin)&&(!FirstZero)) //若没有任何数字按键按下则补充这个0{LM016_PutChar(0,3, '0');NumPen++;}CalSymbol=TempKey;LM016_PutChar(0,NumPen, TempKey);NumPen++;AllNumsLen=4;NumsBegin=0;FirstZero=0;AppendNum=0;SysStatus=2;break;case '=':switch(CalSymbol){case '+':ResNum = ResNum + CalNum2;break;case '-':ResNum = ResNum - CalNum2;break;case '*':ResNum = ResNum * CalNum2;break;case '/':ResNum = ResNum / CalNum2;break;}ShowCalResult(ResNum);FirstZero=0;AppendNum=0;NumsBegin=0;NumPen=0;AllNumsLen=0;SysStatus=3; //进入过度阶段break;case 'C':SysStatus=0;break;}break;}break;}}}。

相关文档
最新文档