51单片机计算器设计

合集下载

51单片机计算器课程设计

51单片机计算器课程设计

51单片机计算器课程设计一、课程目标知识目标:1. 让学生掌握51单片机的基本原理及其在计算器中的应用。

2. 使学生理解并掌握计算器程序设计的步骤和要点,包括键盘输入、显示输出、数据处理等。

3. 帮助学生了解并掌握基本的数字逻辑运算,如加、减、乘、除等。

技能目标:1. 培养学生运用51单片机进行计算器硬件设计和程序编写的能力。

2. 培养学生运用Keil等开发工具进行51单片机程序开发的能力。

3. 培养学生通过查阅资料、团队协作解决实际问题的能力。

情感态度价值观目标:1. 激发学生对电子技术和编程的兴趣,培养其主动学习的态度。

2. 培养学生的创新意识和动手能力,使其具备解决问题的信心。

3. 培养学生良好的团队协作精神和沟通能力,提高其综合素质。

课程性质:本课程为实践性较强的课程,注重培养学生的动手能力和实际问题解决能力。

学生特点:学生具备一定的电子技术基础和编程能力,对51单片机有一定了解。

教学要求:结合学生特点,注重理论与实践相结合,以项目为导向,引导学生主动探索、实践和解决问题。

通过课程学习,使学生达到预定的知识目标和技能目标,并培养其情感态度价值观。

在教学过程中,关注学生的学习进度,及时调整教学策略,确保课程目标的实现。

将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. 51单片机原理回顾:涉及51单片机的内部结构、工作原理、寄存器等基础知识。

相关教材章节:第一章《51单片机概述》2. 计算器功能设计:介绍计算器的基本功能,如数字输入、运算符选择、结果显示等。

相关教材章节:第二章《51单片机I/O口应用》3. 硬件电路设计:讲解计算器硬件电路的搭建,包括键盘电路、显示电路等。

相关教材章节:第三章《51单片机硬件设计基础》4. 程序设计:分析计算器程序设计的流程,包括程序框架、各功能模块的实现等。

相关教材章节:第四章《51单片机C语言编程》5. 软件开发工具使用:介绍Keil开发环境的使用方法,编译、下载程序到51单片机。

基于51单片机的计算器设计

基于51单片机的计算器设计

基于51单片机的计算器设计计算器作为一种常用的电子设备,广泛应用于各个领域。

在本文中,我们将基于51单片机来设计一个简单的计算器,并对其进行详细介绍。

一、设计目标我们所设计的计算器需要具备以下功能:1.实现基本的算术运算,包括加、减、乘、除等;2.具备显示功能,能够将输入和运算结果以数字的形式显示在液晶屏上;3.提供清零和删除功能,方便计算器的操作;4.具备较高的计算精度和稳定性。

二、硬件设计计算器的硬件设计主要包括键盘输入、液晶屏输出和计算程序控制三个部分。

1.键盘输入为了简化设计的复杂度,我们采用矩阵键盘来实现输入功能。

矩阵键盘由多个行和多个列交叉连接而成,通过扫描行和列的方式来检测键盘输入的按键信息。

2.液晶屏输出我们选择16x2字符液晶显示屏来作为计算结果的输出设备。

这种液晶屏可以显示16个字符,每个字符由5x8像素点阵组成,具备较好的显示效果。

3.计算程序控制我们将基于51单片机来编写计算器的计算程序,并通过电路连接键盘输入和液晶屏输出设备。

通过读取键盘输入的按键信息,计算程序能够判断用户输入的数字和操作符,并进行相应的计算操作。

最后,计算结果将以数字的形式显示在液晶屏上。

三、软件设计计算器的软件设计主要包括键盘扫描与输入处理、计算程序控制和液晶屏显示三个模块。

1.键盘扫描与输入处理通过循环扫描矩阵键盘的行和列,可以得到按键信息。

根据按键信息的不同,我们可以判断用户输入的数字和操作符,并将其传递给计算程序模块进行处理。

