单片机实验报告 计算器
计算器实验报告
计算器实验报告一实验目的学习使用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单片机简易计算器课程设计报告
1. 研究背景
•计算器是人们日常生活和工作中常用的工具之一。
•通过设计简易计算器,可以加深学生对51单片机的理解和应用。
2. 目标和需求
•设计一个基于51单片机的简易计算器,能够进行基本的四则运算和开方运算。
•要求计算器能够显示输入和计算结果。
•要求计算器具备简单的界面和操作。
3. 设计方案
•使用51单片机作为计算器的控制核心。
•通过键盘输入数字和运算符,并显示在液晶屏上。
•根据输入的运算符,进行相应的计算,并将结果显示在液晶屏上。
4. 硬件设计
•使用51单片机作为主控芯片。
•连接液晶屏模块,用于显示输入和计算结果。
•连接键盘模块,用于输入数字和运算符。
5. 软件设计
•使用C语言进行编程。
•设计主程序,包括初始化、输入处理和计算输出等功能。
•设计函数,实现基本的四则运算和开方运算。
6. 实验结果
•成功设计并实现了基于51单片机的简易计算器。
•可以正常进行基本的四则运算和开方运算。
•输入和计算结果能够准确显示在液晶屏上。
7. 总结与展望
•通过设计这个简易计算器,学生对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
基于51单片机简易计算器课程设计报告
基于51单片机简易计算器课程设计报告引言:计算器是现代社会中常见的电子设备之一,它能够帮助人们进行各种数学运算,提高计算效率。
本文将介绍基于51单片机的简易计算器的设计过程及实现方法。
一、设计目标本次设计的目标是实现一个简易计算器,能够进行基本的加减乘除运算,并能够显示计算结果。
通过该设计,旨在加深学生对51单片机的理解,培养其实际操作能力。
二、硬件设计1. 电源模块:采用稳压电源模块,提供稳定的电压给单片机及其他电路模块。
2. 单片机模块:采用51单片机,作为计算器的核心控制模块,负责接收按键输入、进行运算和显示结果。
3. 按键模块:设计合适的按键电路,用于输入数字和操作符。
4. 显示模块:采用数码管或液晶显示屏,显示计算结果。
5. 连接线:将各个模块连接起来,确保信号的传输畅通。
三、软件设计1. 初始化:设置单片机的工作模式、端口方向和初始状态。
2. 按键扫描:通过轮询的方式检测按键是否被按下,若有按键按下则进行相应的处理。
3. 输入处理:根据按键的顺序和操作符的位置进行输入的处理,将输入的数字和操作符分别存储在相应的变量中。
4. 运算处理:根据输入的操作符进行相应的运算,得出计算结果。
5. 结果显示:将计算结果通过数码管或液晶显示屏进行显示。
6. 清零处理:在计算结果显示完毕后,对相关的变量进行清零处理,以便进行下一次的计算。
四、功能实现1. 加法运算:通过按下"+"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。
2. 减法运算:通过按下"-"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。
3. 乘法运算:通过按下"*"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。
基于51单片机的计算器课程设计实验报告
项目一:简单计算器1。
实验题目:用51单片机实现简单的计算器功能2。
实验截图:1).实验运行前截图:2).实验运行后截图:3.实验代码:#include<reg52。
h〉#include〈intrins.h〉#include〈math.h>#include<defined。
H>#include〈LCD1602.h>unsigned char table1[16]; //1602第一行显示字符unsigned char table2[16]; //1602第二行显示字符unsig ned char code table_error[] = ”error”;/*键扫描函数*/unsigned char keyscan() //扫描键盘函数{unsigned char key_l,key_h,addres,num;P0=0x0f;key_l=P0;P0=0xf0;key_h=P0;addres=key_l | key_h;if(addres!=0xff){Delayms(1);if(addres!=0xff){P0=0x0f;key_l=P0;P0=0xf0;key_h=P0;addres=key_l | key_h;switch(addres){case 0xee:num='1’;break;case 0xde:num=’2';break;case 0xbe:num=’3’;break;case 0xed:num='4';break;case 0xdd:num='5’;break;case 0xbd:num=’6';break;case 0xeb:num=’7’;break;case 0xdb:num='8’;break;case 0xbb:num='9’;break;case 0xd7:num='0’;break;//按键0case 0xe7:num=’C';break;//按键*case 0xb7:num=’=';break;//按键#case 0x7e:num='/’;break;//按键Acase 0x7d:num=’*’;break;//按键Bcase 0x7b:num='—’;break;//按键Ccase 0x77:num='+';break;//按键D}while(addres!=0xff){P0=0x0f;key_l=P0;P0=0xf0;key_h=P0;addres=key_l | key_h;}return num;}}return 0;}void clear_lcd(void)//清屏{unsigned char j;for(j=0;j〈16;j++){table1[j]=’\0’;table2[j]='\0';}}void main(){unsigned char i=0,j;unsigned char key;unsigned char flag_operator = 0;//加减乘除标志位unsigned char flag_equ = 0;//等于标志位unsigned char flag_key = 0;//运算位标志bit flag_MaxValue = 0;bit flag_minus = 0;//负数long int value = 0; //最终运算结果unsigned long int value_H =0; //第一个数据unsigned long int value_L = 0;//第二个数据unsigned long int temp[]={1, 10, 100,1000,10000,100000,1000000,10000000,100000000};Initialize_LCD();while(1){key=keyscan();if(key != 0){if(key == ’C')//清除键C按下{clear_lcd();i=0;flag_operator = 0; flag_equ = 0; value = 0; value_H =0; value_L = 0; flag_key = 0; flag_minus=0;}else{for(j=0; j<i; j++){table1[15—i+j] = table1[15—i+j+1];}table1[15] = key;//table1[i] = key;i++;}if(key == '='){for(j=0; j〈16; j++)//确定运算符位置{if(table1[j] == ’=’){flag_equ = j;flag_key++;break;}if( table1[j]== ’+' || table1[j] == ’—' || table1[j] == ’*' ||table1[j] == '/'){flag_operator = j;flag_key++;}}for(j=16—i; j〈flag_operator; j++) //第一个数据处理{//value_H = value_H + (table1[j]-48) * ( pow(10 ,(flag_operator—j-1)));value_H = value_H + (table1[j]—48) * temp[flag_operator—j—1];}for(j=flag_operator+1; j〈15; j++) //第二个数据处理{//value_L = value_L + (table1[j]-48) * pow( 10 , (flag_equ—j—1));value_L = value_L + (table1[j]—48) * temp[flag_equ—j—1];}if(table1[flag_operator] == '+'){value = value_H + value_L;}else if(table1[flag_operator]== ’-'){value = value_H — value_L;}else if(table1[flag_operator] == '*'){value = value_H * value_L;}else if(table1[flag_operator]== ’/’){value = value_H / value_L;}if(value == 0)table2[15] = (value + 48);else if(value<0){value = abs(value);flag_minus = 1;}else if(value〉2000000000){flag_MaxValue = 1;//break;}j=15;while(value!=0){table2[j] = (value%10 + 48);value = value/10;j—-;}if(flag_minus) //负数{table2[j] = ’—’;}}if(flag_key 〉2 || table1[0] == '0' || flag_MaxValue==1 ){ShowString(5,1,table_error);while(keyscan() != 'C’);clear_lcd();i=0;flag_operator = 0; flag_equ = 0; value = 0; value_H =0; value_L = 0; flag_key = 0; flag_minus=0;}}ShowString(0,0,table1);ShowString(0,1,table2);}}。
基于51单片机简易计算器课程设计报告(一)
基于51单片机简易计算器课程设计报告(一)基于51单片机简易计算器课程设计报告1. 介绍在本次课程设计中,我设计了一个基于51单片机的简易计算器。
本报告将会详细介绍该计算器的设计思路、功能实现以及课程设计中遇到的问题与解决方法。
2. 设计思路功能需求•支持基本的加、减、乘、除运算•具备数字输入与显示功能•具备清零和等于功能•具备连续计算功能硬件设计本计算器的硬件设计主要包括51单片机、LCD显示模块以及按键输入模块。
其中,51单片机负责控制计算器的逻辑,LCD显示模块用于显示计算结果和用户输入,按键输入模块用于接收用户的输入。
软件设计计算器的软件设计主要分为以下几个部分: - 初始化:初始化51单片机、LCD模块以及按键模块。
- 按键扫描:通过扫描按键模块,获取用户的输入。
- 数字输入与显示:根据用户输入,将数字显示在LCD上。
- 运算逻辑:根据用户输入的运算符和数字,执行相应的计算操作,并将结果显示在LCD上。
3. 功能实现初始化在初始化阶段,我们需要初始化51单片机的GPIO口、LCD模块以及按键模块。
具体的初始化代码如下:// 初始化51单片机的GPIO口// 初始化LCD模块// 初始化按键模块按键扫描为了获取用户的输入,我们需要通过按键模块进行扫描。
具体的按键扫描代码如下:// 扫描按键模块// 如果检测到按键按下,则进行相应的处理数字输入与显示当用户按下数字键时,我们将获取到的数字输入缓存起来,并将其显示在LCD上。
具体的数字输入与显示代码如下:// 获取按键输入的数字// 将数字添加到输入缓存// 将输入缓存显示在LCD上运算逻辑当用户按下运算符键时,我们需要根据输入的数字和运算符执行相应的计算操作,并将结果显示在LCD上。
具体的运算逻辑代码如下:// 获取运算符输入// 根据运算符和输入的数字执行相应的计算操作// 将计算结果显示在LCD上清零和等于功能为了提升用户体验,我们还可以添加清零和等于功能。
基于C51单片机计算器实训报告
目录一、设计的意义二、设计的流程三、设计的原理四、设计的模块五、元器件清单六、成品的制作七、设计的总结一、设计的意义计算器是日常工作和学习生活中的常用工具,人们利用它代替了许多复杂计算,包括加减乘除和其他运算。
尤其是小型计算器,它携带方便,在生活中用起来方便快捷,成为了财政、学习、生意上都青睐的必需品。
它的需求广泛,在计算器的发展上存在很大的空间和市场意义。
单片机在我国的各行各业得到了广泛使用,单片机的出现是计算机制造技术高速发展的产物。
如今,它已经广泛应用到我们生活中的各个领域,如:电子、科技、通信、汽车、工业等。
一般只需几块钱,有着经济廉价的优势,用单片机可以很方便的实现计算器的设计。
本设计是以单片机为基础设计出简单的一次式计算器。
二、设计的流程本设计的计算器硬件电路采用三部分电路模块构成,第一部分是键盘模块,采用4*4矩阵键盘作为输入电路;第二部分是LCD1602液晶显示模块;第三部分是以89C52单片机作为控制核心。
软件程序主要由三部分组成:主程序、按键扫描程序和LCD1602显示程序。
下图为硬件模块框图:下图为设计流程图:三、设计的原理硬件电路原理图:四、设计的模块1、电源模块:电源的设计采用了自锁开关控制电源正极的接通与断开,当P1接上+5V直流电源时;若S1没有按下,此时S1的1与5端口接通,+5V电流不流通到电路,电路不工作;当S1按下后,3与5端口接通,此时+5V电流流通到电路是电路工作。
2、89C52单片机模块:此模块式是本设计的控制核心模块,常称为单片机最小系统;单片机最小系统由三部分组成:STC89C52芯片部分、复位部分(由按键开关、极性电容、10K电阻组成)、晶振部分(由12M石英晶振、两个30PF的瓷片电容组成)。
主要起程序的输入与控制、程序的复位、时间频率控制的作用。
3、4*4矩阵键盘模块:键盘可分为两类:编码键盘和非编码键盘。
编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。
基于51单片机实验报告(计算器)
基于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,计算出数字,判断键值为运算符号则读出数字和键值。
单片机 简易计算器 设计报告3
设计报告1.题目:简易计算器2. 总体设计:设计键盘输入部分并转换为相应的数值,在显示的同时进行保存,碰到运算符要马上进行运算处理并将结果送显示缓冲区。
每按一个键,程序都要做出反应,如果是数字键,则并入操作数中,如果是运算符键或者功能键,则要做相应的处理或者进行运算,不要求支持运算符的优先级。
3.程序设计流程图4.源程序:org 0000hop equ 20hop1 equ 21hop2 equ 22hstart: mov sp,#60h :键盘初始化mov dptr,#0ff20hmov a,#03hmovx @dptr,amov 70h,#00mov op, #00mov op1, #00mov op2, #00key1: acall ks1jnz lk1n1: acall dirajmp key1lk1: acall dir :延时6msacall diracall ks1jnz lk2acall dirajmp key1lk2: mov r2,#0feh :列扫描码送R2mov r4,#0 :R4列计数单元lk4: mov dptr,#0ff21h :列扫描码送PA口mov a,r2movx @dptr,ainc dptrinc dptrmovx a,@dptr :读C口jb acc.0,lone :0行为高电平转判1行mov a,#07hajmp lkplone: jb acc.2,nextmov a,#01hajmp key1lkp: add a,r4 :行首健号+列号=建号mov 51h,acjne a,#0ah,l1mov op,aajmp key1l1: jc qq ; 判断是数字或者运算符号mov op,aajmp key1qq: mov a,op ;判断此次数字输入前有无运算符号jnz m2m1: mov a,#10 ;数字保存到OP1中mov b,op1mul abadd a,70hmov op1,apush accajmp ppm2: mov a,#10 ;数字保存到OP2中mov b,op2mul abadd a,70hmov op2,app: mov 70h,a ;数字存放到显示缓存区push acclk3: acall diracall ks1jnz lk3pop accajmp key1next: inc r4 ;列扫描计数器加一mov a,r2 ;判是否一扫到最后一列jnb acc.7,knd ;扫到则转移rl a ;列扫描码左移一位mov r2,aajmp lk4knd: ajmp key1ks1: mov dptr,#0ef21h ;判断键闭合mov a,#0movx @dptr,ainc dptrinc dptrmovx a,@dptrcpl aanl a,#1fhretdir: cpl p1.0 ;键扫描显示子程序mov r0,#70hmov a,@r0anl a,#0fhmov 30h,amov a,@r0swap aanl a,#0fhmov 31h,amov r0,#30hmov r3,#01hdo1: mov a,r3 ;查字型码表mov dptr,#0ef21hmovx @dptr,ainc dptrmov a,@r0add a,#0dhmovc a,@a+pcdir1: movx @dptr,a ;移位显示acall dlmov a,r3rl ajb acc.2,ld1mov r3,ainc r0ajmp do1ld1: retdseh: db 0f8h,99h,80h,92h,90h,82h,88h,83h ;字型码表db 0f9h,0c0h,0a4h,081h,0b0h,086h,0c6h,0a1hdl: mov r7,#2 ;延时子程序dl1: mov r6,#0ffhdl2: djnz r6,dl2djnz r7,dl1retcalc: mov r7,op ;运算子程序cjne r7,#0ah,notaddclr c ;加mov a,op1add a,op2sjmp fcalcnotadd: cjne r7,#0bh,notsubclr c ;减mov a,op1subb a,op2sjmp fcalcnotsub: cjne r7,#0ch,notmulclr c ;乘mov a,op1mov b,op2mul absjmp fcalcnotmul: clr c ;除mov a,op1mov b,op2div absjmp fcalcfcalc: mov 50h,a ;结果存放到显示缓存区anl a,#0fhmov 72h,amov a,50hswap aanl a,#0fhmov 73h,adisp: mov r3,#01h ;结果显示mov r0,#70hmov a,r3mov dptr,#0ff21hmovx @dptr,amov dptr,#0ff22hmov a,@r0add a,#03hmovc a,@a+pcmovx @dptr,aacall dlaydb 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h, ;字型码表db 80h,90h,88h,83h,0c6h,0a1h,86h,8ehdlay: mov r7,#02h ;延时子程序dlay1: mov r6,#0ffhdlay2: djnz r6,dlay2djnz r7,dlay1retend5.硬件使用使用方法:键盘0~9实现数字的输入,A,B,C,D分别代表+,-,*,/运算符号。
单片机计算器报告
单片机课程调查题目:计算器系统设计学号:姓名:杨艳班级:应用1301一、需求分析本次调查的任务就是要以51系列单片机为核心实现一个简易计算器,它的结构非常简单,外部主要由键盘和一个LCD1602A液晶显示屏,一块STC89C52RC单片机构成,通过软件编程要求能完成四则运算并能实现循环显示。
本次实验的目的包括了解并熟练掌握proteus仿真软件的使用;掌握C语言,学会用它们进行单片机编程;学会使用Keil C编译工具进行编程和编译,并掌握proteus和Keil C 联调以实现在proteus上的软硬件仿真。
二、正规划分1、数码显示电路,LCD1602A的引脚详细介绍见下图:采用LCD1602A来显示,要求能显示两行。
它的D—7D引脚分别接到单片机的P0.0~P0.7引脚;RS、R/W、E管脚分别接到单片机的P2.4、P2.0、P2.3 。
具体连接见后面的电路图。
2、4*4键盘扫描电路用STC89C52RC的P3口中的P3.0,P3.1,P3.2和P3.3四根线作为按键的行输入线,用P3.4,P3.5,P3.6和P3.7作为按键的列输出线。
通过按次依次给P3口的高四位的每根线输出一个低电平列信号,每当一根列线输出后,将信号锁住,然后读取行线,看有没有哪一根出现低电平。
如果有,则说明有按键按下了,依据P3口是哪一根行线出现低电平和列线出现低电平,可以判别是第几行和第几列的按键按下了,如果读取行线没有出现低电平,则表示对应的列没有按键按下,那么换另一列输出低电平,在读取行信号,判别新的一列有没有键按下。
依此办法轮流使每一列依次输出低电平,判别每一列是否有键按下,直到把所有的按键判别完。
3、单片机微控制电路微控制电路就是以STC89C52RC为核心的控制核心,主要注意晶振电路的接法和RST法。
4、整体电路图见下图分析可知共分为七个模块:键盘扫描部分,定义各个位置上的键值部分,延迟部分,存贮部分,液晶显示部分,运算部分,动态显示部分。
单片机设计实验报告简单计算器的设计
目录1.总体方案选择 (2)1.1 实验要求: (2)1.2方案设计 (2)2.硬件原理电路图的设计及分析 (2)2.1主控模块 (2)2.1.1 STC89C52单片机主要特性 (3)2.1.2 STC89C52单片机管脚图 (4)2.1.3 STC89C52单片机的中断系统 (4)2.1.4 STC89C52单片机的定时/计数器 (4)2.2矩阵键盘模块设计: (5)2.2.1矩阵键盘原理介绍 (5)2.2.2矩阵键盘电路设计 (5)2.3 LCD液晶显示器简介 (6)2.3.1液晶模块简介 (6)2.3.2液晶显示部分与89S52的接口 (7)3系统软件设计 (9)3.1系统软件流程图 (9)3.2系统整体原理图 (10)4.系统调试 (11)4.1硬件调试 (11)4.2软件调试 (11)4.3调试结果 (12)5. 心得体会 (13)1.总体方案选择1.1 实验要求:1)通过小键盘实现数据的输入,并在LED数码管上显示2)实现+、-、*、/3)在LED数码管上显示结果4)并有清零,退出功能1.2方案设计本系统以STC89C52单片机为控制核心,对系统进行初始化,主要完成对键盘的响应、液晶显示灯功能的控制,起到总控和协调各模块之间工作的作用。
单片机通过检测键盘读取使用者按下对用功能的按键,然后通过单片机内部运放把运算的结果显示在液晶屏幕上。
图1-1系统结构框图本系统结构如图1-1所示,本设计可分为以下模块:单片机主控模块、键盘模块、功率放大模块、闹铃模块、按键设置模块。
下面对各个模块的设计方案逐一进行论证分析。
2.硬件原理电路图的设计及分析2.1主控模块STC89C52有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。
STC89C52的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成。
STC89C52单片机的基本组成框图见图2-1。
单片机课程设计报告(简易计算器).
简易计算器摘要:计算器是人们的日常生活中是最常见的电子产品之一,它应用极广、发展迅猛,并且不断出现着拥有更加强大功能的计算器。
为了解和研究计算器,本次课设设计制作了一个简易计算器,能够在十四位的计算范围内进行“+”、“-”、“*”、“/”的基本运算,能进行负数以及小数点后两位的精确结果显示。
该计算器以AT89C51单片机芯片作为核心。
采用LCD1602工业字符液晶进行显示。
完成的计算器经过检验能够完整的实现预设功能,各种细节完善,具有很高的使用价值。
关键词:单片机;简易计算器;AT89C51;LCD1602Simple CalculatorAbstract:Calculator is People's Daily life is one of the most common electronic products, used very wide, developing rapidly, and constantly appear more powerful function with have calculators. In order to understand and study calculator, this class set design made a simple calculator, can the calculation in within 14 "+" and "-" and "*", "/" the basic computing, can carry out negative and two decimal places accurate results are shown. This calculator with AT89C51 chips as the core. Using liquid LCD1602 industrial characters displayed. Complete calculator after inspection can complete realization, various details preset functions to perfect, have high use value.Keywords:MCU; Simple calculator;AT89C51;LCD1602目录中文摘要............................................................1英文摘要............................................................2单片机课程设计......................................................4 1 课程设计任务.....................................................41.1 主要功能设计................................................41.2 任务目的....................................................42 整体设计方案......................................................42.1 方案论证....................................................42.2 系统框图....................................................53 硬件电路的设计...................................................63.1 计算机Protel总图............................................63.2 显示电路设计方案............................................93.3 键盘设计方案................................................93.4 复位电路设计...............................................103.5 晶振电路设计...............................................104 控制软件设计....................................................114.1 程序时序总图...............................................114.2 液晶显示软件设计...........................................124.3 键盘输入软件设计...........................................134.4 计算函数设置...............................................155 系统调试........................................................185.1 硬件调试...................................................185.2 软件调试...................................................18 参考文献...........................................................20 个人小结...........................................................21 附录...............................................................24 附录1..........................................................24 附录2..........................................................251课程设计任务1.1 主要功能设计以AT89C51单片机芯片为核心来制作一个简易计算器,外部由4*4矩阵键盘和一个LCD1602工业字符型液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。
单片机设计实验报告简单计算器的设计
目录1.总体方案选择 (2)1.1 实验要求: (2)1.2方案设计 (2)2.硬件原理电路图的设计及分析 (2)2.1主控模块 (2)2.1.1 STC89C52单片机主要特性 (3)2.1.2 STC89C52单片机管脚图 (4)2.1.3 STC89C52单片机的中断系统 (4)2.1.4 STC89C52单片机的定时/计数器 (4)2.2矩阵键盘模块设计: (5)2.2.1矩阵键盘原理介绍 (5)2.2.2矩阵键盘电路设计 (5)2.3 LCD液晶显示器简介 (6)2.3.1液晶模块简介 (6)2.3.2液晶显示部分与89S52的接口 (7)3系统软件设计 (9)3.1系统软件流程图 (9)3.2系统整体原理图 (10)4.系统调试 (11)4.1硬件调试 (11)4.2软件调试 (11)4.3调试结果 (12)5. 心得体会 (13)1.总体方案选择1.1 实验要求:1)通过小键盘实现数据的输入,并在LED数码管上显示2)实现+、-、*、/3)在LED数码管上显示结果4)并有清零,退出功能1.2方案设计本系统以STC89C52单片机为控制核心,对系统进行初始化,主要完成对键盘的响应、液晶显示灯功能的控制,起到总控和协调各模块之间工作的作用。
单片机通过检测键盘读取使用者按下对用功能的按键,然后通过单片机内部运放把运算的结果显示在液晶屏幕上。
图1-1系统结构框图本系统结构如图1-1所示,本设计可分为以下模块:单片机主控模块、键盘模块、功率放大模块、闹铃模块、按键设置模块。
下面对各个模块的设计方案逐一进行论证分析。
2.硬件原理电路图的设计及分析2.1主控模块STC89C52有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。
STC89C52的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成。
STC89C52单片机的基本组成框图见图2-1。
单片机-十进制计算器
单片机实验报告 四姓名 学号时间 2015.05.14 地点 B526 实验题目 简易十进制计算器一、实验目的1. 掌握单片机编程和调试方法。
2. 掌握键盘、LED 显示接口工作原理及编程方法。
二、实验内容利用MCS-51单片机,设计一个简易十进制计算器,完成一位十进制有符号数的加、减、乘、除运算。
16个按键的安排:10个数字键(0-9),用于输入运算的数字;5个功能键:+、-、×、÷、=、清零(符号选择)。
本实验要求显示:输入的十进制数字及符号,正数不显示符号,负数在数的前面显示“-”;运算符显示(显示字形自定);运算结果显示,包括数字和符号。
三、实验电路连线P0 P1评 阅四、实验说明本实验采用动态显示电路,即6个数码管分时循环工作,刷新频率≥25Hz。
键盘采用矩阵式电路,L1-L4作为输出,H1-H4作为输入。
(详细工作原理请参考教材第10章)。
要求所有的程序预先在WA VE仿真调试通过,达到设计要求后下载程序到单片机芯片在实验板上实际运行。
程序的下载由实验室提供编程器统一烧写,单片机芯片由实验室提供,调试完成后交回。
五、实验仪器和设备PC机、WA VE软件、仿真器、实验板、编程器、电源等。
六、程序流程图及程序YJ EQU 50H ;结果存放YJ1 EQU 51H ;中间结果存放GONG EQU 52H ;功能键存放ORG 00HSTART: MOV R3,#0 ;初始化显示为空MOV GONG,#0MOV 32H,#00HMOV 33H,#00HMOV 34H,#00HMLOOP: CALL DISP ;调显示子程序WAIT: CALL TESTKEY ;判断有无按键JZ WAITCALL GETKEY ;读键INC R3 ;按键个数CJNE A,#0,NEXT1 ;判断是否数字键LJMP E1 ;转数字键处理NEXT1: CJNE A,#1,NEXT2LJMP E1NEXT2: CJNE A,#2,NEXT3LJMP E1NEXT3: CJNE A,#3,NEXT4LJMP E1NEXT4: CJNE A,#4,NEXT5LJMP E1NEXT5: CJNE A,#5,NEXT6LJMP E1NEXT6: CJNE A,#6,NEXT7LJMP E1NEXT7: CJNE A,#7,NEXT8LJMP E1NEXT8: CJNE A,#8,NEXT9LJMP E1NEXT9: CJNE A,#9,NEXT10LJMP E1NEXT10: CJNE A,#10,NEXT11 ;判断是否功能键LJMP E2 ;转功能键处理NEXT11: CJNE A,#11,NEXT12LJMP E2NEXT12: CJNE A,#12, NEXT13LJMP E2NEXT13: CJNE A,#13,NEXT14LJMP E2NEXT14: CJNE A,#14,NEXT15LJMP E2NEXT15: LJMP E3 ;判断是否清除键E1: CJNE R3,#1,N1 ;判断第几次按键LJMP E11 ;为第一个数字N1: CJNE R3,#2,N2LJMP E12 ;为第二个数字N2: CJNE R3,#3,N3LJMP E13 ;为第三个数字N3: LJMP E3 ;第四个数字转溢出E11: MOV R4,A ;输入值暂存R4MOV 34H,A ;输入值送显示缓存MOV 33H,#00HMOV 32H,#00HLJMP MLOOP ;等待再次输入E12: MOV R7,A ;个位数暂存R7MOV B,#10MOV A,R4MUL AB ;十位数ADD A,R7MOV R4,A ;输入值存R4MOV 32H,#00H ;输入值送显示缓存MOV 33H,34HMOV 34H,R7LJMP MLOOPE13: MOV R7,AMOV B,#10MOV A,R4MUL ABJB OV,E3 ;输入溢出ADD A,R7JB CY,E3 ;输入溢出MOV R4,AMOV 32H,33H ;输入值送显示缓存MOV 33H,34HMOV 34H,R7LJMP MLOOPE3: MOV R3,#0 ;按键次数清零MOV R4,#0 ;输入值清零MOV YJ,#0 ;计算结果清零MOV GONG,#0 ;功能键设为零MOV 32H,#00H ;显示清空MOV 33H,#00HMOV 34H,#00HLJMP MLOOPE2: MOV 34H,#00HMOV 33H,#00HMOV 32H,#00HMOV R0,GONG ;与上次功能键交换MOV GONG,AMOV A,R0CJNE A,#10,N21 ;判断功能键LJMP JIA ;"+"N21: CJNE A,#11,N22LJMP JIAN ;"-"N22: CJNE A,#12,N23LJMP CHENG ;"*"N23: CJNE A,#13,N24LJMP CHU ;"/"N24: CJNE A,#0,N25LJMP FIRST ;首次按功能键N25: LJMP DEN ;"="N4: LJMP E3FIRST: MOV YJ,R4 ;输入值送结果MOV R3,#0 ;按键次数清零LJMP DISP1 ;结果处理JIA: MOV A,YJ ;上次结果送累加器ADD A,R4 ;上次结果加输入值JB CY,N4 ;溢出MOV YJ,A ;存本次结果MOV R3,#0 ;按键次数清零LJMP DISP1JIAN: MOV A,YJSUBB A,R4 ;上次结果减输入值JB CY,N4 ;负数溢出MOV YJ,AMOV R3,#0LJMP DISP1CHENG: MOV A,YJMOV B,AMOV A,R4MUL AB ;上次结果乘输入值JB OV,N4 ;溢出MOV YJ,ALJMP DISP1CHU: MOV A,R4MOV B,AMOV A,YJDIV AB ;上次结果除输入值MOV YJ,AMOV R3,#0LJMP DISP1DEN: MOV R3,#0LJMP DISP1DISP1: MOV B,#10MOV A,YJ ;结果送累加器DIV AB ;结果除10MOV YJ1,A ;暂存"商"MOV A,B ;取个位数MOV 34H,A ;个位数送显示缓存MOV A,YJ1JZ DISP11MOV B,#10MOV A,YJ1DIV ABMOV YJ1,AMOV A,BMOV 33H,A ;十位送显示缓存MOV A,YJ1JZ DISP11 ;结果是否为二位数MOV 32H,A ;百位数送显示缓存DISP11: LJMP MLOOPDISP: MOV R0,#34HDIR1: MOV DPTR,#SEGTABMOV A,@R0MOVC A,@A+DPTRMOV P0,ACJNE R0,#34H,DIR2SETB P2.0CALL D1MSCLR P2.0DEC R0SJMP DIR1DIR2: CJNE R0,#33H,DIR3SETB P2.1CALL D1MSCLR P2.1DEC R0SJMP DIR1DIR3: SETB P2.2CALL D1MSCLR P2.2RETD1MS: MOV R7,#02HDMS: MOV R6,#0F0HDJNZ R6,$DJNZ R7,DMSRETSEGTAB: DB 0C0H, 0F9H, 0A4H, 0B0HDB 99H, 92H, 82H, 0F8HDB 80H, 90H, 88H, 83HDB 0C6H, 0A1H, 86H, 8EHTESTKEY:ACALL DISPMOV P1,#0FH ;读入键状态MOV A,P1CPL AANL A,#0FH ;高四位不用RETKEYTABLE:DB 0EEH,0EDH,0DDH,0BDH ;键码定义DB 0EBH,0DBH,0BBH,0E7HDB 0D7H,0B7H,0DEH,0BEHDB 07EH,07DH,07BH,077HGETKEY: MOV R6,#10 ;读键子程序ACALL DELAYMOV P1,#0FHMOV A,P1CJNE A,0FH,K12LJMP MLOOPK12: MOV B,AMOV P1,#0EFHMOV A,P1CJNE A,#0EFH,K13MOV P1,#0DFHMOV A,P1CJNE A,#0DFH,K13MOV P1,#0BFHMOV A,P1CJNE A,#0BFH,K13MOV P1,#07FHMOV A,P1CJNE A,#07FH,K13LJMP MLOOPK13: ANL A,#0F0HORL A,BMOV B,AMOV R1,#16MOV R2,#0MOV DPTR,#KEYTABLEK14: MOV A,R2MOVC A,@A+DPTRCJNE A,B,K16MOV P1,#0FHK15: MOV A,P1CJNE A,#0FH,K15MOV R6,#10ACALL DELAYMOV A,R2RETK16: INC R2DJNZ R1,K14AJMP MLOOPDELAY: MOV R7,#10TS1: MOV R6,#0FFHTS2: NOPNOPDJNZ R6,TS2DJNZ R7,TS1RETEND七、实验报告1、硬件电路设计(画出电路图),分析电路工作原理;矩阵键盘的工作原理:计算器的键盘布局如图所示:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;}}}。