基于51单片机的简易计算器.doc
《基于51单片机的简易计算器.doc》由会员分享,可在线阅读,更多相关《基于51单片机的简易计算器.doc(26页珍藏版)》请在冰点文库上搜索。
摘要
目录
摘要.......................................................................................
第一章绪论.........................................................................
1.1课题简介....................................................................
1.2设计目的....................................................................
1.3简易计算器系统简介....................................................
第二章总体电路设计..........................................................
第三章主要模块介绍..........................................................
3.1AT89C51.......................................................................
3.2LED数码管的结构及工作原理.........................................
3.3矩阵按键..................................................................
3.4蜂鸣器模块...............................................................
第四章计算器系统设计.....................................................
4.1计算器硬件...............................................................
4.2系统框图..................................................................
4.3程序设计..................................................................
结语.....................................................................................
参考文献..............................................................................
摘要
课程设计教学环节是为了学生能够更好地巩固和实践所学专业知识而设置的,在本次课程设计中,我以《MCS-51系列单片微型计算机及其应用》课程中所学知识为基础,设计了简易计算器。
本系统以MCS-51系列中的AT89C51单片机为核心,能够实现六位数的四则运算。
该系统通过检测矩阵键盘扫描,判断是否按键,经数据转换把数值送入数码管显示。
本系统的设计说明重点介绍了如下几方面的内容:
1)基于单片机简易计算器的基本功能,同时对矩阵键盘及LED数码管显示原理进行了简单的阐述;
2)介绍了系统的总体设计、给出了系统的整体流程框图,并对其进行了功能模块划分及所采用的元器件进行了详细说明;
3)对系统各功能模块的软、硬件实现进行了设计说明。
关键词:
MCS-51单片机;计算器;加减乘除
第一章绪论
1.1课题简介
单片机由于其微小的体积和极低的成本,广泛的应用于家用电器、工业控制等领域中。
在工业生产中。
单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
本系统就是充分利用了51芯片的I/O引脚。
系统统采用MSC-51系列单片机AT89C51为中心器件来设计计算器控制器。
1.2设计目的
通过本次工程实践,运用《MCS-51系列单片微型计算机及其应用》所学知识及查阅相关资料,完成简易计算器的设计,达到理论知识与实践更好结合、提高综合运用所学知识和设计能力的目的。
通过本次设计训练,可以使我们在基本思路和基本方法上对基于MCS-51单片机的嵌入式系统设计有一个比较感性的认识,并具备一定程度的设计能力。
1.3简易计算器系统简介
本计算器是以MCS-51系列AT89C51单片机为核心构成的简易计算器系统。
该系统通过单片机控制,实现对4*4键盘扫描进行实时的按键检测,并把检测数据存储下来。
整个计算器系统的工作过程为:
首先存储单元初始化,显示初始值和键盘扫描,判断按键位置,查表得出按键值,单片机则对数据进行储存与相应处理转换,之后送入LED数码管显示。
整个系统可分为三个主要功能模块:
功能模块一,实时键盘扫描;功能模块二,数据转换为了数码管显示;功能模块三,LED数码管显示。
第二章总体电路设计
本次设计采用AT89C51单片机作为控制芯片,采用单片机上的按键来模仿输入信号。
通过键盘扫描将输入按键信号读入单片机,根据按键的号码进行不同的显示,并通过蜂鸣器发出信号。
显示模块则利用六位八段数码管,进行按键号码的显示。
本系统功能由硬件和软件两大部分协调完成,硬件部分主要完成按键输入的模拟、蜂鸣器的驱动、按键号码的显示等功能;而软件主要完成对按键输入的扫描、中断对数据初始化及数码显示管的显示控制等功能。
第三章主要模块介绍
3.1AT89C51简介
AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C51是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C51是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
图1AT89C51芯片内部引脚图
3.2LED数码管的结构及工作原理
LED数码管(LEDSegmentDisplays)是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。
LED数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。
位数有半位,1,2,3,4,5,6,8,10位等等....,LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。
图4.5是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。
颜色有红,绿,蓝,黄等几种。
LED数码管广泛用于仪表,时钟,车站,家电等场合。
选用时要注意产品尺寸颜色,功耗,亮度,波长等。
下面将介绍常用LED数码管内部引脚图。
图2这是一个八段两位带小数点10引脚的LED数码管
每一笔划都是对应一个字母表示DP是小数点.
数码管分为共阳极的LED数码管、共阴极的LED数码管两种。
下图例举的是共阳极的LED数码管,共阳就是8段的显示字码共用一个电源的正。
LED数码管原理图示意如图3:
图3LED数码管原理图
从上图可以看出,要是数码管显示数字,有两个条件:
1、是要在VT端(3/8脚)加正电源;2、要使(a,b,c,d,e,f,g,dp)端接低电平或“0”电平。
这样才能显示的。
共阳极LED数码管的内部结构原理图:
图4共阳极LED数码管的内部结构原理图
共阴极LED数码管的内部结构原理图:
图5共阴极LED数码管的内部结构原理图
表1显示数字对应的二进制电平信号
LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数位,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。
静态显示驱动:
静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O口进行驱动,或者使用如BCD码二-十进位转换器进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O口多。
3.3矩阵按键
键盘是单片机系统中最常用的人机对话输入设备,用户通过键盘向单片机输入数据或指令。
键盘控制程序需完成的任务有:
监测是否有键按下,有键按下时,在无硬件去抖的动电路时,应用软件延时方法消除按键抖动影响;当有多个键同时按下时,只处理一个按键,不管一次按键持续多长时间,仅执行一次按键功能程序。
矩阵按键扫描程序是一种节省IO口的方法,按键数目越多节省IO口就越可观,思路:
先判断某一列(行)是否有按键按下,再判断该行(列)是那一只键按下。
但是,在程序的写法上,采用了最简单的方法,使得程序效率最高。
本程序中,如果检测到某键按下了,就不再检测其它的按键,这完全能满足绝大多数需要,又能节省大量的CPU时间。
本键盘扫描程序的优点在于:
不用专门的按键延时程序,提高了CPU效率,也不用中断来扫描键盘,节省了硬件资源。
另外,本键盘扫描程序,每次扫描占用CPU时最短,不论有键按下或者无键按下都可以在很短的时间完成一次扫描。
图6矩阵键盘电路图
3.4蜂鸣器模块
单片机的P0.7经三极管驱动扬声器,当有按键输入时,单片机P0.7输出低电平,与此引脚相连的PNP型三极管基电极也为低电平,三极管导通,压电蜂鸣器两端获得+5V电压而鸣叫;当P0.7输出高电平时,三极管截止,蜂鸣器停止发声。
蜂鸣器模块如图3.9所示:
图7蜂鸣器模块电路原理图
第四章计算器系统设计
4.1计算器硬件
AT89C51单片机一片,4*4键盘一个,6位共阳极的八段数码管一个,连线和电阻和开关若干。
51单片机的P2口作键盘口,其中P2.4-P2.7为键盘扫描输出线,P2.0-P2.3为键盘扫描输入线。
键盘由4*4共16个按键组成,10个数字键(由0-9组成)5个运算符号(加减乘除等于)组成,1个清除键(作用相当于整体复位)。
6个数码管用于显示当前数值的十万,万,千,百,十,个,P1口接6个数码管的八段,P0口分别接6个数码管的公共端,P1口输出数码管的字形码,P0口输出数码管的字位码。
4.2系统框图:
1.主程序流程图
图8主程序流程图
2.键盘扫描流程图
图9键盘扫描流程图
4.3程序设计
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P2^6;
sbitwela=P2^7;
sbitbeep=P2^3;
uchartemp,key;
ucharfun;
longintnum1,num2,res;
ucharaa,dis;
ucharcodetable[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
ucharcodeweixuan[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
voiddelay(unsignedchari)
{
ucharj,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
voidbee()
{
beep=0;
delay(255);
delay(255);
beep=1;
}
key_scan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
key=0;
break;
case0xde:
key=1;
break;
case0xbe:
key=2;
break;
case0x7e:
key=3;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
key=4;
break;
case0xdd:
key=5;
break;
case0xbd:
key=6;
break;
case0x7d:
key=7;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:
key=8;
break;
case0xdb:
key=9;
break;
case0xbb:
key=10;
break;
case0x7b:
key=11;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:
key=12;
break;
case0xd7:
key=13;
break;
case0xb7:
key=14;
break;
case0x77:
key=15;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
}
voidInit()
{
num1=0;
num2=0;
wela=1;
P0=0xdf;
wela=0;
dula=1;
P0=table[1];
dula=0;
key=16;
aa=0;
dis=0;
res=0;
}
voiddis_play(longintnm)
{
uchara1,a6;
longintshu;
shu=nm;
if(shu==0)
{
wela=1;
P0=0xdf;
wela=0;
dula=1;
P0=table[1];
dula=0;
}
else
{
for(a6=0;a6<6;a6++)
{
a1=shu%10;
if(shu!
=0)
{
a1=a1+1;
}
shu=shu/10;
P0=table[a1];
dula=1;
dula=0;
P0=weixuan[a6];
wela=1;
wela=0;
delay(5);
}
}
}
voiddisplay()
{
switch(dis)
{
case0:
{
dis_play(num1);
}
break;
case1:
{
dis_play(num2);
}
break;
case2:
{
dis_play(res);
}
break;
}
}
voidshanshuo()
{
wela=1;
P0=0xff;
wela=0;
delay(255);
}
voidcheck()
{
if(key!
=16)
{
bee();
if(key>=10)
{
switch(key)
{
case10:
Init();break;//CE
case11:
{
switch(fun)
{
case0:
res=num1+num2,dis=2;break;
case1:
res=num1-num2,dis=2;break;
case2:
res=num1*num2,dis=2;break;
case3:
res=num1/num2,dis=2;break;
}
};break;//=
case12:
fun=0,aa=1,shanshuo();break;//+
case13:
fun=1,aa=1,sha