同时,我们需要对一些特殊按键(如清零和删除)做特殊处理。

2.计算程序控制计算程序模块将根据键盘输入的数字和操作符,进行相应的算术运算。

我们可以采用栈的数据结构来处理运算符和运算数,以实现复杂的算术运算。

3.液晶屏显示计算结果将以数字的形式显示在液晶屏上。

我们可以通过51单片机的GPIO口控制液晶显示屏的操作,包括写入指令和写入数据。

通过设定光标位置及写入数字数据,可以将计算结果显示在液晶屏的指定位置上。

基于51单片机计算器设计

基于51单片机计算器设计

基于51单片机计算器设计计算器是一种常见的电子设备,可以进行数学运算、数据处理等功能。

本文将基于51单片机进行计算器设计。

一、设计目标:1.实现基本的数学运算功能,如加减乘除、取余等。

2.能够进行复杂的数学运算,如平方、开方等。

3.具备记忆功能,能够存储中间结果和运算符号。

4.设置输入界面,允许用户输入数字和操作符。

5.显示运算结果和中间过程。

二、硬件系统设计:1.使用51单片机作为主控芯片,具有高集成度和处理能力。

2.连接光栅液晶显示屏,用于显示数值和操作符。

3.连接矩阵键盘,用于获取用户的输入。

4.连接电源电路,保证计算器正常运行。

三、软件系统设计:1.确定界面设计,包括数值显示区、操作符显示区和功能键区。

2.设计输入处理模块,根据用户输入获取相应的数值和操作符,并进行相应的处理。

3.设计运算模块,根据用户输入的操作符进行相应的数学运算,并将结果存储起来。

4.设计显示模块,将计算结果和中间过程显示在液晶屏上。

5.设计存储模块,用来存储中间运算结果和操作符号。

四、软件流程设计:1.系统初始化:包括设置显示模式、清零中间结果等。

2.输入处理:通过矩阵键盘输入数字和操作符,并进行相应的处理。

3.运算处理:根据用户输入的操作符,进行相应的数学运算,并将结果存储起来。

4.结果显示:将计算结果和中间过程显示在液晶屏上。

5.存储结果:将计算结果和操作符存储起来,以备后续计算。

五、测试和调试:在设计完成后,需要进行系统测试和调试,确保计算器的各项功能正常运行。

首先进行单元测试,验证各个模块的功能是否按照设计要求正确执行。

然后进行综合测试,模拟用户输入各种情况下的运算过程,检测是否能够正确进行运算并显示结果。

如果发现问题,则进行调试和修改,直到计算器满足设计要求。

六、总结:基于51单片机进行计算器设计,可以实现基本的数学运算功能,并具备记忆功能。

设计步骤包括确定硬件系统和软件系统设计,设计界面、输入处理、运算处理、显示和存储模块,进行测试和调试确保计算器功能正常运行。

基于51单片机的简易计算器设计

基于51单片机的简易计算器设计

基于51单片机的简易计算器设计基于51单片机的简易计算器设计一、引言随着微电子技术和嵌入式技术的发展,越来越多的智能化设备被应用于日常生活中。

其中,基于51单片机的简易计算器设计具有广泛的应用价值。

本文将介绍如何使用51单片机设计一个简易计算器,实现加减乘除的基本运算功能。

二、设计方案1.硬件组成:本设计采用51单片机作为主控芯片,与键盘、显示器等外围设备相连。

键盘用于输入数字和运算符,显示器则用于显示运算结果。

2.软件设计:软件部分包括主程序和子程序。

主程序负责初始化硬件、读取键盘输入和显示运算结果。

子程序包括加减乘除的运算子程序,可根据输入的运算符和操作数进行相应的运算。

3.算法实现:在加减乘除的运算子程序中,采用基本的数学运算方法实现。

对于加法,直接将两个操作数相加;对于减法,将两个操作数相减;对于乘法,采用循环相乘的方法;对于除法,采用循环相除的方法。

三、实验结果在实验中,我们成功地使用51单片机设计了一个简易计算器,实现了加减乘除的基本运算功能。

