前言:
当前同学们对“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位,如图所示。
当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、下载并调试程序