荣凤娇计算器报告.docx
《荣凤娇计算器报告.docx》由会员分享,可在线阅读,更多相关《荣凤娇计算器报告.docx(19页珍藏版)》请在冰豆网上搜索。
荣凤娇计算器报告
信息工程学院《单片机原理与接口技术课程设计》
计算器
学生姓名:
荣凤娇
学号:
0915121013
班级:
B1210
专业:
电子信息工程
学部:
电子信息工程
指导教师:
张俊芳
2015年07月
目录
绪论1
1系统工作原理2
1.1功能说明2
1.2基本原理2
2设计3
2.1单片机最小系统单元3
2.2AT89C514
2.374LS573锁存器4
2.4键盘调整单元6
2.5 显示单元7
3软件设计8
3.1系统主程序8
3.2计算程序9
3.3显示程序9
3.4键盘程序9
4结论10
参考文献11
致谢11
附录A源程序11
附录B原理图20
绪论
当今时代,是一个新技术层出不穷的时代。
在电子领域,尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代。
单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。
过去习惯于传统电子领域的工程师、技术员正面临着全新的挑战,如不能在较短时间内学会单片机,势必会被时代所遗弃,只有勇敢地面对现实,挑战自我,加强学习,争取在较短的时间内将单片机技术融会贯通,才能跟上时代的步伐。
它所给人带来的方便也是不可否定的,它在一块芯片内集成了计算机的各种功能部件,构成一种单片式的微型计算机。
20世纪80年代以来,国际上单片机的发展迅速,其产品之多令人目不暇接,单片机应用不断深入,新技术层出不穷。
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
本设计是由单片机实现的模拟计算器,它不仅能实现数据的加减乘除运算,而且还能使数据及其计算结果在数码管上显示出来,能够实现0-65535的数字四则运算。
本设计是用单片机AT89C51来控制,采用共阳极数码显示,软件部分是由C语言来编写的。
1系统工作原理
1.1功能说明
利用单片机的I/O接口设计4×4键盘,16个键依次对应0~9、“+”、“-”、“×”、“÷”、“=”和清除键。
通过检测不同数字键、功能键的按下,可以进行小于65535的数的加减乘除运算,并可连续运算。
当键入值大于65535时,将自动清零,可以重新输入。
对应每一个数字键按下的同时,LED显示按下键的值,并显示最后的运算结果。
本文以8051单片机为核心,利用74ls573锁存实现三位一体8段数码管显示。
1.2基本原理
根据功能和指标要求,本系统选用MCS51单片机为主控机。
通过扩展必要的外围接口电路,实现对计算器的设计。
具体设计考虑如下:
①由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高,故我们采用可以进行四位数字的运算,选用5个LED数码管显示数据和结果。
②另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16个按键即可。
系统模块图
图1系统模块图
2设计
2.1单片机最小系统单元
主控机系统采用了Atmel公司生产的AT89S52单片机,它含有256字节数据存储器,内置8K的电可擦除FLASHROM,可重复编程,大小满足主控机软件系统设计,所以不必再扩展程序存储器。
复位电路和晶振电路是AT89S52工作所需的最简外围电路。
单片机最小系统电路图如图2所示。
图2单片机最小系统电路图
AT89S52的复位端是一个史密特触发输入,高电平有效。
RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。
在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接11.0592M晶振和两个30pF电容组成系统的内部时钟电路。
2.2AT89C51
AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
外形及引脚排列如图所示。
图3单片机引脚图
2.374LS573锁存器
LS573的八个锁存器都是透明的D型锁存器,当使能(G)为高时,Q输出将随数据(D)输入而变。
当使能为低时,输出将锁存在已建立的数据电平上。
输出控制不影响锁存器的内部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。
这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总线,而不需要外接口。
特别适用于缓冲寄存器,I/O通道,双向总线驱动器和工作寄存器
图474ls573引脚图
2.4键盘调整单元
矩阵式键盘由行线和列线组成,按键位于行、列的交叉点上。
当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,单片机通过检测行或列线上的电平变化可以确定哪个按键被按下。
矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。
矩阵键盘的检测方法有多种,常见的有:
逐点扫描法、逐行扫描法、全局扫描法。
在本实例中我们采用逐行扫描法来实现按键检测,其中PD0-PD3作为列线,PD4-PD7作为行线。
识别过程如下:
1、判断键盘中是否有键按下。
设置所有行线为输出口,并输出低电平;设置列线为输入口,读取列线上的电平状态,只要有一列的电平为低,就表示有按键按下,并且被按下的键位于电平为低的列线与4跟行线相交叉的4个按键中,若所有列线都为高电平,表示没有按键按下;
2、判断被按下按键所在的位置。
在确认有键按下后(进行按键消抖处理后),接下来就是确定具体哪个案件被按下,方法是:
依次将每根行线设置为输出口,并输出低电平(同时剩余行线输出高电平),然后逐列检查每根列线的电平状态,若某列为低电平,则该列线与设置为输出低电平的行线交叉处的按键就是被按下的按键。
3、按键位置确定后,接下来就要给矩阵键盘中的每个按键进行编号,也就是进行按键编码,程序设计中常用计算法和查表法两种方式对按键进行编码,本实例采用计算法编码。
从上面的电路图中我们可以看到,键盘的所有行线和列线都接了上拉电阻,这是为了确保在没有按键按下的时候,I/O口的电平状态始终为高电平,从而消除外界干扰。
对于AVR单片机来说,我们已经知道在I/O口输入状态下,可以使能其内部上拉电阻,所以上面电路图中连接4根列线的上拉电阻可以不用,直接使能内部上拉电阻即可。
图5矩阵键盘图
2.5 显示单元
采用8位数码管对计算数据和结果的显示,这里选共阳数码管,利用74ls573对数码管驱动,为了节省I/O资源,采取动态显示的方法来显示计算数据及其结果。
P0口输出显示值,P2.2-P2.7用来作为位选端,控制哪几位数码管显示。
图6数码管引脚图
3软件设计
3.1系统主程序
在主程序模块中,需要完成对各参量和接口的初始化、计算、循环等工作。
另外,在主程序模块中还需要设置标志寄存器,并对它们进行初始化。
然后,主程序将根据各标志寄存器的内容,分别完成加减乘除不同的操作。
图7主程序流程图
3.2计算程序
输入数据要先输入数据的高位,再输入数据的低位,对于结果计算子程序,包含加减乘除四种运算,以加法为例,当标志位flag1=0时为加法,就将输入的两个数据按照加法进行计算,结果就是我们所求的数值,但这个数值不能直接在数码管上显示出来,我们还要对其进行处理,使其变为对应的数组内,以便显示,即通过对结果数值分别除以10000、1000、1000、10和对10取余,得到我们想要的5个数送显示子程序,其余减法、乘法、除法的计算方法与加法的计算方法一样,
3.3显示程序
显示程序利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。
LED数码管介绍
LED数码管根据LED的接法不同分为共阴和共阳两类,它们的发光原理是一样的,只是它们的电源极性不同而已。
将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。
3.4键盘程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。
流程图如图12。
图8键盘扫描流程图
4结论
通过此次单片机实训设计,我们学到了很多东西,在器件的了解和器件选择上有个明确的认识,并在程序的设计,及理论在实践反面的运用能力有巨大的提高。
这次单片机课程设计由我经过两周努力设计得到。
软件的编程要我不断的调试,最终我终于完成了单片机实训课程设计,很高兴它能按着设计思想与要求运动起来。
当然,这其中也有很多的问题。
第一、不够细心,由于对课本理论的不熟悉导致的编程错误,对于器件的实际情况的不了解,理论与实践的差距导致我在设计实际电路时出现了很多错误,使得实验不能一次通过。
第二、是在学习态度上,这次课程设计是对我的学习态度的一次体验。
对于这次单片机综合课程实习,我的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨,这次的课程设计我们所遇到的问题多半是由于我们不够严谨。
第三、在做人上,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力和决心,有足够的挑战困难的勇气,就没什么办不到的。
在方案设计选择和芯片的选择上,培养了我们综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识。
还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题、解决问题的能力。
参考文献
[1]李群芳,黄建.单片机微型计算机与接口技术.北京:
电子工业出版社,2001
[2]徐维祥、刘旭敏.单片微型机原理及应用.大连:
大连理工大学出版社,1996
[3]李光飞、楼然苗、胡佳文、谢象佐.单片机课程设计与实例指导.北京:
北京航空航天大学出版社,2004
[4]楼然苗、李光飞.51系列单片机设计实例.北京:
北京航空航天大学出版社,2003
[5]康华光.电子技术基础模拟部分,北京:
高等教育出版社,2003.
致谢
本次单片机课程设计是在张老师的悉心指导下完成的,老师渊博的知识教授于我们,让我在实践的过程中避免了很多错误。
在单片机学习的过程中,张老师的严格的教学态度城成为我们学习单片机强大的动力,衷心的感谢张老师,他不仅教授我学习上的知识,而且还教给我很多做人的道理。
同时感谢电子信息工程B1210班同学,他们不但给我提供了一个很好的学习空间,而且,对我起到了很大的指导作用。
最后,再次感谢在这次设计中所有帮助过我的良师益友,设计的成功离不开你们。
附录A源程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitwela=P2^7;
sbitdula=P2^6;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
ucharshu,flag,num1,num2,flag1,temp,num3,num4,num5,num6;
uintnum,shu1,shu2;
voiddelay(uintz)//延时
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidxianshi(uintnum)//显示
{
if(num==0)
{
P2=0x08;
P0=table[num];
delay
(1);
}
elseif(0{
P2=0x08;
P0=table[num];
delay
(1);
}
elseif(9{
num1=num/10;
num2=num%10;
P2=0x010;
P0=table[num1];
delay
(1);
P2=0x08;
P0=table[num2];
delay
(1);
}
elseif(99{
num1=num/100;
num2=num/10%10;
num3=num%10;
P2=0x20;
P0=table[num1];
delay
(1);
P2=0x10;
P0=table[num2];
delay
(1);
P2=0x08;
P0=table[num3];
delay
(1);
}
elseif(999{
num1=num/1000;
num2=num/100%10;
num3=num/10%10;
num4=num%10;
你P2=0x40;
P0=table[num1];
delay
(1);
P2=0x20;
P0=table[num2];
delay
(1);
P2=0x10;
P0=table[num3];
delay
(1);
P2=0x08;
P0=table[num4];
delay
(1);
}
elseif(9999{
num1=num/10000;
num2=num/1000%10;
num3=num/100%10;
num4=num/10%10;
num5=num%10;
P2=0x80;
P0=table[num1];
delay
(1);
P2=0x40;
P0=table[num2];
delay
(1);
P2=0x20;
P0=table[num3];
delay
(1);
P2=0x10;
P0=table[num4];
delay
(1);
P2=0x08;
P0=table[num5];
delay
(1);
}
}
voidjianpan()
{
P3=0xfe;//键盘
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(20);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
shu=1;flag=0;
break;
case0xde:
shu=2;flag=0;
break;
case0xbe:
shu=3;flag=0;
break;
case0x7e:
flag=1;//加法
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;//键盘
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(20);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
shu=4;flag=0;
break;
case0xdd:
shu=5;flag=0;
break;
case0xbd:
shu=6;flag=0;
break;
case0x7d:
flag=2;//减法
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;//键盘
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(20);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:
shu=7;flag=0;
break;
case0xdb:
shu=8;flag=0;
break;
case0xbb:
shu=9;flag=0;
break;
case0x7b:
flag=3;//乘法
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;//键盘
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(20);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:
shu=0;flag=0;
break;
case0xd7:
flag=4;//复位
break;
case0xb7:
flag=5;//等于
break;
case0x77:
flag=6;//除法
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
}
voidretuse()
{
if(flag1==0)
num=shu1+shu2;
if(flag1==1)
num=shu1-shu2;
if(flag1==2)
num=shu1*shu2;
if(flag1==3)
num=(shu1/shu2);
}
voidmain()
{
intshu3=0;
flag=7;
shu2=0;
while
(1)
{
jianpan();
switch(flag)
{
case0:
shu2=shu2*10+shu;shu3=shu2;flag=7;break;//数字键
case1:
shu1=shu2;shu2=0;flag=7;flag1=0;break;//加法
case2:
shu1=shu2;shu2=0;flag=7;flag1=1;break;//减法
case3:
shu1=shu2;shu2=0;flag=7;flag1=2;break;//乘法
case4:
shu=0;shu1=0,shu2=0;shu3=0;flag=7;break;//复位
case5:
retuse();flag=8;break;//等于
case6:
shu1=shu2;shu2=0;flag=7;flag1=3;break;//除法
case7:
xianshi(shu3);break;//显示数字
case8:
xianshi(num);break;//显示计算结果
}
}
}
附录B原理图