简易计算器课程设计论文.docx

上传人:b****6 文档编号:8703159 上传时间:2023-02-01 格式:DOCX 页数:17 大小:440.56KB
下载 相关 举报
简易计算器课程设计论文.docx_第1页
第1页 / 共17页
简易计算器课程设计论文.docx_第2页
第2页 / 共17页
简易计算器课程设计论文.docx_第3页
第3页 / 共17页
简易计算器课程设计论文.docx_第4页
第4页 / 共17页
简易计算器课程设计论文.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

简易计算器课程设计论文.docx

《简易计算器课程设计论文.docx》由会员分享,可在线阅读,更多相关《简易计算器课程设计论文.docx(17页珍藏版)》请在冰豆网上搜索。

简易计算器课程设计论文.docx

简易计算器课程设计论文

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、设计要求

利用单片机设计并制作简易计算器。

具体要求如下:

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个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。

通用计算机使用的标准键盘就是编码键盘。

当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。

但大多数智能仪器和电子产品的按键数目都不太多(20个以内),为了降低成本和简化电路通常采用非编码键盘。

非编码键盘的接口电路有设计者根据需要自行决定,按键信息通过接口软件来获取。

本课题需要的是16个按键,故选择用非编码键盘。

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

矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。

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

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

矩阵键盘的工作原理:

计算器的键盘布局如图五所示:

一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。

具体电路连接如图所示:

4*4键盘接口电路

3.显示电路的设计

当系统需要显示少量数据时,采用LED数码管进行显示是一种经济实用的方法。

数码管显示有静态显示和动态显示两种方法。

为了减少端口的使用,故选择动态显示。

电路如下图所示:

4、系统硬件电路图

总电路原理图

三、软件设计

在十进制计算器的软件规划要求下,简易计算器的程序主要包括以下功能模块:

(1)主模块,为系统的初始化。

(2)显示与读键模块,分为判键程序段、运算操作子程序、显示子程序等部分;

1.系统设计

(一)系统模块图

图六系统模块图

此系统包括输入、运算和显示模块,由单片机控制。

其中通过输入键盘模块将数字0~9和运算符号“+”、“-”、“*”、“/”输入单片机进行运算;运算模块分别根据输入的运算符进行加减乘除运算;显示模块将运算后的数值通过动态扫描使之在数码管上输出。

(2)系统总流程图

主程序主要是用来进行初始化的,调用其他子程序,清空各个标志位,清空缓存区,读取键码,判断功能,在LED上作出回应,主程序流程图如图六所示。

(1)数字送显示缓冲程序设计

简易计算器所显示的数值最大位三位。

要显示数值,先判断数值大小和位数,如果是超过三位或大于255,将不显示数字。

可重新输入数字,再次计算。

(2)运算程序的设计

首先初始化参数,送LED三位显示“0”,其它位不显示。

然后扫描键盘看是否有键输入,若有,读取键码。

判断键码是数字键、清零键还是功能键,是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。

图七主程序流程图

2、显示与按键设计

(1)LED显示程序设计

LED显示器由七段发光二极管组成,排列成8字形状,因此也称为七段LED显示器。

为了显示数字或符号,要为LED显示器提供代码,即字形代码。

七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。

简易计算器用到的数字0~9的共阳极字形代码如下表:

显示字型

g

f

e

d

c

b

a

段码

0

0

1

1

1

1

1

1

0c0h

1

0

0

0

0

1

1

0

0f9h

2

1

0

1

1

0

1

1

0a4h

3

1

0

0

1

1

1

1

0b0h

4

1

1

0

0

1

1

0

99h

5

1

1

0

1

1

0

1

92h

6

1

1

1

1

1

0

1

82h

7

0

0

0

0

1

1

1

0f8h

8

1

1

1

1

1

1

1

80h

9

1

1

0

1

1

1

1

90h

表一共阳极数码管段码对照表

(2)读键子程序设计

