单片机课程设计秒计时器设计文档格式.docx
《单片机课程设计秒计时器设计文档格式.docx》由会员分享,可在线阅读,更多相关《单片机课程设计秒计时器设计文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
1设计理论5
1.1设计指标5
1.2方案论证5
2AT89S51介绍6
2.1主要性能特点6
2.2管脚说明6
3系统硬件电路9
3.1单片机最小应用系统9
3.1.1复位电路11
3.1.2时钟电路12
3.2显示电路13
3.2.1数码管的结构和分类13
3.2.2显示驱动方式14
3.3键控电路15
3.3.1矩阵式键盘的工作原理15
3.3.2矩阵式键盘的按键识别方法15
4软件程序设计17
4.1程序流程图17
4.2单元程序设计19
4.3源程序23
5心得体会24
6参考文献25
1设计理论
1.1设计指标
(1)该倒计时器应具有基本倒时功能;
(2)具有暂停,复位功能;
(3)时间可以任意调整;
(4)时间用数码管显示,初始值为99S,扫描时间为1MS。
1.2方案论证
采用单片机程序设计制作,它是利用芯片AT89S51的特殊功能,上电两个数码管将显示99,P3口控制4X4矩阵按键开关,输入数字。
通过P0口对两片74HC273进行控制,一片输出字型码,一片输出字位码。
P2.4和P2.5控制74HC02,来确定字位和字形码地址。
其系统框图如图1所示。
2AT89S51介绍
AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。
2.1主要性能特点
1、4kBytesFlash片内程序存储器;
2、128bytes的随机存取数据存储器(RAM);
3、32个外部双向输入/输出(I/O)口;
4、5个中断优先级、2层中断嵌套中断;
5、6个中断源;
6、2个16位可编程定时器/计数器;
7、2个全双工串行通信口;
8、看门狗(WDT)电路;
9、片内振荡器和时钟电路;
10、与MCS-51兼容;
11、全静态工作:
0Hz-33MHz;
12、三级程序存储器保密锁定;
13、可编程串行通道;
14、低功耗的闲置和掉电模式。
2.2管脚说明
VCC:
电源电压输入端。
GND:
电源地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
PDIP封装的AT89S51管脚图
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口除了作为普通I/O口,还有第二功能:
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(T0定时器的外部计数输入)
P3.5T1(T1定时器的外部计数输入)
P3.6/WR(外部数据存储器的写选通)
P3.7/RD(外部数据存储器的读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。
读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。
只有读端口时才真正地把外部的数据读入到内部总线。
89C51的P0、P1、P2、P3口作为输入时都是准双向口。
除了P1口外P0、P2、P3口都还有其他的功能。
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:
片内振荡器反相放大器的输出端。
3系统硬件电路
3.1单片机最小应用系统
单片机最小系统是单片机在发挥具体测控功能时所必须的组成部分。
单片机最小应用系统方框图,如图3所示
图3单片机最小系统应用框图
3.1.1复位电路
单片机在开机时都需要复位,以便CPU及其他功能部件都处于一个确定的初始状态,并从这个状态开始工作。
单片机复位电路工作原理:
当通电瞬间稳压电源给电容充电。
RESET为复位输入端,当RESET引脚持续两个机器周期以上的高电平时,使单片机完成复位操作,随着电容充电结束,将使电容与电阻之间将呈现低电平,单片机复位结束。
复位操作的主要功能是把PC初始化为0000H,使单片机程序存储器从0000H单元开始执行程序。
本设计主要采用上电自动复位电路,其电路图如图4所示
图
3.1.2时钟电路
本篇论文选择的方案中采用的是内部振荡方式。
采用内部方式时在XTAL1和XTAL2引脚上接石英晶体和微调电容可以构成振荡器,如图5所示。
图中C1、C2起稳定振荡频率、快速起振的作用。
内部振荡方式所得的时钟信号比较稳定,实用电路中使用较多。
振荡频率的选择范围为1MHz~12MHz。
3.2显示电路
显示器件有很多种,常用的有发光二极管,数码管,液晶显示器等,本文采用通用型的LED数码管。
3.2.1数码管的结构和分类
LED数码管根据LED的接法不同分为共阴和共阳两类,它们的发光原理是一样的,只是它们的电源极性不同而已,其结构图分别如图6所示,本设计使用共阳数码管。
(a)共阴结构
(
3.2.2显示驱动方式
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
本文主要采用动态显示驱动。
由于数码管要点亮需要3—10mA的电流,但单片机不能提供如此大的电流故需要加74HC273加以驱动,单片机输出端引脚的电压约为5V,如果直接加载到数码管上将烧坏数码管,因此在这部分电路中一并加限流电阻,根据理论计算和实际的经验限流电阻取470Ω,其电路图如图7所示一片作为输出字形,一片作为输出字位
3.3键控电路
键盘是微机应用系统中使用最广泛的一种数据输入设备,按照键盘按键的结构形式,可分为独立式键盘和矩阵式键盘。
本文主要采用矩阵式键盘,此键盘控制电路主要是用于调整时间,其电路结构图如图9所示。
3.3.1矩阵式键盘的工作原理
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而
图(9)4X4矩阵按键
是通过一个按键加以连接。
这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
3.3.2矩阵式键盘的按键识别方法
确定矩阵式键盘上何键被按下介绍一种“行扫描法”。
行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。
1、判断键盘中有无键按下将全部行线R0-R3置低电平,然后检测列线的状态。
只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。
若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。
其方法是:
依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。
在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。
若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
为了保证键每闭合一次CPU仅作一次处理,必须却除键释放时的抖动。
4
4软件程序设计
4.1程序流程图系统程序流程图如图10所示。
4.2单元程序设计
1.打开中断和定时器
TMOD=0X11;
ET0=1;
ET1=1;
EA=1;
TH0=0X3C;
TL0=0XB0;
TH1=0xfc;
TL1=0x18;
TR1=1;
TR0=1;
2.中断0
time()interrupt1
{
change=0;
shi=0;
ge=0;
if(--t)
return;
else
{
t=20;
if(n==1||n==0)
{
P1_6=0;
n=0;
return;
}
n--;
}
}
3.矩阵按键输入
voidget_key()
TR1=0;
zxm=0x00;
//消隐显示
key_value=0;
zwm=0x0e;
k=key;
//预取key值
if((key&
0x0f)==0x0e)key_value=1;
if((key&
0x0f)==0x0d)key_value=5;
0x0f)==0x0b)key_value=9;
0x0f)==0x07)key_value=13;
zwm=0x0d;
0x0f)==0x0e)key_value=2;
0x0f)==0x0d)key_value=6;
0x0f)==0x0b)key_value=10;
0x0f)==0x07)key_value=14;
zwm=0x0b;
0x0f)==0x0e)key_value=3;
0x0f)==0x0d)key_value=7;
0x0f)==0x0b)key_value=11;
0x0f)==0x07)key_value=15;
zwm=0x07;
0x0f)==0x0e)key_value=4;
0x0f)==0x0d)key_value=8;
0x0f)==0x0b)key_value=12;
0x0f)==0x07)key_value=16;
zwm=0x00;
while((key&
0x0f)!
=0x0f);
k=10000;
while(--k);
4.数码管显示
display()interrupt3
TH1=0Xfc;
TL1=0X18;
if(dis)
zxm=0;
zwm=0x80;
zxm=zx[n%10];
}
zwm=0x40;
zxm=zx[n/10];
dis=~dis;
5.输入时间
if(key_value==13)TR0=~TR0;
if(key_value==15)
n=99;
t=20;
TR0=1;
P1_6=1;
if(key_value==14)change=1;
if(key_value!
=0)
if((key_value<
11)&
&
(change==1)&
(shi==0)&
(ge==0))
{
n=(key_value-1)*10;
shi=1;
continue;
}
(shi==1)&
n=n+key_value-1;
ge=1;
(ge==1))
n=99;
t=20;
TR0=1;
4.3源程序
系统总源程序见附录二
5心得体会
这次单片机秒计时设计使得我更加深刻的加深了对51单片机实际应用方面的知识,提高了自己的动手能力,增强了自身的编程能力,积累了一些宝贵的学习经验。
通过这次试验,我进一步的51了解了单片机的各管脚以及开发板各部分功能的应用。
对单片机的秒计时,有了进一步的了解。
知道了解和掌握单片机指令系统中高级语言C语言程序设计的基本知识和方法,4X4矩阵按键扫描原理和编程。
对51单片机的中断指令有了新的了解。
6参考文献
[1]康华光电子技术基础模电部分(第五版)北京高等教育出版社2006.1
[2]孙树朴电力电子技术徐州中国矿业大学出版社2000.3
[3]谭浩强C程序设计(第三版)北京清华大学出版社2005
[4]胡汉才单片机及其接口技术(第三版)北京清华大学出版社2010.5
附录1
附录2
#include<
AT89X51.h>
unsignedcharxdatakeyat0xf7ff;
unsignedcharxdatazwmat0xdfff;
unsignedcharxdatazxmat0xefff;
unsignedcharcodezx[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsignedchart=20,n=99,key_value;
unsignedintk;
bitdis=1,change=0,shi=0,ge=0;
voidget_key();
voidwait();
voidmain()
while
(1)
get_key();
if(key_value==13)TR0=~TR0;
if(key_value!
0x