《微机接口技术》课程设计报告计算器设计.docx
《《微机接口技术》课程设计报告计算器设计.docx》由会员分享,可在线阅读,更多相关《《微机接口技术》课程设计报告计算器设计.docx(22页珍藏版)》请在冰点文库上搜索。
《微机接口技术》课程设计报告计算器设计
《微机接口技术》课程设计报告
-----计算器设计
姓名:
学号:
指导老师:
一、目录
1、目录………………………………………………………………………………………………2
2、概论………………………………………………………………………………………………3
2.1计算器意义…………………………………………………………………………………3
2.2软硬件环境要求……………………………………………………………………………3
2.3AT89S51单片机概述………………………………………………………………………4
3、计算器的基本功能与设计………………………………………………………………………6
3.1计算器基本实现功能………………………………………………………………………6
3.2电路原理图…………………………………………………………………………………7
3.3设计方案与实现方法………………………………………………………………………7
4、计算器模块设计…………………………………………………………………………………8
4.1输入模块……………………………………………………………………………………8
4.2运算模块…………………………………………………………………………………10
4.3显示模块…………………………………………………………………………………10
5、硬件电路设计…………………………………………………………………………………11
5.1主要器件…………………………………………………………………………………11
5.2功能和操作………………………………………………………………………………11
5.3硬件调试…………………………………………………………………………………11
6、软件设计……………………………………………………………………………………12
6.1程序流程图…………………………………………………………………………………13
6.2软件主要程序设计………………………………………………………………………13
7、课程设计心得体会……………………………………………………………………………18
8、参考文献………………………………………………………………………………………19
二、概述
2.1计算器意义
随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。
单片机的应用已经越来越贴近生活,用单片机来实现一些电子设计也变得容易起来。
计算器在人们的日常中是比较的常见的电子产品之一。
可是它还在发展之中,以后必将出现功能更加强大的计算器,基于这样的理念,本次设计是用单片机来设计的计算器。
该设计系统是以AT89C51为单片机,P0口作为输入端,用8279或8155做键盘和LED显示接口芯片,通过键盘扫描来对输入数的控制,在P1口,P2口接了驱动电路。
用来保证LED的工作正常。
计算器将完成“+、-、*、/”功能。
2.2软硬件环境要求
1、软件:
集成开发软件IDE;
2、硬件:
试验仪一台,编程器一台,msc51单片机一块,示波器一台。
AT89S51单片机引脚图如下:
2.3AT89S51单片机概述
AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S51具有如下特点:
40个引脚,4kBytesFlash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
1.主要特性:
•8031CPU与MCS-51兼容
•4K字节可编程FLASH存储器(寿命:
1000写/擦循环)
•全静态工作:
0Hz-33MHz
•三级程序存储器保密锁定
•128*8位内部RAM
•32条可编程I/O线
•两个16位定时器/计数器
•6个中断源
•可编程串行通道
•低功耗的闲置和掉电模式
•片内振荡器和时钟电路
2.管脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。
读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。
只有读端口时才真正地把外部的数据读入到内部总线。
上面图中的两个三角形表示的就是输入缓冲器CPU将根据不同的指令分别发出读端口或读引脚信号以完成不同的操作。
这是由硬件自动完成的,不需要我们操心,1然后再实行读引脚操作,否则就可能读入出错,为什么看上面的图,如果不对端口置1端口锁存器原来的状态有可能为0Q端为0Q^为1加到场效应管栅极的信号为1,该场效应管就导通对地呈现低阻抗,此时即使引脚上输入的信号为1,也会因端口的低阻抗而使信号变低使得外加的1信号读入后不一定是1。
若先执行置1操作,则可以使场效应管截止引脚信号直接加到三态缓冲器中实现正确的读入,由于在输入操作时还必须附加一个准备动作,所以这类I/O口被称为准双向口。
89C51的P0/P1/P2/P3口作为输入时都是准双向口。
接下来让我们再看另一个问题,从图中可以看出这四个端口还有一个差别,除了P1口外P0P2P3口都还有其他的功能。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
AT89SXX系列单片机实现了ISP下载功能,故而取代了89CXX系列的下载方式,也是因为这样,ATMEL公司已经停止生产89CXX系列的单片机,现在市面上的AT89CXX多是停产前的库存产品。
三、计算器基本功能与设计
3.1计算机器基本实现功能
1.计算器可显示8位数字,开机运行时,只有数码管最低位显示为“0”,其余位全部不显示;
2.设计4×4键盘,分别表示0~9、+、-、×、/、=和清零键CL,输入的数字从设计的键盘输入;
3.第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三次按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音,并且输入的第九个数不接收,仍然显示原来的八位数;
4.可以对计算结果小于256的两个无符号数进行加法运算,并显示计算结果。
对于×、/、和—的运算为提高部分。
3.2电路原理图
图1电路原理图
3.3设计方法和实现方法
为了满足计算器的基本要求,可以基本的运算(加减乘除),数据归零和出错警告提示,我们采用基于MSC-51单片机设计计算器,并用LED数码管显示数据,4*4的矩阵键盘实现数据输入。
根据功能和指标要求,本系统选用MSC-51单片机为主控机。
通过扩展必要的外围接口电路,实现对计算器的设计。
具体设计考虑如下:
1、由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高,故我们采用可以进行四位数字的运算,选用8个LED数码管显示数据和结果。
2、另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16个按键即可。
3、故设计此系统模块图
图2系统模块图
四、计算器模块设计
4.1输入模块:
键盘扫描
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式。
为此,我们引入了矩阵键盘的应用,采用四条I/O线作为行线,四条I/O线作为列线组成键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4×4个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
矩阵键盘的工作原理:
计算器的键盘布局如图3所示:
一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。
图3键盘布局图
由图4矩阵键盘内部电路图可以知道,当无按键闭合时,P10~P13与P14~P17之间开路。
当有键闭合时,与闭合键相连的两条I/O口线之间短路。
判断有无按键按下的方法是:
第一步,置列线P14~P17为输入状态,从行线P10~P13输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。
第二步,行线轮流输出低电平,从列线P14~P17读入数据,若有某一列为低电平,则对应行线上有键按下。
综合一二两步的结果,可确定按键编号。
但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。
图4矩阵键盘内部电路图
4.2运算模块:
单片机控制
MCS-51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。
如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!
因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能。
4.3显示模块:
LED显示
发光二极管LED是单片机应用系统中的一宗简单而常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。
因而作为典型的外围器件,LED显示单元是反映系统输出和操作输入的有效器件。
LED具备数字接口可以方便的和大年纪系统连接;它的优点是价格低,寿命长,对电压电流的要求低及容易实现多路等,因而在单片机应用系统中获得了广泛的应用。
通常的数码显示器是由7段条形的LED组成(如图5所示),点亮适当的字段,就可显示出不同的数字。
我们采用8段数码管,其中位于显示器右下角的LED作小数点用。
LED显示器有两种不同的形式:
共阴极和共阳极。
本次设计采用共阴极接法(如图6所示)。
图57段数码显示器内部段的排列图图6共阴极连接
五、硬件电路设计
5.1主要器件
单片机采用AT89S51单片机,它能够满足数据的采集、控制和数据处理的需求。
显示用8段LED数码管,输入采用按键方式。
5.2功能和操作
加减乘除运算和显示。
1、上电后,屏幕初始化。
2、计算。
按下数字键,屏幕显示要运算的第一个数字,再按下符号键,然后再按下数字键,屏幕显示要运算的第二个数字,最后按下“﹦”号键,屏幕上显示出计算结果。
3、如果要再次计算,可以按下“CLC”键清零,或者按下单片机的复位键,重新初始化。
5.3硬件调试
5.3.1常见故障:
1、逻辑错误:
它是由设计错误或加工过程中的工艺性错误所造成的。
这类错误包括错线、开路、短路等。
2、元器件失效:
有两方面的原因:
一是器件本身已损坏或性能不符合要求;二是组装错误造成元件失效,如电解电容、二极管的极性错误、集成电路安装方向错误等。
3、可靠性差:
引起可靠性差的原因很多,如金属化孔、接插件接触不良会造成系统时好时坏,经不起振动;走线和布局不合理也会引起系统可靠性差。
4、电源故障:
若样机有电源故障,则加电后很容易造成器件损坏。
电源故障包括电压值不符合设计要求,电源引线和插座不对,功率不足,负载能力差等。
5.3.2调试方法:
包括多级调试和联机调试。
在调试过程中要针对可能出现的故障认真分析,直至检查出原因并且排除。
5.3.3技术要点:
1、单片机的复位与时钟:
AT89S51单片机与其他处理器一样,在启动时都需要复位,使CPU和系统的各个部件都处于一种确定的初始状态。
复位信号从单片机的RST引脚输入,高电平有效,其有效电平应维持至少2个机器周期。
复位操作有上电自动复位和按键手动复位两种方式,我们采用的是按键手动复位方式。
时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。
MCS-51单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反向放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
这两个引脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自激振荡器。
2、电源电路设计:
电源电路包括变压器、桥式整流器、电容和稳压器。
通过变压器变压,使得220V电压变为5V,在通过桥式整流,电容的滤波作用,稳压器的稳压作用,可输出5V的稳定电压
3、可靠性设计:
单片机应用系统在实际运行中,可能会受到各种外部和内部的干扰,使系统工作产生错误或故障。
为了提高系统的抗干扰能力,常用的措施有:
a、提高元器件的可靠性。
在系统硬件设计和加工时,应注意选用质量好的电子器件接插件,要进行严格的测试、筛选和老化,同时设计的技术参数应留有余量。
b、提高印刷电路板和组装的质量。
设计电路板时布线及接地方法要符合要求,强弱电信号线要分开。
c、对供电电源采取抗干扰措施。
例如用带屏蔽层的电源变压器、加电源低通滤波器、电源变压器的容量应留有余量等。
六、软件设计
6.1程序流程图
图7程序流程图
6.2软件主要程序设计
6.2.1键盘扫描程序
此程序为键盘扫描中第一次扫描所用的程序,这段程序的主要过程为:
初始化时,将P1.4置为低电平,通过与0x0f相与来判断所按下的键,此次为扫描位于P1.4那一行的键,若相与结果为0x0e时说明P1.0所检测出的为低电平,闭合的键应为P1.4行与P1.0列的交叉处的键。
若相与结果为0x0d则P1.1所检测为低电平,闭合的键应为P1.4行与P1.1列的交叉处的键。
若相与结果为0x0b则P1.2所检测为低电平,闭合的键应为P1.4行与P1.2列的交叉处的键。
若相与结果为0x07则P1.3所检测为低电平,闭合的键应为P1.4行与P1.3列的交叉处的键。
要把16个键盘全部扫描完需要进行4次这样的逐行扫描,所用方法相同程序类似分别另P1.5,P1.6,P1.7为低电平执行相同操作。
程序如下:
charscankey()
{
P1=0xff;
P1_4=0;
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay(20);
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
return(15);
break;
case0x0d:
return(14);
break;
case0x0b:
return(13);
break;
case0x07:
return(12);
break;
}
temp=P1;
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
6.2.2显示程序
此程序为显示程序的一部分,其同源程序代码中的数据定义部分,显示驱动程序和码制转换程序一起来实现数据在数码管中的显示。
如当第一次输入为1,第二次输入为2时,则将1在数码管中向前移一位即第二位显示管上,将2放到第一位显示管上,在通过码制转换使其转换为12来执行运算,如果继续输入数字则它们将逐个的向前移动,直到输入8为后,报警提示已不能显示更多数字。
程序如下:
/*码制转换:
计算结果转换为显示码*/
voidcchange(uintcnum)
{
uchari,j,k;
ucharn;
uchardbuffer[8]={0};
for(i=0;i<8;i++)
{
n=cnum%10;
cnum=cnum/10;
dbuffer[i]=n;
}
for(j=0;j<8;j++)
{
if(dbuffer[7-j]!
=0)
{
for(k=0;k<=7-j;k++)
{
dd[k]=dbuffer[k];
}
break;
}
}
}
/*显示数字*/
voiddisnum(ucharunum)
{
display(0xfe,disdata[2]);
if(counter<8)
{
change(dd,counter);
if(dflag==0)
{
indata=indata*10+unum;
dd[0]=indata%10;
}
if(dflag==1)
{
nextdata=nextdata*10+unum;
dd[0]=nextdata%10;
}
}
else
{counter=8;
alarmflag=1;}
counter++;
}
6.2.3简单运算程序
此设计能实现简单运算,此程序实现加法运算,则根据程序首先通过第一次键盘扫描确定出所按下的键对应的输出数据,然后通过显示程序经数码管显示出来,接着进行键盘扫描若确定出按下的键所对应的字符还为数据则把第一次显示的数字在数码管上左移一个管子,然后把第二次扫描的数据放入右边第一个管子中,继续扫描直到确定出按下的键为“+”则保存前面所扫描的数据到缓冲区,然后接着扫描键盘直到确定出加数,最后当扫描出所按下的键为“=”时,则保存数据到缓冲区,根据程序计算出其相加结果。
并通过程序及原理图显示出来。
通过这个程序还可实现连加功能。
整个源程序还可以实现加,减,乘,除四个基本运算,具体的减,乘,除运算程序在源程序中有详细显示。
当检测出所闭和的为这些按键时,通过程序将执行相似过程最后通过数码管显示出结果。
程序如下:
voidoperator(ucharopch)
{
if(dflag==0)
dflag=1;
else
dflag=0;
cbuffer();
op=opch;
}
/*等号处理程序*/
voidequal()
{
cbuffer();
switch(op)
{
case1:
if(dflag==0)
{
nextdata=nextdata+indata;
sum=nextdata;
indata=nextdata;
}
if(dflag==1)
{
indata=indata+nextdata;
sum=indata;
nextdata=indata;
}
lsum=lsum+sum;
break;
6.2.4主程序
段程序为整个源程序的主程序,包括初始化程序,开机显示0,一个循环程序,各个子程序都围绕着这个主程序来实现其功能。
程序如下:
voidmain()
{
t=0;
EA=1;
ET0=1;
TMOD=1;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
sum=0;
lsum=0;
display(0xfe,disdata[0]);
while
(1)