为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码——键码。

为了得到被按键的键码,现使用行扫描法识别按键。

其程序框图如图八:

读键程序使用的是反转法读键,不管键盘矩阵的规模大小,均进行两次读键。

第一次所有列线均输出低电平,从所有读入键盘信息(行信息);第二次所有行线均输出低电平,从所有行线读入键盘信息(列信息)。

将两次读键信息进行组合就可以得到按键的特征编码,然后通过查表得到按键的顺序编码。

将各特征编码按希望的顺序排成一张表,然后用当前读得的特征码来查表。

当表中有该特征码时,它的位置就是对应的顺序编码;当表中没有该特征码时,说明这是一个没有定义的键码,与没有按键(0FFH)同等看待。

图八计算键值子程序流程图

3、程序清单

YJEQU50H;结果存放

YJ1EQU51H;中间结果存放

GONGEQU52H;功能键存放

ORG00H

START:

MOVR3,#0;初始化显示为空

MOVGONG,#0

MOV32H,#00H

MOV33H,#00H

MOV34H,#00H

MLOOP:

CALLDISP;调显示子程序

WAIT:

CALLTESTKEY;判断有无按键

JZWAIT

CALLGETKEY;读键

INCR3;按键个数

CJNEA,#0,NEXT1;判断是否数字键

LJMPE1;转数字键处理

NEXT1:

CJNEA,#1,NEXT2

LJMPE1

NEXT2:

CJNEA,#2,NEXT3

LJMPE1

NEXT3:

CJNEA,#3,NEXT4

LJMPE1

NEXT4:

CJNEA,#4,NEXT5

LJMPE1

NEXT5:

CJNEA,#5,NEXT6

LJMPE1

NEXT6:

CJNEA,#6,NEXT7

LJMPE1

NEXT7:

CJNEA,#7,NEXT8

LJMPE1

NEXT8:

CJNEA,#8,NEXT9

LJMPE1

NEXT9:

CJNEA,#9,NEXT10

LJMPE1

NEXT10:

CJNEA,#10,NEXT11;判断是否功能键

LJMPE2;转功能键处理

NEXT11:

CJNEA,#11,NEXT12

LJMPE2

NEXT12:

CJNEA,#12,NEXT13

LJMPE2

NEXT13:

CJNEA,#13,NEXT14

LJMPE2

NEXT14:

CJNEA,#14,NEXT15

LJMPE2

NEXT15:

LJMPE3;判断是否清除键

E1:

CJNER3,#1,N1;判断第几次按键

LJMPE11;为第一个数字

N1:

CJNER3,#2,N2

LJMPE12;为第二个数字

N2:

CJNER3,#3,N3

LJMPE13;为第三个数字

N3:

LJMPE3;第四个数字转溢出

E11:

MOVR4,A;输入值暂存R4

MOV34H,A;输入值送显示缓存

MOV33H,#00H

MOV32H,#00H

LJMPMLOOP;等待再次输入

E12:

MOVR7,A;个位数暂存R7

MOVB,#10

MOVA,R4

MULAB;十位数

ADDA,R7

MOVR4,A;输入值存R4

MOV32H,#00H;输入值送显示缓存

MOV33H,34H

MOV34H,R7

LJMPMLOOP

E13:

MOVR7,A

MOVB,#10

MOVA,R4

MULAB

JBOV,E3;输入溢出

ADDA,R7

JBCY,E3;输入溢出

MOVR4,A

MOV32H,33H;输入值送显示缓存

MOV33H,34H

MOV34H,R7

LJMPMLOOP

E3:

MOVR3,#0;按键次数清零

MOVR4,#0;输入值清零

MOVYJ,#0;计算结果清零

MOVGONG,#0;功能键设为零

MOV32H,#00H;显示清空

MOV33H,#00H

MOV34H,#00H

LJMPMLOOP

E2:

MOV34H,#00H

MOV33H,#00H

MOV32H,#00H

