C51 定时器

定时器的介绍

定时器介绍: 51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。

定时器作用:
1.用于计数系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作

2.替代长时间的Delay,提高CPU的运行效率和处理速度

STC89C52定时器资源

1.定时器个数三个(T0,T1,T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源

注意:定时器的资源和单片机的型号是关联在I起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的。

定时器框图

在这里插入图片描述
定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号每隔“一秒”,计数单元的数值就加以,当计数单元数值增加到“设定的闹钟提醒时候”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使得程序跳转到中断服务程序。

定时器工作模式

STC89C52的T0和T1均由四种工作模式
模式0:13位定时器/计数器
模式1:16位定时器/计数器(常用)
模式2:8位自动重装载模式
模式3:两个8位计数器
工作模式1框图:
在这里插入图片描述
Sysclk : 系统时钟,即晶振周期,本开发板上的晶振为12MHZ
C/T = 0 ->定时器, C/T =1 -> 计数器

有两个开关,第一个开关是选择12分频还是6分频,第二个开关向上就是定时器的模式(Sysclk),向下就是计数器的模式(T1 Pin)

选择12分频:12MHz除12为1MHz,也就是说一秒=1000000次机器周期 相当于1us计数一次

51单片机定时器初值的计算

中断系统

在这里插入图片描述

单片机引脚图

在这里插入图片描述

中断服务流程

在这里插入图片描述

中断资源

1.中断源个数: 8个(外部中断0,定时器0中断,外部中断1,定时器1中断,串口中断,外部中断2,外部中断3)
2.优先级个数: 4个
3.中断号:
在这里插入图片描述
注意: 中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同,中断优先级个数不同等等。

定时器相关寄存器

1.寄存器是连接软硬件的媒介

2.在单片机中寄存器就是一段特殊的RAM存储器,一方面,寄存器可以存储和读取数据,另一方面,每一个寄存器背后都连接了一根导线,控制着电路的连接方式。

3.寄存器相当于一个复杂机器的”操作按钮”
在这里插入图片描述
在这里插入图片描述
可位寻址和不可谓寻址的区别:
可位寻址:可以单独配置寄存器中的一位
不可位寻址:想要配置其中一位,必须配置整个寄存器
在这里插入图片描述
在这里插入图片描述

代码

将震动传感器接到P3.4(T0)
main.c

#include <REGX52.h>
#include <INTRINS.H>

/*¼ÌµçÆ÷µÆ*/
sbit LED = P2^1;

unsigned int T0Count=0;
void Timer0_Init(void)
{
		TMOD = 0x01;      //ÅäÖö¨Ê±Æ÷ģʽ1£¬0000 0001
		TF0  = 0;					//¹Ø±ÕÖжÏÒç³ö±ê־룬·ÀÖ¹²úÉúÖжÏ
		TR0  = 1;					//¿ªÆô¶¨Ê±Æ÷0
		TH0  = 64535/256; //Àý£º123/100 = 1  ¶¨Ê±Æ÷16룬TH0ºÍTL0°Ëλ×é³ÉµÄ16λ
		TL0  = 64535%256; //Àý£º123%100 = 23;16λ×î´ó¼ÆÊý65535£¬¼ÆʱһÏÂ1us£¬ÐèÒª1ms¾Í¿Õ³ö1000us
		ET0  = 1;					//´ò¿ª¶¨Ê±Æ÷0ÖжÏ
		EA   = 1;					//´ò¿ª×ÜÖжÏ
		PT0  = 1;					//ÖжÏÓÅÏȼ¶

}

/**
 *¹¦ÄÜ£ºÑÓʱ500ms
 *²ÎÊý£ºvoid
 *·µ»ØÖµ£ºvoid
 */
void Delay500ms(void)		//@11.0592MHz
{
		unsigned char i, j, k;

		_nop_();
		_nop_();
		i = 22;
		j = 3;
		k = 227;
		do
		{
			do
			{
				while (--k);
			} while (--j);
		} while (--i);
}

int main()
{
		Timer0_Init();

		while(1)
		{
		
		}
}

/**
 *¹¦ÄÜ£º¶¨Ê±Æ÷ÖжϷþÎñ³ÌÐò
 *²ÎÊý£ºvoid
 *·µ»ØÖµ£ºvoid
 */
void Timer0_Routine(void) interrupt 1
{
		TH0  = 64535/256;//µÚÒ»´ÎÊÇ64535£¬¼Óµ½65535ºóÖØмÆÊýÊÇ´Ó0¿ªÊ¼
		TL0  = 64535%256;
		T0Count ++;
		if(T0Count >= 1000)//¹ýÒ»ÃëÔÙÖ´ÐС£½øÈëÖжÏÒ»´Î1ms£¬1s = 1000ms
		{
				LED = 0;
				Delay500ms();
				LED = 1;
				Delay500ms();
		}
		
}

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小阿大:)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值