教你玩单片机之定时器(附程序)「终于解决」

编程文档 (48) 2023-08-16 16:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说教你玩单片机之定时器(附程序)「终于解决」,希望能够帮助你!!!。

教你玩单片机之定时器(附程序)

80c51的定时器

80c51单片机内有两个可编程的定时/计数器T0、T1。它们是一个16位计数器,分别由一个高8位和一个低8位的寄存器组成的。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。

定时/计数器的工作原理

定时/计数器实质上是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

工作方式寄存器TMOD

教你玩单片机之定时器(附程序)「终于解决」_https://bianchenghao6.com/blog_编程文档_第1张

GATE:门控制

0时:仅有运行控制位TRx来控制定时/计数器的开启

1时:由TRx和外部中断脉冲计数(用于计算外部中断负跳变 的次数)

C/T:计数器模式和定时器模式选择

0时:选择定时器模式

1时:选择为计数器模式

M1和M0:选择定时/计数器的工作方式

教你玩单片机之定时器(附程序)「终于解决」_https://bianchenghao6.com/blog_编程文档_第2张

定时器/计数器控制寄存器TCON

教你玩单片机之定时器(附程序)「终于解决」_https://bianchenghao6.com/blog_编程文档_第3张

  • IT0和IT1是设置外部中断的触发方式

当其为0时,为低电平触发方式

当其为1时,为负跳变触发方式

  • IE0和IE1是外部中断标志位

  • TF0和TF1是定时器的中断标志

  • TR1和TR0是打开相应的定时器

  • 其他的是定时/计数器的控制

定时/计数器的工作方式

  • 方式1

方式1为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。

教你玩单片机之定时器(附程序)「终于解决」_https://bianchenghao6.com/blog_编程文档_第4张

  • 方式2

方式2的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器 。

教你玩单片机之定时器(附程序)「终于解决」_https://bianchenghao6.com/blog_编程文档_第5张

  • 方式3

方式3为自动重装初值的8位计数方式。

教你玩单片机之定时器(附程序)「终于解决」_https://bianchenghao6.com/blog_编程文档_第6张

  • 方式4

方式4只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。

教你玩单片机之定时器(附程序)「终于解决」_https://bianchenghao6.com/blog_编程文档_第7张

定时器操作步骤:

选择工作方式(设置M1,M0)

选择控制方式(设置GATE)

选择定时器还是计数器模式(设置C/T)

给定时/计数器赋初值(设置THx和TLx)

开启定时器中断(设置ET0或ET1)

开启总中断(设置EA)

打开计数器(设置TR1或TR0)

定时器小程序

void TimerConfiguration()

{

TMOD = 0x01; //定时器0选择工作方式1

TH0 = 0x3C; //设置初始值

TL0 = 0xB0;

EA = 1; //打开总中断

ET0 = 1; //打开定时器0中断

TR0 = 1; //启动定时器0

}

单片机之定时器LED程序

实验效果 :LED每隔500ms左移一次

void main(void)

{

Time=0;

GPIO_LED=0XFE;

TimerConfiguration();

while(1)

{

if(Time==10)

{

GPIO_LED=_crol_(GPIO_LED,1);

Time=0;

}

}

}

void TimerConfiguration()

{

TMOD = 0x01; //选择工作方式1

TH0 = 0x3C; //设置初始值,定时50MS

TL0 = 0xB0;

EA = 1; //打开总中断

ET0 = 1; //打开定时器0中断

TR0 = 1; //启动定时器0

}

void Timer0() interrupt 1

{

TH0 = 0x3C; //设置初始值

TL0 = 0xB0;

Time++;

}

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

发表回复