MOVR0,GONG;与上次功能键交换

MOVGONG,A

MOVA,R0

CJNEA,#10,N21;判断功能键

LJMPJIA;"+"

N21:

CJNEA,#11,N22

LJMPJIAN;"-"

N22:

CJNEA,#12,N23

LJMPCHENG;"*"

N23:

CJNEA,#13,N24

LJMPCHU;"/"

N24:

CJNEA,#0,N25

LJMPFIRST;首次按功能键

N25:

LJMPDEN;"="

N4:

LJMPE3

FIRST:

MOVYJ,R4;输入值送结果

MOVR3,#0;按键次数清零

LJMPDISP1;结果处理

JIA:

MOVA,YJ;上次结果送累加器

ADDA,R4;上次结果加输入值

JBCY,N4;溢出

MOVYJ,A;存本次结果

MOVR3,#0;按键次数清零

LJMPDISP1

JIAN:

MOVA,YJ

SUBBA,R4;上次结果减输入值

JBCY,N4;负数溢出

MOVYJ,A

MOVR3,#0

LJMPDISP1

CHENG:

MOVA,YJ

MOVB,A

MOVA,R4

MULAB;上次结果乘输入值

JBOV,N4;溢出

MOVYJ,A

LJMPDISP1

CHU:

MOVA,R4

MOVB,A

MOVA,YJ

DIVAB;上次结果除输入值

MOVYJ,A

MOVR3,#0

LJMPDISP1

DEN:

MOVR3,#0

LJMPDISP1

DISP1:

MOVB,#10

MOVA,YJ;结果送累加器

DIVAB;结果除10

MOVYJ1,A;暂存"商"

MOVA,B;取个位数

MOV34H,A;个位数送显示缓存

MOVA,YJ1

JZDISP11;结果是否为一位数

MOVB,#10

MOVA,YJ1

DIVAB

MOVYJ1,A

MOVA,B

MOV33H,A;十位送显示缓存

MOVA,YJ1

JZDISP11;结果是否为二位数

MOV32H,A;百位数送显示缓存

DISP11:

LJMPMLOOP

DISP:

MOVR0,#34H

DIR1:

MOVDPTR,#SEGTAB

MOVA,@R0

MOVCA,@A+DPTR

MOVP0,A

CJNER0,#34H,DIR2

SETBP2.0

CALLD1MS

CLRP2.0

DECR0

SJMPDIR1

DIR2:

CJNER0,#33H,DIR3

SETBP2.1

CALLD1MS

CLRP2.1

DECR0

SJMPDIR1

DIR3:

SETBP2.2

CALLD1MS

CLRP2.2

RET

D1MS:

MOVR7,#02H

DMS:

MOVR6,#0F0H

DJNZR6,$

DJNZR7,DMS

RET

SEGTAB:

DB0C0H,0F9H,0A4H,0B0H

DB99H,92H,82H,0F8H

DB80H,90H,88H,83H

DB0C6H,0A1H,86H,8EH

TESTKEY:

ACALLDISP

MOVP1,#0FH;读入键状态

MOVA,P1

CPLA

ANLA,#0FH;高四位不用

RET

KEYTABLE:

DB0EEH,0EDH,0DDH,0BDH;键码定义

DB0EBH,0DBH,0BBH,0E7H

DB0D7H,0B7H,0DEH,0BEH

DB07EH,07DH,07BH,077H

GETKEY:

MOVR6,#10;读键子程序

ACALLDELAY

MOVP1,#0FH

MOVA,P1

CJNEA,0FH,K12

LJMPMLOOP

K12:

MOVB,A

MOVP1,#0EFH

MOVA,P1

CJNEA,#0EFH,K13

MOVP1,#0DFH

MOVA,P1

CJNEA,#0DFH,K13

MOVP1,#0BFH

MOVA,P1

CJNEA,#0BFH,K13

MOVP1,#07FH

MOVA,P1