在测试过程中,我们输入了不同的数字和运算符,得到了正确的运算结果。

同时,我们也测试了计算器的稳定性,发现其在连续运算时表现良好,没有出现明显的误差或故障。

四、结论基于51单片机的简易计算器设计具有简单易行、实用性强等优点。

通过实验测试,我们验证了其可行性和稳定性。

此外,该设计还可以根据需要进行扩展和优化,例如增加更多的运算功能、优化算法等。

未来,我们可以进一步研究如何提高计算器的运算速度和精度,以及如何将其应用于更多的实际应用场景中。

五、改进意见与展望1.增加更多的运算功能:例如实现括号、开方、指数等高级运算,满足更复杂的数学计算需求。

2.优化算法:针对现有的加减乘除运算算法进行优化,提高运算速度和精度。

例如采用更高效的除法算法,减少运算时间。

3.增加存储功能:在计算器中加入存储单元,使得用户可以在多个步骤之间进行数据传递和保存。

4.增强人机交互界面:优化显示器的显示效果,增加用户输入的便捷性,提高用户体验。

51单片机简易计算器设计-51单片机简易计算器课程设计

51单片机简易计算器设计-51单片机简易计算器课程设计

51单⽚机简易计算器设计-51单⽚机简易计算器课程设计⽬录⼀、设计任务和要求 (2)1、设计要求 (2)2、设计⽅案的确定 (2)⼆、硬件设计 (2)1、单⽚机最⼩系统 (2)2、键盘电路的设计 (3)3、显⽰电路的设计 (3)4、系统硬件电路图 (4)三、软件设计 (5)1 系统设计 (5)2 显⽰电路的设计 (6)3、程序清单 (8)四、调试与仿真 (14)五、试验箱实物图 (14)六、⼼得体会 (15)⼀、设计任务和要求1、设计要求利⽤单⽚机设计并制作简易计算器。

具体要求如下:1、4*4按键⽤于0~9的数字输⼊、加减乘除、等于、清零功能;2、能实现简单的加减乘除运算;3、输⼊数字及计算结果通过LED或LCD显⽰器显⽰。

2、设计⽅案的确定按照设计要求,本课题需要使⽤数码管显⽰和扩展4*4键盘,由于AT89C51芯⽚的I⼝不够多,⽽且为了硬件电路设计的简单化,故选择串⾏动态显⽰和⽤P1⼝扩展4*4键盘,扩展的4*4键盘定义⼗个数字键,六个功能键,使⽤串⾏动态显⽰显⽰运算结果。

主程序进⾏初始化,采⽤⾏列扫描进⾏查表得出键值,每次按键后调⽤显⽰⼦程序。

⼆、硬件设计简易数字计算器系统硬件设计主要包括:键盘电路,显⽰电路以及其他辅助电路。

下⾯分别进⾏设计。

1.单⽚机最⼩系统单⽚机最⼩系统就是⽀持主芯⽚正常⼯作的最⼩部分,包括主控芯⽚、复位电路和晶振电路。

(1)、复位电路复位电路本设计采⽤上电与⼿动复位电路,电阻分别选取100和10K,电容选取10uF,系统⼀上电,芯⽚就复位,或者中途按按键也可以进⾏复位。

(2)、晶振电路图三晶振电路晶振电路是单⽚机的⼼脏,它⽤于产⽣单⽚机⼯作所需要的时钟信号。

单⽚机的晶振选取11.0592MHz,晶振旁电容选取30pF。

2.键盘电路的设计键盘可分为两类:编码键盘和⾮编码键盘。

编码键盘是较多按键(20个以上)和专⽤驱动芯⽚的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,⽆需系统软件⼲预。

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

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

51单片机简易计算器设计报告
本文将介绍51单片机简易计算器的设计报告。

该计算器通过
16位的LCD显示屏实现了基本计算功能,包括加、减、乘、除、取反、开方等。

1. 硬件设计
该计算器的核心部件是STC89C52单片机。

