基于AT89C51单片机简易计算器的设计Word文档格式.docx
《基于AT89C51单片机简易计算器的设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机简易计算器的设计Word文档格式.docx(29页珍藏版)》请在冰豆网上搜索。
当计算器执行过程中有错误时,会在LED上显示相应得提示,如:
当输入得数值或计算得到得结果大于计算器得表示范围时,计算器会在LED上显示“CUO",提示溢出。
三、系统模块组成框图:
二、硬件设计
(一)、总体硬件设计
本设计选用AT89C51单片机为主控单元。
显示部分:
采用LED动态显示.按键部分:
采用4*4集成计算键盘;
总电路图:
(1)4×
4集成计算键盘
集成计算键盘本质上就是4×
4矩阵键盘,矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线与列线得每个交叉点上设置一个按键。
这样键盘上按键得个数就为4×
4个。
这种行列式键盘结构能有效地提高单片机系统中I/O 口得利用率.
矩阵键盘得工作原理:
计算器得键盘布局如图2所示:
一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。
矩阵键盘内部电路图如图所示:
(三)、LED显示模块
如图
本设计采用LED共阴数码管来显示输出数据.共阴数码管得每一位都就是公共得阴极,只有输入低电平得时候才有可能被点亮,所以位选得时候被选中得位必须就是低电平。
本设计采用两个74HC573锁存器来驱动数码管,引脚如上图所示.74HC573—1就是控制段选得,74HC573—2就是控制位选得,P2、6与P2、7端口就是锁存使能位,置高电平时锁存器透明(即输入与输出相同),置低电平时锁存。
74HC573得八个锁存器都就是透明得D型锁存器,当使能(G)为高时,Q 输出将随数据(D)输入而变。
当使能为低时,输出将锁存在已建立得数据电平上。
输出控制不影响锁存器得内部工作,即老数据可以保持,甚至当输出被关闭时,新得数据也可以置入.这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总线,而不需要外接口.特别适用于缓冲寄存器,I/O通道,双向总线驱动器与工作寄存器。
HC573引脚功能:
引脚号符号 名称及功能
1 OEﻩ 3态输出使能输入(低电平)
2—9ﻩ D0—D7ﻩ 数据输入
12-19Q0 —Q7ﻩ 3态锁存输出
11ﻩLEﻩ 锁存使能输入
10GNDﻩ 接地(0V)
20 VCC 电源电压
(四)运算模块(51单片机控制)
51单片机就是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器与多功能I/O等一台计算机所需要得基本功能部件。
如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR).
单片机就是靠程序运行得,并且可以修改。
通过不同得程序实现不同得功能,尤其就是特殊得独特得一些功能,通过使用单片机编写得程序可以实现高智能,高效率,以及高可靠性!
因此我们采用单片机作为计算器得主要功能部件,可以很快地实现运算功能。
单片机最小系统
复位时单片机得初始化操作,只要给RST引脚加上两个机器周期以上得高电平信号,就可以使STC89C51单片机复位。
本次采用得就是12M晶振,按钮复位电路。
三、软件设计
现实生活中人们熟知得计算器,其功能主要如下:
1、键盘输入;
2、数值显示;
3、加、减、乘、除四则运算;
针对上述功能,计算器软件程序要完成以下程序得设计:
1、键盘输入检测程序
2、LED显示程序
3、算术运算程序
1、程序流程图
系统总流程图
算术运算程序流程图
2、程序清单
#include<reg52、h〉
#include〈math、h〉
#define ucharunsigned char
#defineuintunsignedint
#defineulongunsignedlong
sbit wela=P2^7;
//定义端口
sbitdula=P2^6;
longin1,in2,out,x;
intcnt,i,flag;
ucharcodenum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//LED显示字模,共阴
voiddelay(uintxms)//延时函数
{
uintj;
ﻩfor(i=xms;
i>
0;
i--)
for(j=114;
j〉0;
j-—);
}
voiddisplay()//显示函数声明
{
ﻩuchar w1,w2,w3,w4,w5,w6,f=0;
ﻩlong y;
if(x〉=0) //显示六位计时数
ﻩ{
if(x>
=1e6)
ﻩ{
ﻩﻩP0=0xff;
ﻩﻩwela=1;
ﻩﻩP0=0xf7;
ﻩwela=0;
ﻩﻩﻩdula=1;
P0=num[12];
ﻩdula=0;
ﻩﻩdelay
(2);
ﻩP0=0xff;
ﻩwela=1;
ﻩP0=0xef;
ﻩwela=0;
ﻩdula=1;
ﻩP0=0x3e;
ﻩﻩdula=0;
ﻩﻩdelay
(2);
ﻩP0=0xff;
ﻩwela=1;
ﻩﻩP0=0xdf;
ﻩﻩﻩwela=0;
ﻩdula=1;
ﻩﻩP0=num[0];
ﻩdula=0;
ﻩﻩdelay
(2);
ﻩreturn;
ﻩ}
ﻩw1=x%10;
w2=x/10%10;
w3=x/100%10;
w4=x/1000%10;
w5=x/10000%10;
w6=x/100000%10;
ﻩﻩif(f==1||w6)
ﻩ{
ﻩﻩf=1;
ﻩﻩP0=0xff;
ﻩﻩﻩwela=1;
ﻩP0=0xfe;
ﻩﻩﻩwela=0;
ﻩP0=num[w6];
ﻩdula=0;
delay(2);
ﻩ}
if(f==1||w5)
ﻩ{
ﻩf=1;
ﻩﻩP0=0xff;
ﻩﻩwela=1;
ﻩﻩﻩP0=0xfd;
ﻩﻩwela=0;
ﻩﻩdula=1;
P0=num[w5];
ﻩﻩﻩdula=0;
ﻩﻩdelay
(2);
ﻩ}
ﻩif(f==1||w4)
ﻩﻩ{
ﻩﻩf=1;
P0=0xff;
wela=1;
ﻩﻩP0=0xfb;
ﻩﻩwela=0;
ﻩdula=1;
ﻩﻩP0=num[w4];
ﻩdelay
(2);
ﻩif(f==1||w3)
ﻩﻩﻩf=1;
ﻩP0=0xff;
wela=1;
P0=0xf7;
ﻩwela=0;
ﻩﻩﻩdula=1;
ﻩﻩﻩP0=num[w3];
dula=0;
ﻩﻩﻩdelay
(2);
ﻩif(f==1||w2)
ﻩﻩ{
ﻩP0=0xff;
ﻩwela=1;
ﻩP0=0xef;
ﻩwela=0;
ﻩﻩdula=1;
ﻩﻩﻩP0=num[w2];
dula=0;
ﻩdelay
(2);
ﻩP0=0xff;
ﻩwela=1;
P0=0xdf;
ﻩwela=0;
ﻩﻩdula=1;
ﻩﻩP0=num[w1];
ﻩﻩdula=0;
ﻩﻩdelay
(2);
ﻩ}
else
ﻩ{
y=labs(x);
ﻩif(y〉=1e5)
ﻩP0=0xff;
wela=1;
ﻩﻩP0=0xf7;
ﻩwela=0;
ﻩﻩdula=1;
ﻩﻩP0=num[12];
ﻩﻩdula=0;
ﻩﻩdelay
(2);
ﻩﻩP0=0xff;
ﻩﻩwela=1;
ﻩP0=0xef;
ﻩwela=0;
ﻩdula=1;
ﻩﻩP0=0x3e;
ﻩdula=0;
ﻩdelay
(2);
ﻩP0=0xff;
ﻩﻩwela=1;
ﻩﻩﻩP0=0xdf;
wela=0;
ﻩdula=1;
ﻩP0=num[0];
ﻩdula=0;
delay(2);
ﻩreturn;
}
ﻩw1=y%10;
w2=y/10%10;
w3=y/100%10;
w4=y/1000%10;
w5=y/10000%10;
ﻩif(f==1||w5)
ﻩif(f==0)
ﻩﻩﻩ{
ﻩﻩP0=0xff;
ﻩﻩwela=1;
ﻩﻩP0=0xfe;
ﻩﻩwela=0;
ﻩdula=1;
ﻩP0=0x40;
ﻩdula=0;
ﻩﻩdelay
(2);
ﻩﻩ}
ﻩf=1;
ﻩﻩP0=0xff;
ﻩﻩﻩwela=1;
ﻩﻩP0=0xfd;
ﻩﻩwela=0;
ﻩﻩdula=1;
P0=num[w5];
dula=0;
ﻩdelay
(2);
ﻩ}
ﻩif(f==1||w4)
{
ﻩﻩif(f==0)
ﻩ{
ﻩﻩﻩﻩP0=0xff;
ﻩﻩﻩwela=1;
ﻩﻩP0=0xfd;
ﻩﻩwela=0;
ﻩﻩﻩﻩdula=1;
ﻩP0=0x40;
ﻩdula=0;
ﻩﻩdelay
(2);
ﻩﻩ}
ﻩf=1;
ﻩﻩP0=0xff;
ﻩﻩwela=1;
ﻩﻩﻩP0=0xfb;
ﻩwela=0;
ﻩﻩdula=1;
ﻩﻩP0=num[w4];
ﻩdelay
(2);
ﻩif(f==1||w3)
ﻩif(f==0)
ﻩﻩﻩ{
ﻩﻩP0=0xff;
wela=1;
ﻩﻩP0=0xfb;
ﻩﻩwela=0;
ﻩﻩdul