龙空技术网

单片机初学者轻松入门之(十一):定时器制作流水灯

小娄学51单片机 279

前言:

当前同学们对“51单片机定时器定时1秒程序流水灯结果分析”大体比较讲究,大家都想要分析一些“51单片机定时器定时1秒程序流水灯结果分析”的相关知识。那么小编也在网络上收集了一些对于“51单片机定时器定时1秒程序流水灯结果分析””的相关内容,希望咱们能喜欢,朋友们一起来了解一下吧!

实现定时功能,比较方便的办法是利用单片机内部的定时/计数器。也可以采用下面三种方法:

1、软件定时:软件定时不占用硬件资源,但占用了CPU时间,降低了CPU的利用率。

2、采用时基电路定时:例如采用555电路,外接必要的元器件(电阻和电容),即可构成硬件定时电路。但在硬件连接好以后,定时值与定时范围不能由软件进行控制和修改,即不可编程。

3、采用可编程芯片定时:这种定时芯片的定时值及定时范围很容易用软件来确定和修改,此种芯片定时功能强,使用灵活。在单片机的定时/计数器不够用时,可以考虑进行扩展。

一、MCS-51单片机定时器结构

(一)MCS-51单片机定时器结构

MCS-51单片机内部有两个16位的可编程定时/计数器,由TH1、TL1、TH0、TL0、TCON、TMOD等6个特殊功能寄存器组成,如图所示。

TMOD主要是用于选定定时器的工作方式,TCON主要是用于控制定时器的启动和停止。

1、工作方式寄存器TMOD

专用寄存器称TMOD称为工作方式寄存器。TMOD每位的名称如表。

TMOD位

D7

D6

D5

D4

D3

D2

D1

D0

位名称

GATE

C/T-

M1

M0

GATE

C/T-

M1

M0

高4位用于控制定时器T1,低4位用于控制定时器T0。TMOD中各位的定义如下:

GATE:门控位。高电平有效,具体作用见后面工作方式介绍。

:定时、计数选择位。

C/T-=1计数;

C/T-=0定时。

M1、M0:工作方式选择位。定时器有4种工作方式,由M1M0设定。

例如将T1设定为工作在方式0定时,将T0设定为工作在方式1计数,可通过下面指令来完成。

TMOD=0x05;

2、定时器控制寄存器TCON

专用寄存器TCON控制寄存器,用于控制定时器的起动与停止、设置中断与中断响应等。TCON每位名称如表所示。

TCON位

D7

D6

D5

D4

D3

D2

D1

D0

位名称

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

TCON中各位的定义如下:

TF1(TF0):定时器T1(T0)的中断请求标志位。

TR1(TR0):定时器T1(T0)启动/停止控制位。

IE1、IT1、IE0、IT0用于外部中断,项目4中已做介绍。

例如要启动定时器T0开始工作可使用下面的指令。

TR0=1;

(二)MCS-51定时器工作方式

1、方式0

当M1M0设置为00时,定时器设定为方式0工作。在这种方式下,16位寄存器只用了13位,如图所示。

方式0逻辑结构图

当GATE=0,TR0=1时, TL0、TH0组成的13位计数器就开始计数。

当GATE=1、TR0=1时,THO、TL0是否计数取决于P3.2引脚的信号,当P3.2引脚为1时,开始计数,当P3.2引脚为0时,停止计数,这样就可以用来测量在P3.2引脚出现的正脉冲宽度。

当13位计数器加1到全“1”以后,再加1就产生溢出。这时,置TCON的TF0位为1;同时把计数器变为全“0”。

2、方式1

方式1和方式0的工作相同,唯一的差别是TH0和TL0组成一个16位计数器。

3、方式2

方式2把TL0配置成一个可以自动恢复初值(初始常数自动重新装入)的8位计数器,TH0作为常数寄存器。

4、方式3

方式3对定时器T0和定时器T1是不相同的。若T1设置为方式3,则停止工作,所以方式3只适用于T0。当T0设置为方式3时,将使TL0和TH0成为两个相互独立的8位计数器。

5、定时/计数初值的计算

(1)定时初值X的计算公式如下:

X=2M-

其中:M为计数器的长度(方式0、方式1、方式2对应的M值分别为:13、16、8),T为定时值,fsoc为振荡器频率。

(2)计数初值的计算公式如下:

X=2M-N

其中:M为计数器的长度(方式0、方式1、方式2对应的M值分别为:13、16、8),N为计数值。

(三)中断源定时/计数器的初始化

初始化程序应完成如下工作:

1、对TMOD赋值,以确定T0和T1的工作方式。

2、计算初值,并将其写入TH0、TL0或TH1、TL1。

3、中断方式时,则对IE赋值,开放中断。

4、使TR0或TR1置位,启动定时/计数器定时或计数。

二、定时/计数器T0制作流水灯的设计

1、电路图

2、程序设计

void main()

{

TMOD=0x01; //0x01的二进制为0000 0001,分为高四位(对T1)

//和低四位(T0),由前面所述,高四位全0,低四

//位分别为GATE=0、 C/T-=0定时功能、M1M0=01方式1

TH0=(65535-50000)/256; //定时时间常数

//对256(28)取整,表示取高8位

TL0=(65535-50000)%256; //对256(28)取余,表示取低8位

EA=1; //开中断源总中断

ET0=1; //开定时/计数器T0中断

TR0=1; //启动定时/计数器T0

j=0x7f; //给变量j初始化为流水灯第一个灯亮的码

while(1); //让程序停在这里,等待中断的到来。每隔50ms程序会跳到中断子函数中

}

void t0() interrupt 1

{

uchar i; //定义变量

i++; //通过自加1来实现时间的加和

if(i==10) //当加到10时,50ms*10=500ms相当于500ms的延//时

{

i=0; //清零,以便于下次使用

P0=j; //将流水灯的显示码送入P0

j=_cror_(j,1); //改变显示码,实现流水效果

}

}

以下补充中断服务子程序的函数使用。

(1)、函数形式

函数名() interrupt n

{

执行程序;

}

(2)、函数名可任意设定,后加一对小括号

(3)、n为中断源序号,T0的序号为1

3、下载并调试程序

标签: #51单片机定时器定时1秒程序流水灯结果分析 #51单片机定时器实现流水灯