STC89C52是一种
高性能、低功耗的8位单片机,拥有8KB的Flash程序存储器和128字节的内部RAM,可提供多种功能和通讯接口。

通过
I/O口与LCD模块通讯,实现输出功能。

该计算器使用16位的LCD显示屏,显示范围为-99.99~99.99,共有6个数字位。

显示屏使用了ST7920控制器,可通过串行、并行等多种方式控制。

2. 软件设计
该计算器的软件设计主要包括三部分:键盘扫描,计算功能和LCD显示。

键盘扫描:该计算器采用4x5矩阵键盘,通过程序对键盘进行扫描,实现对不同按键的检测。

计算功能:该计算器可以实现基本的四则运算、取反、开方等功能。

对于四则运算,通过栈来实现计算,将运算符压入栈中,然后将操作数从栈中取出进行计算。

LCD显示:该计算器使用16位的LCD显示屏,通过程序控制数据和命令的传输,将计算结果显示在LCD屏幕上。

3. 总结
通过对51单片机简易计算器的设计报告,可以看出该计算器实现了基本的计算功能,通过硬件设计和软件设计相结合,将计算器的功能实现得十分完整。

该计算器的设计初步掌握了51单片机的应用,有助于后续项目的开展。

基于51单片机计算器设计

基于51单片机计算器设计

基于51单片机计算器设计计算器是一种常用的计算工具,用来进行加减乘除等基本运算。

本文将介绍基于51单片机的计算器设计,主要包括功能设计、硬件设计和软件设计。

一、功能设计:1.基本计算功能:实现加法、减法、乘法和除法四种基本运算功能。

2.小数运算功能:支持小数的四则运算。

3.多位数运算功能:支持多位数的四则运算。

4.括号运算功能:支持括号运算,可以进行复杂的运算。

5.求平方功能:支持对一个数求平方。

6.求开方功能:支持对一个数求开方。

7.求倒数功能:支持对一个数求倒数。

8.清零功能:清零计算器,重新开始计算。

9.删除功能:删除输入的数字或者运算符。

二、硬件设计:硬件设计主要包括51单片机、LCD显示屏、矩阵按键、蜂鸣器和电源电路等。

1.51单片机:作为计算器的核心控制器,负责接收输入的数据和指令,并进行相应的计算和显示。

2.LCD显示屏:用于显示计算器的输入和输出结果。

3.矩阵按键:用于接收用户输入的数字和运算符。

4.蜂鸣器:用于发出提示音,比如输入错误时进行报警。

5.电源电路:提供计算器运行所需的电源。

三、软件设计:1.输入处理:计算器通过矩阵按键接收用户输入的数字和运算符,并使用数组保存输入的数据和指令。

2.数字运算:计算器需要根据用户输入的数字和运算符进行相应的运算,如加法、减法、乘法和除法等。

3.显示处理:计算器使用LCD显示屏将输入和计算结果显示出来。

4.错误处理:计算器需要对用户输入错误进行相应的处理,如输入非法字符时进行提示或报警。

5.性能优化:计算器需要进行相关的性能优化,如加入负责时间延迟,以适应不同的使用场景。

四、总结:本文介绍了基于51单片机的计算器设计,包括功能设计、硬件设计和软件设计。

这种计算器可以实现基本的四则运算功能,并支持小数运算、多位数运算和括号运算等复杂运算。

通过合理的硬件设计和软件设计,可以使得计算器更加稳定和可靠。

这种设计不仅可以提高计算器的使用体验,还可以为用户提供更多的计算功能和更加便捷的计算方式。

基于51单片机的计算器设计程序代码(汇编)

基于51单片机的计算器设计程序代码(汇编)

