简易计算器的设计与实现文档格式.docx
《简易计算器的设计与实现文档格式.docx》由会员分享,可在线阅读,更多相关《简易计算器的设计与实现文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
通过以上两种方案论证和比较,从设计的实用性,方便性和成本出发,选择了以STC89C51单片机作为中央处理单元进行计算器的设计,这样设计能够实现对四位加减乘除和除法四位小点数的运算。
2.系统设计
为了更好的实现系统得功能,硬件电路的设计应该遵循以下原则:
(1)优化硬件电路
采用软件设计与硬件设计相结合的方法;
尽管采用软件来实现硬件系统的功能时,也许响应时间会比单纯使用硬件时长,而且还要占用微处理器(MCU)的时间;
但是,用软件实现硬件的功能可以简化硬件结构,提高电路的可靠性。
所以,在设计本系统得时候,在满足可靠性和实时性的前提下,尽可能的通过软件来实现硬件功能[8]。
(2)可靠实用性
根据可靠性及实用性设计理论,系统所用芯片数量越少,系统的平均无故障时间越长。
而且,所用芯片数量越少,地址和数据总线在电路板上受干扰的可能性也就越小。
因此,系统的设计思想是在满足功能的情况下力争使用较少数量的芯片。
(3)灵活的功能扩展
功能扩展是否灵活是衡量一个系统优劣的重要指标。
一次设计往往不能完全考虑到系统的各个方面,系统需要不断完善以及进行功能升级。
进行功能扩展时,应该在原有设计的基础上,通过修改软件程序和少量硬件完成。
对于本系统而言,就是要求在系统硬件不变的情况下,能够通过修改软件程序,完成功能的升级和扩展[7]。
2.1系统组成及总体框图
计算器主要由STC89C51单片机组成的最小系统、1602LCD液晶显示屏及编码键盘构成。
P1、P3口:
做为输出口,控制LCD液晶显示屏显示数据的结果;
P2口:
做为输入口,与键盘连接,实现数据的输入LCD液晶显示屏显示输出,总体框图如下。
STC89C51
最小系统控制模块
电源模块
LCD液晶显示屏模块
4X4键盘模块
图2-1系统组成及总体框图
2.2硬件原理
硬件设计是整个计算器的设计基础,只有在硬件设计完成后,才能给整个电路下载程序,从而完成该作品的完整设计。
2.2.1.单片机最小系统
最小系统的设计即单片机最小系统,对51系列单片机来说,最小系统一般应该包括:
单片机、晶振电路、复位电路。
下面给出一个51单片机的最小系统电路图。
图2-2单片机最小系统
(1)复位电路:
由一个按键开关和一个10uf的电容并联而成,一端接+5v电源,另一端接单片机的引脚9(即RST)复位键,,如图2-2所示。
一、复位电路的用途:
单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。
单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。
二、复位电路的工作原理在书本上有介绍,51单片机要复位只需要在第9引脚接个高电平持续2US就可以实现,在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。
所以可以通过按键的断开和闭合在运行的系统中控制其复位。
(2)晶振电路:
一般的晶振振荡电路都是在一个反相放大器的两端接入晶振,两个电容分别接到晶振的两端每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容请注意一般IC的引脚都有等效输入电容,一般的晶振的负载电容为15pF或12.5pF如果再考虑元件引脚的等效输入电容则两个22pF的电容构成晶振的振荡电路就是比较好的选择,晶振是给单片机提供工作信号脉冲的这个脉冲就是单片机的工作速度,比如,12M晶振单片机工作速度就是每秒12M当然,单片机的工作频率是有范围的,不能太大一般24M就不上去了,不然不稳定。
晶振与单片机的脚XTAL0和脚XTAL1构成的振荡电路中会产生偕波(也就是不希望存在的其他频率的波)这个波对电路的影响不大但会降低电路的时钟振荡器的稳定性为了电路的稳定性起见ATMEL公司只是建议在晶振的两引脚处接入两个10pf-50pf的瓷片电容接地来削减偕波对电路的稳定性的影响所以晶振所配的电容在10pf-50pf之间都可以的。
此晶振电路由两个30uf的电容并联后,两端分别接一个12MHz的晶振,而晶振两端又分别接引脚18(XTAL2)、19(XTAL1)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
XTAL1,XTAL2接石英晶体振荡器。
如图2-2所示外接晶体引脚图。
(3)STC89C51RC
图2-3单片机STC89C51
A.主要性能:
•8051CPU与MCS-51兼容
•8K字节可编程FLASH存储器(寿命:
1000写/擦循环)
•全静态工作:
0Hz-33MHz
•三级加密程序存储器
•128*8位内部RAM
•32条可编程I/O线
•三个16位定时器/计数器
•八个中断源
•全双工UART串行通道
•低功耗的闲置和掉电模式
•掉电后中断可唤醒
•看门狗定时器
•双数据指针
•掉电标识符
•片内振荡器和时钟电路
STC89C51单片机为40引脚芯片见图2-4
B.管脚说明:
VCC:
供电电压。
vss:
接地。
口线:
P0、P1、P2、P3共四个八位口。
P0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平,对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0不具有内部上拉电阻。
在flash编程时,P0口也用来接收指令字节;
在程序校验时,输出指令字节。
程序校验时,需要外部上拉电阻。
P1口:
P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.1分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。
在flash编程和校验时,P1口接收低8位地址字节。
图2-4STC89C51引脚图
引脚第二功能:
P1.0T2(定时器/计数器T2的外部计数输入),时钟输出
P1.1T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)
P1.5MOSI(在系统编程用)
P1.6MISO(在系统编程用)
P1.7SCK(在系统编程用)
P2口:
P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
在访问外部程序存储器或用16位地址读取外部数据存储器时,P2口送出高八位地址。
在这种应用中,P2口使用很强的内部上拉发送1。
在使用8位地址访问外部数据存储器时,P2口输出P2锁存器的内容。
在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3口:
P3口是一个具有内部上拉电阻的8位双向I/O口,p3输出缓冲器能驱动4个TTL逻辑电平。
对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
P3口是STC89C51特殊功能(第二功能)使用,如表2-5所示。
表2-5P3口管脚备选功能:
端口引脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
/INT0(外部中断0)
P3.3
/INT1(外部中断1)
P3.4
T0(记时器0外部输入)
P3.5
T1(记时器1外部输入)
P3.6
/WR(外部数据存储器写选通)
P3.7
/RD(外部数据存储器读选通)
在flash编程和校验时,P3口也接收一些控制信号。
此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。
其他引脚说明:
RST:
复位输入。
晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。
看门狗计时完成后,RST脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
DISRTO默认状态下,复位高电平有效。
ALE/PROG——当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的[11]。
要注意的是:
每当访问外部数据存储器时将跳过一个ALE脉冲。
对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
PSEN——程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当STC89C51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP——外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。
需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。
31脚EA/Vpp接电源:
STC89C51/52或其他51系列兼容单片机特别注意:
对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行,当接低电平时,复位后直接从外部ROM的0000H开始执行。
2.2.2键盘电路
键盘可分为两类:
编码键盘和非编码键盘。
编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。
通用计算机使用的标准键盘就是编码键盘。
在智能仪器中,使用并行接口芯片8279或串行接口芯片HD7279均可以组成编码键盘,同时还可以兼顾数码管的显示驱动,其相关的接口电路和接口软件均可在芯片资料中得到12]。
当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。
非编码键盘成本低廉。
从成本角度出发,本设计选用的是非编码键盘。
如图2-6
图2-6编码键盘电路
此键盘采用4*4矩阵排列,将每一行的一端接在一起构成四行,将另一端连在一起构成四列,正好与单片机的P3口的8个IO口相连,即由低位到高位依次链接P3.0-P3.7,作为单片机电路的输入端。
确定矩阵式键盘上任何一个键被按下通常采用行扫描法。
行扫描法又称为逐行查询法它是一种最常用的多按键识别方法。
因此,本设计采用以行扫描法实现按键识别操作。
其工作原理为:
首先,不断循环地给低四位独立的低电平,然后判断键盘中有无键按下。
将低位中其中一列线(P3.0~P3.3中其中一列)置低电平然后检测行线的状态(高4位,即P3.4~P3.7,由于线与关系,只要与低电平列线接通,即跳变成低电平),只要有一行的电平为低就延时一段时间以消除抖动,然后再次判断,假如依然为低电平,则表示键盘中真的有键被按下而且闭合的键位于低电平的4个按键之中任其一,若所有行线均为高电平则表示键盘中无键按下。
再其次,判断闭合键所在的具体位置。
在确认有键按下后,即可进入确定具体闭合键的过程。
其方法是:
依次将列线置为低电平,即在置某一根列线为低电平时,其它列线为高电平。
同时再逐行检测各行线的电平状态;
若某行为低,则该行线与置为低电平的列线交叉处的按键就是闭合的按键。
2.2.3显示电路
(1)1602LCD液晶显示器简介
1602液晶模块内部的控制器共有11条控制指令,丰富的指令可以完成液晶的时序控制、工作方式式设置和数据显示等[6]。
采用的LCD1602液晶模块是标准16针插座,接口电路如图所示:
关于LCD1602的详细资料见图2-7和表2-8。
图2-7LCD接口电路
表2-8LCD1602引脚说明
第1脚
VSS接地
第2脚
Vcc接5V正电源
第3脚
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
实际电路中采用2K电阻到地,比较理想。
第4脚
RS为寄存器选择,高电平选择数据寄存器、低电平选择指令寄存器。
第5脚
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时(00)可以写入指令或者显示地址;
当RS为低电平RW为高电平时(01)可以读入盲信号;
当RS为高电平RW为低电平时(10)可以写入数据。
第6脚
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚
D0~D7为8位双向数据线。
第15~16脚
阳极和阴极。
(2)与单片机的连接:
单片机的P1.0-P1.7依次与LCD1602的7-14引脚相连,将从键盘读到的数据通过LCD1602显示出来。
(3)工作原理:
本次实训采用1602两行16个字的DM-1602液晶显示模块
DM-162采用标准的14脚接口,其中VSS为地电源,VDD接5V正电源,V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
D0~D7为8位双向数据线
2.3.软件流程
通过软件调用,让单片机将键盘与LCD1602液晶显示器结合起来
2.3.1主程序控制流程
当主程序载入单片机时,开始进行判断各电路初始化程序,在单片机开始检查有没有键按下,如遇键盘按下,则执行延时程序,,继续判断有无按键按下,然后进行按键识别,最后调用计算机延时子程序,实现系统初始化和其他的子程序模块的调用操作。
图2-9按键流程图
2.3.2键盘扫描子程序
由于本设计采用行扫描方式识别按键,通过硬件电路连接及工作原理知每个按键的键码:
应为用P3口的高四位输出低电平,即P3.4-P3.7为输出口。
低四位输出高电平,即P3.0-P3.3为输入口。
读P3口的低四位状态为“0111”,其值为“07H”。
再从P1口的高四位输出高电平,即P1.4-P1.7为输入口。
低四位输出低电平,即P10-P13为输出口,读P1口的高四位状态为“0111”,其值为“07H”。
将两次读出的P0口状态值进行逻辑或运算就得到其按键的特征编码为“77H”,其余的依次类推。
键盘按键说明如下:
--------------------------------------------------
|1|2|3|+|
-------------
|4|5|6|-|
|7|8|9|*|
|C|0|=|/|
--------------------------------------------------*/
//操作简介
//按第一个数,再按'
+-*/'
再按'
='
显示出结果,然后按C清屏
//加最大9999+9999=19998
//减最大9999-0=9999
//乘最大9999*9999=99980001
//除1/9=0.1111保留小数点后4位
想要计算器能够准确计算结果,需要按键对应相应的程序(c语言),所以我先给每个按键定义如下地址含义:
case0x77:
a=0x0d;
break;
//按键/
case0x7b:
a=0x0e;
break;
//按键=
case0x7d:
a=0;
//按键0
case0x7e:
a=0x0f;
//按键CE
case0xb7:
a=0x0c;
//按键*
case0xbb:
a=0x9;
//按键9
case0xbd:
a=0x8;
//按键8
case0xbe:
a=0x7;
//按键7
case0xd7:
a=0x0b;
//按键-
case0xdb:
a=0x6;
//按键6
case0xdd:
a=0x5;
//按键5
case0xde:
a=0x4;
//按键4
case0xe7:
a=0x0a;
//按键+
case0xeb:
a=3;
//按键3
case0xed:
a=2;
//按键2
case0xee:
a=1;
//按键1
default:
a=0xff;
}
returna;
/*返回按键值*/
2.3.3LCD1602显示控制流程
指令1
清显示指令码01H,光标复位到地址00H位置;
指令2
光标复位指令码02H,光标返回到地址00H位置;
指令3
光标和显示模式设置
I/D位→光标移动方向,高电平右移,低电平左移;
S位→屏幕上所有文字是否左移或者右移,高电平有效,低电平无效;
指令4
显示开关控制
D位→控制整体显示的开与关,高电平表示开显示,低电平表示关显示;
C位→控制光标的开与关,高电平表示有光标,低电平表示无光标;
B位→控制光标是否闪烁,高电平闪烁,低电平不闪烁;
指令5
光标或显示移位
S/C位→高电平时移动显示的文字,低电平时移动光标
指令6
功能命令设置
DL位---高电平时为4位数据总线,低电平时为8位总线;
N—位低电平时为单行显示,高电平时为双行显示;
F—位低电平时显示5x7的点阵字符,高电平时为5x10的点阵字符;
指令7
字符发生器RAM地址设置
指令8
DDRAM地址设置
指令9
读忙信号和光标地址
BF位→为忙标志位,高电平表示忙,此时模块不能接收命令或者数据
指令10
写数据
指令11
读数据
(1)指令操作表2-10指令编码
(2)子程序流程:
同样而言,LCD1602显示器在与单片机连接时,也需要单片机输出程序,而此程序则为
1602液晶显示需要初始化显示:
voidinit_lcd(void)//初始化液晶,及画面初始化
{
wela=0;
//写液晶
lcden=0;
//使能1602
write_(0x38);
//8位总线,双行显示,5X7的点阵字符
LCD_Delay_us(100);
//延时100us
write_(0x0c);
//开显示,无光标,光标不闪烁
write_(0x06);
//光标右移动
write_(0x01);
//清屏
write_(0x80);
//DDRAM地址归0
}
1602写指令函数:
voidwrite_(uchar)//1602液晶写指令
rs=0;
//写指令
//使能1602
P0=;
//写入指令com
LCD_Delay_ms
(1);
//延时1ms
lcden=1;
LCD_Delay_ms
(2);
//延时2ms
1602写数据函数:
voidwrite_date(uchardate)//1602液晶写数据
rs=1;
//写数据
P0=date