单片机课程设计十进制加法计算器设计 精品.docx
《单片机课程设计十进制加法计算器设计 精品.docx》由会员分享,可在线阅读,更多相关《单片机课程设计十进制加法计算器设计 精品.docx(29页珍藏版)》请在冰点文库上搜索。
单片机课程设计十进制加法计算器设计精品
单片机课程设计报告
十进制加法计算器设计
学院:
物理与微电子科学学院
班级:
-------
姓名:
-----
学号:
----------
目录
1、摘要----------------------------------------------------------------------2
2、设计任务和要求--------------------------------------------------------2
3、单片机简要原理--------------------------------------------------------3
3.1AT89C51的介绍------------------------------------------------3
3.2单片机最小系统------------------------------------------------8
3.3七段共阳极数码管---------------------------------------------9
4、硬件设计-----------------------------------------------------------------9
4.1键盘电路的设计-------------------------------------------------9
4.2显示电路的设计-----------------------------------------------11
5、软件设计------------------------------------------------------------12
5.1系统设计------------------------------------------------------12
5.2显示与按键设计---------------------------------------------14
6、系统调试.-------------------------------------------------------------22
6.1系统初始状态的调试------------------------------------------22
6.2键盘输入功能的调试------------------------------------------23
6.3系统运算功能的调试------------------------------------------25
7、心得体会----------------------------------------------------------------26
参考文献--------------------------------------------------------------------29
附录系统硬件电路图--------------------------------------------------29
-----------
1、摘要
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
本设计是实现两位数的加减运算的简易计算器,实现键盘输入,由七段LED数码管输出;程序都是根据教材内和网络中的程序参考编写而成,在功能上还并不十分完善,限制也较多。
本设计重在设计构思,使得我们用专业知识、专业技能分析和解决问题,通过设计使得我们对所学知识彻底巩固。
2、设计任务和要求
本次课程设计,我选题是单片机十进制加法计算器软设计,设计任务为:
设计一键盘显示装置,键盘上除需定义10个十进制数字键外还要相应的功能键,其它键不定义无响应。
利用此系统可分别可输入十进制被加数与加数,实现两数相加并将结果以十进制形式显示出来。
(扩展:
多位10进制数相加)
本课程设计的十进制加法计算器的计算范围为0~255,计算结果全为整数,计算结果溢出结果不显示。
1、加法:
三位加法,计算结果超过255溢出不显示
2、减法:
三位减法,计算结果若小于零溢出不显示
3、乘法:
三位数乘法
4、除法:
整数除法
5、有清零功能
3、单片机简要原理
在该课程设计中,主要用到一个AT89C51芯片和串接的共阴数码管。
作为该设计的主要部分,下面将对它们的原理及功能做详细介绍和说明。
3.1AT89C51的介绍:
图一AT89C51外形结构和引脚分布图
芯片AT89C51的外形结构和引脚图如图一所示。
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
其功能特性描述:
AT89C51单片机在电子行业中有着广泛的应用。
AT89C52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路,8位微控制器8K字节在系统可编程FlashROM。
P0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入端用。
在访问外部数据存储器或程序存储器时,P0口被分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:
P1口是一个具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。
在flash编程和校验时,P1口接收低8位地址字节。
P1端口引脚号第二功能:
P1.0T2(定时器/计数器T2的外部计数输入),时钟输出
P1.1T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)
P2口:
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。
Flash编程或校验时,P2亦接收高位地址和一些控制信号。
P3口:
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能。
P3口亦作为AT89C52特殊功能(第二功能)使用,如下所示。
在flash编程和校验时,P3口也接收一些控制信号。
P3端口引脚第二功能:
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2INTO(外中断0)
P3.3INT1(外中断1)
P3.4TO(定时/计数器0)
P3.5T1(定时/计数器1)
P3.6WR(外部数据存储器写选通)
P3.7RD(外部数据存储器读选通)
RST——复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。
ALE/PROG——当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。
要注意的是:
每当访问外部数据存储器时将跳过一个ALE脉冲。
对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。
该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。
此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
PSEN——程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP——外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。
需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。
FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
引脚使用说明:
I/O端口的编程实际上就是根据应用电路的具体功能和要求对I/O寄存器进行编程。
具体步骤如下:
l.根据实际电路的要求,选择要使用哪些I/O端口。
2.初始化端口的数据输出寄存器,应避免端口作为输出时的开始阶段出现不确定状态,影响外围电路正常工作。
3.根据外围电路功能,确定PO端口的方向,初始化端口的数据方向寄存器。
对于用作输入的端口可以不考虑方向初始化,因为PO的复位缺省值为输入。
4.用作输入的PO管脚,需上拉电阻。
5.最后对I/O端口进行输出(写数据输出寄存器)和输入(读端口)编程,完成对外围电路的相应功能。
3.2单片机最小系统
单片机最小系统就是支持主芯片正常工作的最小部分,包括主控芯片、复位电路和晶振电路。
(一)复位电路
图二复位电路
本设计采用上电与手动复位电路,电阻分别选取100和10K,电容选取10uF,系统一上电,芯片就复位,或者中途按按键也可以进行复位。
(2)晶振电路
图三晶振电路
晶振电路是单片机的心脏,它用于产生单片机工作所需要的时钟信号。
单片机的晶振选取11.0592MHz,晶振旁电容选取30pF。
3.3七段共阳极数码管
图四七段共阳数码管
图为七段共阳数码管的引脚图,从左到右数码管的段码分别为a,b,c,d,e,f,g和小数点dp,低电平时点亮,最右边为位选端。
4、硬件设计
简易数字计算器系统硬件设计主要包括:
键盘电路,显示电路以及其他辅助电路。
下面分别进行设计。
4.1键盘电路的设计
键盘可分为两类:
编码键盘和非编码键盘。
编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。
通用计算机使用的标准键盘就是编码键盘。
当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。
但大多数智能仪器和电子产品的按键数目都不太多(20个以内),为了降低成本和简化电路通常采用非编码键盘。
非编码键盘的接口电路有设计者根据需要自行决定,按键信息通过接口软件来获取。
本课题需要的是16个按键,故选择用非编码键盘。
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。
矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4×4个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
矩阵键盘的工作原理:
计算器的键盘布局如图五所示:
一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。
具体电路连接如图五所示:
图五4*4键盘接口电路
4.2显示电路的设计
当系统需要显示少量数据时,采用LED数码管进行显示是一种经济实用的方法。
数码管显示有静态显示和动态显示两种方法。
为了减少端口的使用,故选择动态显示。
电路如下图六所示:
图六三位数码管的显示电路
5、软件设计
在十进制加法计算器的软件规划要求下,简易计算器的程序主要包括以下功能模块:
(1) 主模块,为系统的初始化。
(2) 显示与读键模块,分为判键程序段、运算操作子程序、显示子程序等部分;5.1系统设计
(一)系统模块图
图七系统模块图
此系统包括晶振电路、复位电路、LED显示电路、矩阵按键电路运算法则指示灯以及单片机。
其中通过输入键盘模块将数字0~9和运算符号“+”、“-”、“*”、“/”输入单片机进行运算;运算模块分别根据输入的运算符进行加减乘除运算;显示模块将运算后的数值通过动态扫描使之在数码管上输出。
(2)系统总流程图
主程序主要是用来进行初始化的,调用其他子程序,清空各个标志位,清空缓存区,读取键码,判断功能,在LED上作出回应,主程序流程图如图六所示。
(1)数字送显示缓冲程序设计
简易计算器所显示的数值最大位三位。
要显示数值,先判断数值大小和位数,如果是超过三位或大于255,将不显示数字。
可重新输入数字,再次计算。
(2)运算程序的设计
首先初始化参数,送LED三位显示“0”,其它位不显示。
然后扫描键盘看是否有键输入,若有,读取键码。
判断键码是数字键、清零键还是功能键,是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。
5.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)流程图
图八计算键值子程序流程图
(4)源程序
RESULTEQU60H
RESULT1EQU61H
FUNCTIONKEYEQU62H
ORG00H
START:
MOVR3,#0
MOVFUNCTIONKEY,#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;输入值清零
MOVRESULT,#0;计算结果清零
MOVFUNCTIONKEY,#0;功能键设为零
MOV32H,#00H;显示清空
MOV33H,#00H
MOV34H,#00H
LJMPMLOOP
E2:
MOV34H,#00H
MOV33H,#00H
MOV32H,#00H
MOVR0,FUNCTIONKEY;与上次功能键交换
MOVFUNCTIONKEY,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:
MOVRESULT,R4;输入值送结果
MOVR3,#0;按键次数清零
LJMPDISP1;结果处理
JIA:
MOVA,RESULT;上次结果送累加器
ADDA,R4;上次结果加输入值
JBCY,N4;溢出
MOVRESULT,A;存本次结果
MOVR3,#0;按键次数清零
LJMPDISP1
JIAN:
MOVA,RESULT
SUBBA,R4;上次结果减输入值
JBCY,N4;负数溢出
MOVRESULT,A
MOVR3,#0
LJMPDISP1
CHENG:
MOVA,RESULT
MOVB,A
MOVA,R4
MULAB;上次结果乘输入值
JBOV,N4;溢出
MOVRESULT,A
LJMPDISP1
CHU:
MOVA,R4
MOVB,A
MOVA,RESULT
DIVAB;上次结果除输入值
MOVRESULT,A
MOVR3,#0
LJMPDISP1
DEN:
MOVR3,#0
LJMPDISP1
DISP1:
MOVB,#10
MOVA,RESULT;结果送累加器