DBUF EQU 30HTEMP EQU 40HYJ EQU 50H ;结果存放YJ1 EQU 51H ;中间结果存放GONG EQU 52H ;功能键存放ORG 00HSTART:MOV R3,#0 ;初始化显示为空MOV GONG,#0MOV 30H,#10HMOV 31H,#10HMOV 32H,#10HMOV 33H,#10HMOV 34H,#10HMLOOP:CALL DISP ;PAN调显示子程序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 ;输入值暂存R4 MOV 34H,A ;输入值送显示缓存MOV 33H,#10HMOV 32H,#10HLJMP MLOOP ;等待再次输入E12:MOV R7,A ;个位数暂存R7 MOV B,#10MOV A,R4MUL AB ;十位数ADD A,R7MOV R4,A ;输入值存R4MOV 32H,#10H ;输入值送显示缓存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 30H,#10H ;显示清空MOV 31H,#10HMOV 32H,#10HMOV 33H,#10HMOV 34H,#10HLJMP MLOOPE2: MOV 34H,#10HMOV 33H,#10HMOV 32H,#10HMOV 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:M OV 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 DISP11 ;结果是否为一位数MOV B,#10MOV A,YJ1DIV ABMOV YJ1,AMOV A,BMOV 33H,A ;十位送显示缓存MOV A,YJ1JZ DISP11 ;结果是否为二位数MOV 32H,A ;百位数送显示缓存DISP11: LJMP MLOOPDISP:MOV R0,#DBUF ;显示子程序MOV R1,#TEMP+4MOV R2,#5DP10:MOV DPTR,#SEGTABMOV A,@R0MOVC A,@A+DPTRMOV @R1,AINC R0DEC R1DJNZ R2,DP10MOV R0,#TEMPDP12:MOV A,@R0MOV P0,Aclr P2。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1引言当今时代,是一个新技术层出不穷的时代。

在电子领域,尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代。

单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。

目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。

过去习惯于传统电子领域的工程师、技术员正面临着全新的挑战,如不能在较短时间内学会单片机,势必会被时代所遗弃,只有勇敢地面对现实,挑战自我,加强学习,争取在较短的时间内将单片机技术融会贯通,才能跟上时代的步伐。

它所给人带来的方便也是不可否定的,它在一块芯片内集成了计算机的各种功能部件,构成一种单片式的微型计算机。

20世纪80年代以来,国际上单片机的发展迅速,其产品之多令人目不暇接,单片机应用不断深入,新技术层出不穷。

20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

本设计是由单片机实现的模拟计算器,它不仅能实现数据的加减乘除运算,而且还能使数据及其计算结果在数码管上显示出来,能够实现0-256的数字四则运算。

本设计是用单片机AT89C51来控制,采用共阳极数码显示,软件部分是由C语言来编写的。

设计任务利用键盘和数码管设计一个简单的数学计算器,可以完成简单的如加,减,乘,除的四则运算,并将运算结果在数码管上显示出来。

2.方案论证与设计根据功能和指标要求,本系统选用MCS 51 单片机为主控机。

通过扩展必要的外围接口电路,实现对计算器的设计。

具体设计考虑如下:①由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高,故我们采用可以进行四位数字的运算,选用8 个LED 数码管显示数据和结果。

②另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可。

系统模块图:2.1 输入模块:键盘扫描计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式。

为此,我们引入了矩阵键盘的应用,采用四条I/O线作为行线,四条I/O 线作为列线组成键盘。

在行线和列线的每个交叉点上设置一个按键。

这样键盘上按键的个数就为4×4个。

这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。

矩阵键盘的工作原理:计算器的键盘布局如图2 所示:一般有16 个键组成,在单片机中正好可以用一个P 口实现16 个按键功能,这种形式在单片机系统中也最常用。

由图 3 矩阵键盘内部电路图可以知道,当无按键闭合时,P10~P13 与P14~P17 之间开路。

当有键闭合时,与闭合键相连的两条I/O 口线之间短路。

判断有无按键按下的方法是:第一步,置列线P14~P17 为输入状态,从行线P10~P13 输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。

第二步,行线轮流输出低电平,从列线P14~P17 读入数据,若有某一列为低电平,则对应行线上有键按下。

综合一二两步的结果,可确定按键编号。

但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。