CJNEA,#07FH,K13

LJMPMLOOP

K13:

ANLA,#0F0H

ORLA,B

MOVB,A

MOVR1,#16

MOVR2,#0

MOVDPTR,#KEYTABLE

K14:

MOVA,R2

MOVCA,@A+DPTR

CJNEA,B,K16

MOVP1,#0FH

K15:

MOVA,P1

CJNEA,#0FH,K15

MOVR6,#10

ACALLDELAY

MOVA,R2

RET

K16:

INCR2

DJNZR1,K14

AJMPMLOOP

;10ms延时子程序

DELAY:

MOVR7,#10

TS1:

MOVR6,#0FFH

TS2:

NOP

NOP

DJNZR6,TS2

DJNZR7,TS1

RET

END

4、调试与仿真

在Proteus中将硬件电路全部接好以后,将Keil中生成的.hex文件导入到单片机中,点击开始仿真按钮,电路开始仿真。

可以观察到:

数码管显示“000”。

分别依次按下按键“9”、“*”、“9”和“=”,可以看到数码管显示“81”;也可以分别调试其它功能键,结果发现调试结果与预期的理论值相吻合,即本次课程设计已成功。

5、试验箱实物图

6、心得体会

为期两周的单片机课程设计结束了,在老师的指导下,终于完成了我们的设计任务-简易计算器。

总的来说,这次课程设计是比较成功的。

当然,这其中也经历了许多坎坷,但是在我的坚持不懈下,在老师的细心指导下,在同学们的热情帮助下,最终克服了种种困难,取得了成功。

刚开始接到这个计算器的课程设计任务时,由于缺乏编写大量程序的经验,不能如行云流水般的将全部的各部分代码写出,于是去网上查找相关资料,了解计算器的输入控制原理、运算处理以及显示的原理。

了解之后自己尝试编写程序,在此过程中,其中键盘扫描和动态扫描显示扫描程序困扰了我很久,经过八九天的辛苦工作,终于初步把所需要的程序编好了,于是就用Keiluversion2进行仿真,在仿真期间也发现了许多错误,经过反复的编译差错,仿真编译通过后,于是开始在Proteus中连硬件电路,全部接完电路之后将Keil生成的.Hex文件导入进行仿真,发现软件与硬件不能够对应协调工作,于是分别对软件和硬件进行检查,经过反复的仿真调试,并且在同学的帮助和自己对每个子程序进行仿真观察下,终于在课设快结束时成功的调试出结果了。

这就是我这两周课程设计的经过,看似简单,过程却曲折艰辛。

通过这次课程设计,我进一步加深了对电子自动控制的了解。

并进一步熟练了对Keil和Proteus软件的操作。

在编写程序的过程中,遇到了很多问题,使我发现自己以前学习上存在的不足,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好。

通过请教老师,终于把问题都解决了,并加深了对计算器工作的原理的了解。

同时也掌握了做课程设计的一般流程,为以后的设计积累了一定的经验。

做课程设计时,先查阅相关知识,把原理吃透,确定一个大的设计方向,在按照这个方向分模块的把要实现的功能用流程图的形式展示。

学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。

总之,通过这次的设计,进一步了解了单片微型计算机及应用原理,收获很大,对软件编程、排错调试、查阅资料等方面得到较全面的锻炼和提高。

同时通过本次课程设计的学习,掌握了一种系统的研究方法,可以进行一些简单的编程,我还深深的体会到设计课的重要性和目的性所在。

为了完成项目,在网络上找到了许多相关的资料,大大扩充自己的知识面,使许多以前想解决却无法解决的困难迎刃而解。

将书本上的理论知识和实际有机地结合起来,从理论中得出结论。

锻炼了实际分析问题和解决问题的能力,提高了适应实际的能力,为今后的学习和实践打下了良好的基础。

此次课设还巩固和综合运用所学过的原理知识,从而提高自己的实际动手能力和独立思考的能力。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1