简易计算器课程设计论文.docx
- 文档编号:4822487
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:22
- 大小:465.71KB
简易计算器课程设计论文.docx
《简易计算器课程设计论文.docx》由会员分享,可在线阅读,更多相关《简易计算器课程设计论文.docx(22页珍藏版)》请在冰点文库上搜索。
简易计算器课程设计论文
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键盘,由于AT89C5芯片的I口不够多,而且为了硬件电路设计的简单化,故选择串行动态显示和用P1口扩展4*4键盘,扩展的4*4键盘定义十个数字键,六个功能键,使用串行动态显示显示运算结果。
主程序进行初始化,采用行列扫描进行查表得出键值,每次按键后调用显示子程序。
二、硬件设计
简易数字计算器系统硬件设计主要包括:
键盘电路,显示电路以及其他辅助电路。
下面分别进行设计。
1.单片机最小系统
单片机最小系统就是支持主芯片正常工作的最小部分,包括主控芯片、复位电路和晶振电路。
(1)、复位电路
本设计采用上电与手动复位电路,电阻分别选取100和10K,电容选取10uF,系统一上电,芯片就复位,或者中途按按键也可以进行复位。
(2)、晶振电路
」[
.|—|X1...
■1CRYSTAL■
图三晶振电路
晶振电路是单片机的心脏,它用于产生单片机工作所需要的时钟信号。
单片机的
晶振选取11.0592MHz,晶振旁电容选取30pF。
2.键盘电路的设计
键盘可分为两类:
编码键盘和非编码键盘。
编码键盘是较多按键(20个以上)
和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。
通用计算机使用的标准键盘就是编码键盘。
当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。
但大多数智能仪器和电子产品的按键数目都不太多(20个以内),为了降低成本和简化电路通常采用非编码键盘。
非编码键盘的接口电路有设计者根据需要自行决定,按键信息通过接口软件来获取。
本课题需要的是16个按键,故选择用非
编码键盘。
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在
这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。
矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4X4个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
矩阵键盘的工作原理:
计算器的键盘布局如图五所示:
一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。
具体电路连接如图所示:
当系统需要显示少量数据时,采用LED^码管进行显示是一种经济实用的方法。
数码管显示有静态显示和动态显示两种方法。
为了减少端口的使用,故选择动态显示。
电路如下图所示:
在十进制计算器的软件规划要求下,简易计算器的程序主要包括以下功能模块:
(1)主模块,为系统的初始化。
(2)显示与读键模块,分为判键程序段、运算操作子程序、显示子程序等部分;
1.系统设计
(一)系统模块图
单片机
・
输入模块
1
运算模块
T
显示模块
■1
图六系统模块图
此系统包括输入、运算和显示模块,由单片机控制。
其中通过输入键盘模块将数字0~9和运算符号“+”、“-”、“*”、“/”输入单片机进行运算;运算模块分别根据输入的运算符进行加减乘除运算;显示模块将运算后的数值通过动态扫描使之在数码管上输出。
(二)系统总流程图
主程序主要是用来进行初始化的,调用其他子程序,清空各个标志位,清空缓存区,读取键码,判断功能,在LEDt作出回应,主程序流程图如图六所示。
(1)数字送显示缓冲程序设计
简易计算器所显示的数值最大位三位。
要显示数值,先判断数值大小和位数,如果是超过三位或大于255,将不显示数字。
可重新输入数字,再次计算。
(2)运算程序的设计
首先初始化参数,送LED三位显示0”,其它位不显示。
然后扫描键盘看是否有键输入,若有,读取键码。
判断键码是数字键、清零键还是功能键,是数值键则送LED!
示并保存数值,是清零键则做清零处理,是功能键则又判断是='还是运算
键,若是=”则计算最后结果并送LEE显示,若是运算键则保存相对运算程序的首地址。
图七主程序流程图
2、显示与按键设计
(一)LED显示程序设计
LED显示器由七段发光二极管组成,排列成8字形状,因此也称为七段LEES示器。
为了显示数字或符号,要为LEE显示器提供代码,即字形代码。
七段发光二极管,再加上一个小数点位,共计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
表一共阳极数码管段码对照表
(二)读键子程序设计
为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此
每个键都对应一个码一一键码。
为了得到被按键的键码,现使用行扫描法识别按键。
其程序框图如图八:
读键程序使用的是反转法读键,不管键盘矩阵的规模大小,均进行两次读键。
第一次所有列线均输出低电平,从所有读入键盘信息(行信息);第二次所有行线均输出低电平,从所有行线读入键盘信息(列信息)。
将两次读键信息进行组合就可以得到按键的特征编码,然后通过查表得到按键的顺序编码。
将各特征编码按希望的顺序排成一张表,然后用当前读得的特征码来查表。
当表中有该特征码时,它的位置就是对应的顺序编码;当表中没有该特征码时,说明这是一个没有定义的键码,与没有按键(0FFH)同等看待。
输出列扫描信号
列扫斋信号移位
图八计算键值子程序流程图
3、程序清单
YJ
EQU
50H
;结果存放
YJ1
EQU
51H
;中间结果存放
GONG
EQU
52H
;功能键存放
ORG
00H
START:
MOV
R3,#0
;初始化显示为空
MOV
GONG,#0
MOV
32H,#00H
MOV
33H,#00H
MOV
34H,#00H
MLOOP:
CALL
DISP
;调显示子程序
WAIT:
CALL
TESTKEY
;判断有无按键
JZ
WAIT
CALL
GETKEY:
:
读键
INC
R3
;按键个数
CJNE
LJMP
A,#0,NEXT1
E1;
;判断是否数字键转数字键处理
NEXT1:
CJNE
A,#1,NEXT2
LJMP
E1
NEXT2:
CJNE
A,#2,NEXT3
LJMP
E1
NEXT3:
CJNE
A,#3,NEXT4
LJMP
E1
NEXT4:
CJNE
A,#4,NEXT5
LJMP
E1
NEXT5:
CJNE
A,#5,NEXT6
LJMP
E1
NEXT6:
CJNE
A,#6,NEXT7
LJMP
E1
NEXT7:
CJNE
A,#7,NEXT8
LJMP
E1
NEXT8:
CJNE
A,#8,NEXT9
LJMP
E1
NEXT9:
CJNE
A,#9,NEXT10
LJMP
E1
NEXT10:
CJNE
A,#10,NEXT11
;判断是否功能键
LJMP
E2
;转功能键处理
NEXT11:
CJNE
A,#11,NEXT12
LJMP
E2
NEXT12:
CJNE
A,#12,NEXT13
LJMP
E2
NEXT13:
CJNE
A,#13,NEXT14
LJMP
E2
NEXT14:
CJNE
A,#14,NEXT15
LJMP
E2
NEXT15:
LJMP
E3
;判断是否清除键
E1:
CJNE
R3,#1,N1
;判断第几次按键
LJMP
E11;
为第一个数字
N1:
CJNE
R3,#2,N2
LJMP
E12
;为第二个数字
N2:
CJNE
R3,#3,N3
LJMP
E13
;为第三个数字
N3:
LJMP
E3
;第四个数字转溢出
E11:
MOV
R4,A
;输入值暂存R4
MOV
34H,A
;输入值送显示缓存
MOV
33H,#00H
MOV
32H,#00H
LJMP
MLOOP
;等待再次输入
E12:
MOV
R7,A
;个位数暂存R7
MOV
B,#10
MOV
A,R4
MUL
AB
;十位数
ADD
A,R7
MOV
R4,A
;输入值存R4
MOV
32H,#00H
;输入值送显示缓存
MOV
33H,34H
MOV
34H,R7
LJMP
MLOOP
E13:
MOV
R7,A
MOV
B,#10
MOV
A,R4
MUL
AB
JB
OV,E3
;输入溢出
ADD
A,R7
JB
CY,E3
;输入溢出
MOV
R4,A
MOV
32H,33H
;输入值送显示缓存
MOV
33H,34H
MOV
34H,R7
LJMP
MLOOP
E3:
MOV
R3,#0
;按键次数清零
MOV
R4,#0
;输入值清零
MOV
YJ,#0
;计算结果清零
MOV
GONG,#0
;功能键设为零
MOV
32H,#00H
;显示清空
MOV
33H,#00H
MOV
34H,#00H
LJMP
MLOOP
E2:
MOV
34H,#00H
MOV
33H,#00H
MOV
32H,#00H
MOV
R0,GONG
;与上次功能键交换
MOV
GONG,A
MOV
A,R0
CJNE
A,#10,N21
;判断功能键
LJMP
JIA
;"+"
N21:
CJNE
A,#11,N22
LJMP
JIAN
・HII
J
N22:
CJNE
A,#12,N23
LJMP
CHENG
;"*"
J
N23:
CJNE
A,#13,N24
LJMP
CHU
;"/"
N24:
CJNE
A,#0,N25
LJMP
FIRST
;首次按功能键
N25:
LJMP
DEN
;"="
J一
N4:
LJMP
E3
FIRST:
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
DISP1
JIAN:
MOV
A,YJ
SUBB
A,R4
;上次结果减输入值
JB
CY,N4
;负数溢出
MOV
YJ,A
MOV
R3,#0
LJMP
DISP1
CHENG:
MOV
A,YJ
MOV
B,A
MOV
A,R4
MUL
AB
;上次结果乘输入值
JB
OV,N4
;溢出
MOV
YJ,A
LJMP
DISP1
CHU:
MOV
A,R4
MOV
B,A
MOV
A,YJ
DIV
AB
;上次结果除输入值
MOV
YJ,A
MOV
R3,#0
LJMP
DISP1
DEN:
MOV
R3,#0
LJMP
DISP1
DISP1:
MOV
B,#10
MOV
A,YJ
;结果送累加器
DIV
AB
;结果除10
MOV
YJ1,A
;暂存"商"
MOV
A,B
;取个位数
MOV
34H,A
;个位数送显示缓存
MOV
A,YJ1
JZ
DISP11
;结果是否为一位数
MOV
B,#10
MOV
A,YJ1
DIV
AB
MOV
YJ1,A
MOV
A,B
MOV
33H,A
;十位送显示缓存
MOV
A,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,0B0HDB99H,92H,82H,0F8H
DB80H,90H,88H,83H
DB0C6H,0A1H,86H,8EH
TESTKEY:
ACALL
DISP
MOV
P1,#0FH
;读入键状态
MOV
A,P1
CPL
A
ANL
A,#0FH
;高四位不用
RET
KEYTABLE:
DB
0EEH,0EDH,0DDH,0BDH;键码定义
DB
0EBH,0DBH,0BBH,0E7H
DB
0D7H,0B7H,0DEH,0BEH
GETKEY:
MOV
R6,#10
ACALL
DELAY
MOV
P1,#0FH
MOV
A,P1
CJNE
A,0FH,K12
LJMP
MLOOP
K12:
MOV
B,A
MOV
P1,#0EFH
MOV
A,P1
CJNE
A,#0EFH,K13
MOV
P1,#0DFH
MOV
A,P1
CJNE
A,#0DFH,K13
MOV
P1,#0BFH
MOV
A,P1
CJNE
A,#0BFH,K13
MOV
P1,#07FH
MOV
A,P1
CJNE
A,#07FH,K13
LJMP
MLOOP
K13:
ANL
A,#0F0H
ORL
A,B
MOV
B,A
MOV
R1,#16
MOV
R2,#0
MOV
DPTR,#KEYTABLE
K14:
MOV
A,R2
MOVC
A,@A+DPTR
CJNE
A,B,K16
MOV
P1,#0FH
K15:
MOV
A,P1
CJNE
A,#0FH,K15
MOV
R6,#10
ACALL
DELAY
MOV
RET
A,R2
K16:
INC
R2
DJNZ
R1,K14
AJMP
MLOOP
;10ms延时子程序
DELAY:
MOV
R7,#10
DB
TS1:
MOVR6,#0FFH
TS2:
NOP
NOP
;读键子程序
07EH,07DH,07BH,077H
DJNZR6,TS2
DJNZR7,TS1RET
END
四、调试与仿真
在Proteus中将硬件电路全部接好以后,将Keil中生成的.hex文件导入到单片机中,点击开始仿真按钮,电路开始仿真。
可以观察到:
数码管显示“000”。
五、试验箱实物图
分别依次按下按键“9”、“*”、“9”和“=”,可以看到数码管显示“81”;也可以分别调试其它功能键,结果发现调试结果与预期的理论值相吻合,即本次课程设计已成功。
六、心得体会
为期两周的单片机课程设计结束了,在老师的指导下,终于完成了我们的设计任务-简易计算器。
总的来说,这次课程设计是比较成功的。
当然,这其中也经历了许多坎坷,但是在我的坚持不懈下,在老师的细心指导下,在同学们的热情帮助下,最终克服了种种困难,取得了成功。
刚开始接到这个计算器的课程设计任务时,由于缺乏编写大量程序的经验,不能如行云流水般的将全部的各部分代码写出,于是去网上查找相关资料,了解计算器的输入控制原理、运算处理以及显示的原理。
了解之后自己尝试编写程序,在此过程中,其中键盘扫描和动态扫描显示扫描程序困扰了我很久,经过八九天的辛苦工作,终于初步把所需要的程序编好了,于是就用Keiluversion2进行仿真,在仿真期间也发现了许多错误,经过反复的编译差错,仿真编译通过后,于是开始在Proteus中连硬件电路,全部接完电路之后将Keil生成的.Hex文件导入进行仿真,发现软件与硬件不能够对应协调工作,于是分别对软件和硬件进行检查,经过反复的仿真调试,并且在同学的帮助和自己对每个子程序进行仿真观察下,终于在课设快结束时成功的调试出结果了。
这就是我这两周课程设计的经过,看似简单,过程却曲折艰辛。
通过这次课程设计,我进一步加深了对电子自动控制的了解。
并进一步熟练了对Keil和Proteus软件的操作。
在编写程序的过程中,遇到了很多问题,使我发现自己以前学习上存在的不足,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好。
通过请教老师,终于把问题都解决了,并加深了对计算器工作的原理的了解。
同时也掌握了做课程设计的一般流程,为以后的设计积累了一定的经验。
做课程设计时,先查阅相关知识,把原理吃透,确定一个大的设计方向,在按照这个方向分模块的把要实现的功能用流程图的形式展示。
学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。
总之,通过这次的设计,进一步了解了单片微型计算机及应用原理,收获很大,对软件编程、排错调试、查阅资料等方面得到较全面的锻炼和提高。
同时通过本次课程设计的学习,掌握了一种系统的研究方法,可以进行一些简单的编程,我还深深的体会到设计课的重要性和目的性所在。
为了完成项目,在网络上找到了许多相关的资料,大大扩充自己的知识面,使许多以前想解决却无法解决的困难迎刃而解。
将书本上的理论知识和实际有机地结合起来,从理论中得出结论。
锻炼了实际分析问题和解决问题的能力,提高了适应实际的能力,为今后的学习和实践打下了良好的基础。
此次课设还巩固和综合运用所学过的原理知识,从而提高自己的实际动手能力和独立思考的能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 计算器 课程设计 论文