2.2 运算模块:单片机控制AT89C51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O 等一台计算机所需要的基本功能部件。

如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。

[3][5]单片机是靠程序运行的,并且可以修改。

通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能。

2.3 显示模块:LED 显示发光二极管LED 是单片机应用系统中的一宗简单而常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。

因而作为典型的外围器件,LED 显示单元是反映系统输出和操作输入的有效器件。

LED 具备数字接口可以方便的和大年纪系统连接;它的优点是价格低,寿命长,对电压电流的要求低及容易实现多路等,因而在单片机应用系统中获得了广泛的应用。

[2][4]通常的数码显示器是由7 段条形的LED 组成(如图4 所示),点亮适当的字段,就可显示出不同的数字。

我们采用8 段数码管,其中位于显示器右下角的LED 作小数点用。

LED 显示器有两种不同的形式:共阴极和共阳极。

本次设计采用共阴极接法(如图5所示)。

3、硬件原理3.1 硬件连接图3-1所示是简易计算器电路原理图。

P3口用于键盘输入,接4X4键值与键盘对应表如图表所示,P0口和P2口用于显示,P2口用于显示数位值高位,P0用于显示数位值的低位。

键值 0 1 2 3 4 5 6 7 8 9 + - x / = ON/C功能 0 1 2 3 4 5 6 7 8 9 + - x / = 清零4、软件设计在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。

设计的中心思想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以单独设计、编程和调试,然后组合起来。

这种方法便于设计和调试,容易实现多个程序共存,但各个模块之间的连接有一定的难度。

根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计。

这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。

功能流程图如下:程序流程图程序:#include"at89x52.h" //头文件//---------------------预定义模块---------------------------////*********************预定义数组***************************////字形码 0 1 2 3 4 5 6 7const unsigned char KEY_NUMBER[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 // 8 9 + - * / = CE,0x7f,0x6f,0xF0,0xC0,0xF6,0xD2,0x89,0xB9};//扫描键码 0 1 2 3 4 5 6 7const unsigned char KEY_VALUE[]={0x7e,0xbe,0xde,0xee,0x7d,0xbd,0xdd,0xed // 8 9 A B C D E F,0x7b,0xbb,0xdb,0xeb,0x77,0xb7,0xd7,0xe7};//数码管各显示位: 0位 1位 2位 3位 4位const unsigned char DISPLAY_BIT[5]={0xFE,0xFD,0xFB,0xF7,0xEF};//十进制转换权值const int bcd_right[5]={1,10,100,1000,10000};unsigned char buffer_number[5]; //输入数据缓冲区unsigned char buffer_dis[5]; //计算结果显示缓冲区unsigned long int buffer_opera[5]; //输入数据十进制转换缓冲区//*******************预定义变量***************************//unsigned char const NULL=0xFF;unsigned char opera=0x00; //输入数据转换指针unsigned char count=0x00; //键盘输入指针unsigned char enter_number=0x01; //输入数据显示和计算结果显示开关unsigned char ptr_i=0x00; //运算结果转换指针unsigned char buffer_control; //控制键缓冲区unsigned char key_bcd; //按键的十进制值unsigned char scan_key; //当前扫描到的键值unsigned char temp_c; //临时变量unsigned char ptr_c; //十进制转化指针unsigned char account; //四则运算标志unsigned long int result=0x00; //当前计算结果unsigned long int rlt; //前一个输入的数的十进制值unsigned long int sec_rlt; //后一个输入的数的十进制值unsigned long int c_n; //当前转换的运算结果/*******************************************************名称: 初始化运行环境功能:初始化各寄存器与端口状态参数:无返回值:无*******************************************************/void DeviceInit(void){TL0=0xBF; //置定时器中断时间为20msTH0=0x63;TMOD=0x01; //设定定时器/计数器0工作方式为1IE=0x82; //允许全局中断,允许定时器/计数器0溢出中断TR0=0x01; //启动定时器/计数器0}/******************************************************* 名称: 延时模块功能:延时参数: unsigned char i返回值:无*******************************************************/ void Delay(unsigned char i){int j;while((i--)!=0){ for(j=0;j<=0x6f;j++);}}/******************************************************* 名称: 清除模块功能:清除当前已经输入的数据通过输入缓冲区中的数乘以它们各自对应的权值再求和参数:参数为1时,清除输入数据缓冲区参数为2时,清除十进制转化缓冲区返回值:无*******************************************************/ void Clear(unsigned char clr_pid){temp_c=0x00;for(temp_c;temp_c<=4;temp_c++){if(clr_pid==1) //参数为1时,输入数据缓冲区全部置0{count=0x00; //按键次数置0buffer_number[temp_c]=0x00;}if(clr_pid==2) //参数为2时,输入数据缓冲区全部置0{opera=0x00; //输入数的个数置0buffer_opera[temp_c]=0x00;}}}/******************************************************* 名称: 数据处理模块功能:将输入的数据转化为10进制数通过输入缓冲区中的数乘以它们各自对应的权值再求和参数:无返回值:无*******************************************************/void BcdConvert(void){temp_c=0x00;ptr_c=opera-1;if(opera !=0){while(temp_c<=ptr_c) //当前位乘以对应的权值再加上前一次的计算值{ //将输入数据缓冲区中的数转化为对应的十进制数buffer_opera[ptr_c-temp_c]*=bcd_right[temp_c];result+=buffer_opera[ptr_c-temp_c];temp_c++;}Clear(2); //转化完成,将十进制转换缓冲区清0}}/*******************************************************名称: 计算结果处理模块功能:按位分解计算结果,留待显示将要转化的数除以10后取余数,就可以将其按位分解转化的结果是反向的参数:无返回值:无*******************************************************/void Convert(void){c_n=result;//将计算结果反向分解,用于显示do{ //除10取余buffer_dis[ptr_i]=c_n%10;c_n/=10;ptr_i++;}while(c_n!=0x00);}/*******************************************************名称: 四则运算模块功能:对先后输入的两个数按规则进行四则运算参数:无返回值:无*******************************************************/ void Calculate(void){BcdConvert(); //将要运算的数转化成10进制数enter_number=0x00; //设置运算结果显示标志switch(account){case 0x00: //加法,将前后输入的两个数相加result+=rlt;break;case 0x01: //减法if(rlt>=result)result=rlt-result;else //如果被减数比减数小{buffer_control=0xC0;result=~(rlt-result-0x01);}break;case 0x02: //乘法result*=rlt;break;case 0x03: //除法result=rlt/result;break;}Convert(); //调用计算结果处理函数Clear(2); //清除计算结果}/******************************************************* 名称: 控制键处理模块功能:对各个控制键进行对应的操作参数:无返回值:无*******************************************************/ void Control(void){Clear(1); //清除显示缓冲区//*********************等号处理*********************// if(buffer_control==0x89)Calculate(); //调用计算函数//*********************清除键处理*******************// else if(buffer_control==0xB9){Clear(1); //清除已输入的数Clear(2); //清除当前也转化的值ptr_i=0x00; //清除显示指针result=rlt=0x00; //清除元算结果}//********************运算符号处理******************// else{BcdConvert(); //将先前输入的数转化为10进制数rlt=result; //保存转化的结果result=0x00; //清除上一次转化的结果,准备下一次转化switch(buffer_control){case 0xF0: //加法account=0x00;break;case 0xC0: //减法account=0x01;break;case 0xF6: //乘法account=0x02; //乘法运算标志break;case 0xD2: //除法account=0x03; //除法运算标志break;default:break;}}}/******************************************************* 名称: 按键判断模块功能:判断是否有键被按下参数:无返回值:有键按下则返回1没有键按下则返回0*******************************************************/ unsigned char KeyDown(void){temp_c=0x00;P2=0xf0;temp_c=P2;if(temp_c!=0xf0)return 1; //有键按下返回1elsereturn 0; //没有键按下返回0}/*******************************************************名称: 按键处理函模块功能:获取当前按键参数:无返回值:返回当前按键的字形码如果没有键按下,返回NULL*******************************************************/unsigned char KeyPress (void){if(KeyDown()==1) //判断是否有键按下{Delay(30); //延时消抖//**************扫描当前被按下的键值***********************//P2=0xF0; //扫描低4位scan_key=P2; //记录扫描结果P2=0x0F; //扫描高四位temp_c=P2; //记录扫描结果scan_key^=temp_c; //两结果相异或得键值//**************当有键被按下时关闭显示*********************//do{P1=0xFF; //如果有键按下,关闭显示}while(KeyDown()==1); //等待按键释放,如果有键按下,则不显示任何数Delay(30); //延时消抖//**********当有键按下后开始扫描所按下的键***************//for(key_bcd=0;key_bcd<=15;key_bcd++) //查找键值对应的字符码{if(KEY_VALUE[key_bcd]==scan_key) //如果找到对应的键值{ptr_i=0x00; //清除运算结果显示指针,开始显示输入的数据//*****************判断是数字键还是控制键****************//if(key_bcd<=0x09) //小于10的键为数字键{enter_number=0x01; //设置输入数据显示标志if(count<=0x04) //如果缓冲区未满{buffer_number[count]=KEY_NUMBER[key_bcd]; //当前键送缓冲区buffer_opera[opera]=key_bcd; //保存当前按键的十进制值opera++; //指针自加count++;}else //如果缓冲区溢出{count=0x00;Clear(1); //清楚缓冲区buffer_number[0]=KEY_NUMBER[key_bcd]; //缓冲区初始位存入当前键的字符码buffer_opera[opera]=key_bcd; //保存当前按键的十进制值opera++;count++;}return KEY_NUMBER[key_bcd]; //返回对应的数字字符值}else //大于9的键为控制键{buffer_control=KEY_NUMBER[key_bcd]; //控制键送控制缓冲区Control(); //调用控制键处理函数}}}}elsereturn NULL; //如果没有键按下,返回NULL}/*******************************************************名称: 数码管显示模块功能:在数码管上显示输入的数据和计算后的结果参数:无返回值:无*******************************************************/void Display(void){unsigned char m=0; //显示字符指针unsigned char n=0; //显示位指针;while(KeyPress()==NULL) //当有键被按下时开始显示{//****************显示当前输入的数据*******************//if(enter_number==0x01) //显示输入中的数据{if(m!=count) //字符指针在界线内{if(n<=count-1) //显示位未越界{P1=DISPLAY_BIT[n]; //设置显示位P0=buffer_number[m]; //在数码管上显示字符Delay(0x02); //延时消抖n++;m++;}else //显示位越界n=0;}else //字符指针越界m=0;}//****************显示运算后的结果*********************//else //显示运算的结果{if(m!=ptr_i) //字符指针在界线内{if(n<=ptr_i-1) //显示位未越界{P1=DISPLAY_BIT[ptr_i-n-1]; //设置显示位P0=KEY_NUMBER[buffer_dis[m]]; //在数码管上显示字符Delay(0x02); //延时消抖n++;m++;}else //显示位越界n=0;}else //字符指针越界m=0;Clear(1);}//*******************显示运算操作符***********************//P1=0xDF; //打开运算符号显示位P0=buffer_control; //显示当前运算符号Delay(0x02);}}/*******************************************************名称: 主函数功能:应用程序入口参数:无返回值:无*******************************************************/void main(){DeviceInit(); //调用系统初始化函数while(1);}/*******************************************************名称: 定时器中断模块功能:调用键盘监视模块获取键盘输入调用显示模块来显示输入与输出参数:无返回值:无*******************************************************/void timer0_over(void) interrupt 1{TL0=0xBF; //中断间隔为20msTH0=0x63;KeyPress(); //调用键盘扫描程序Display(); //调用显示函数}5. 总结通过该计算器的设计我深入学习数码管扫描和键盘控制,提高对了51系列单片机的实际应用能力。

相关文档
最新文档