51单片机定时器

定时器(TIMER)

51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。其中stc89c52系列具有T0,T1,T2三个定时器。

定时器框图:

6978a7b7efac4c20ae4144d5442d6a3c.png

定时器工作模式

定时器/计数器0有4种工作模式:模式0(13位定时器/计数器),模式1(16位定时器/计数器模式),模式2(8位自动重装模式),模式3(两个8位定时器/计数器)。定时器/计数器1除了模式3之外,其他工作模式与定时器/计数器0相同,T1在模式3时无效,停止计数。

其中SYSclk表示系统时钟即晶振频率。

ed2e59d994704e698d559529c3145d50.png

 定时器重载值的计算方法

我们的晶振是 11.0592M,时钟周期就是 1/11059200,机器周期是 12/11059200,假如要定时 20ms,就是 0.02 秒,要经过 x 个机器周期得到 0.02 秒,我们来算一下 x*12/11059200=0.02,得到 x= 18432。16 位定时器
的溢出值是 65536(因 65535 再加 1 才是溢出),于是我们就可以这样操作,先给 TH0 和 TL0一个初始值,让它们经过 18432 个机器周期后刚好达到 65536,也就是溢出,溢出后可以通 过检测 TF0 的值得知,就刚好是 0.02 秒。那么初值 y = 65536 - 18432 = 47104,转成 16 进制就是 0xB800,也就是 TH0 = 0xB8,TL0 = 0x00。 这样 0.02 秒的定时我们就做出来了。

定时器模式寄存器(TMOD)

8312e0078c1e410d887334e70523c294.png

51定时器有(0,1,2,3)四种工作模式 ,通过配置M1,M0,来设置不同的工作模式,其中高四位是设置定时器1,第四位设置定时器0;

在不改变定时器1的情况下,对定时器0进行设置:

TMOD &=0xF0;                //任何数&上1本身不变,任何数|0,本身不变。

TMOD |=0x01;                 //把定时器0设置为工作模式1

工作模式1,计数器 

定时器配置示例代码

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

unsigned char keyNum;

void Timer0Init(void){
	//为了不干扰定时器1
	//TMOD &= 0xF0;		//设置定时器模式
	//TMOD |= 0x01;		//设置定时器模式
	
	TMOD = 0x01;
	//TL0低8位,TH0高8位
	TL0=64535%256+1;
	TH0=64535/256;
	//距离65535差1000,一次1us,1000次就是1ms
	
	//TCON配置
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	//中断配置
	ET0=1; //enable time0 interrupt
	EA=1; //enable global interrupt switch
	PT0=0;//低优先级
	
	
}


void main()
{
	P2=0xFE;
	Timer0Init();
	
	while(1)
	{
		
	}
}


void Timer0_Routine() interrupt 1{
	static unsigned int c = 0;
	
	TL0=64535%256+1;
	TH0=64535/256;
	c++;
	
	//500ms
	if(c>=500){
		c=0;
		//循环左移
		P2=_crol_(P2,1);	//LED输出
	}
	
}

 工作模式2,设置波特率

波特率就是发送二进制数据位的速率,习惯上用 baud 表示,即我们发送一位二进制数据
的持续时间=1/baud。

 江科大设置的UART波特率

7f71615f78124bc3b7d174ca48669204.png

定时器重装值计算公式:
TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率。和波特率有关的还有一个寄存器,是一个电源管理寄存器 PCON,他的最高位可以把波

特率提高一倍,也就是如果写 PCON |= 0x80 以后
 
计算公式就成了:
TH1 = TL1 = 256 - 晶振值/12 /16 /波特率
公式中数字的含义这里解释一下,256 是 8 位定时器的溢出值,也就是 TL1 的溢出值,
晶振值在我们的开发板上就是 11059200,12 是说 1 个机器周期等于 12 个时钟周期,值得关
注的是这个 16,我们来重点说明。在 IO 口模拟串口通信接收数据的时候,采集的是这一位
数据的中间位置,而实际上串口模块比我们模拟的要复杂和精确一些。他采取的方式是把一
位信号采集 16 次,其中第 7、8、9 次取出来,这三次中其中两次如果是高电平,那么就认
定这一位数据是 1,如果两次是低电平,那么就认定这一位是 0,这样一旦受到意外干扰读
错一次数据,也依然可以保证最终数据的正确性。

 

 

欢迎大家点赞收藏

 

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C51单片机有两个定时器,分别为Timer 0和Timer 1。定时器的主要功能是计时和延时,可以用于控制程序执行的时间。 以下是C51单片机定时器的基本操作步骤: 1. 设置定时器模式:选择定时器工作模式,如定时器模式或计数器模式。 2. 设置定时器计数值:确定计数器的初始值,即计时的时间。 3. 启动定时器:启动定时器开始计时。 4. 等待定时器计时结束:等待定时器计时结束,即达到设定的计数值。 5. 停止定时器:停止定时器计时。 以下是一个简单的C51单片机定时器示例程序: ``` #include<reg52.h> #define uint unsigned int #define uchar unsigned char void timer0_init(); //定时器0初始化函数 void main() { timer0_init(); //调用定时器0初始化函数 while(1) { //程序执行任务 } } void timer0_init() { TMOD &= 0xF0; //设置定时器0为模式1 TH0 = 0x3C; //给定时器赋初值,定时1ms TL0 = 0xAF; ET0 = 1; //打开定时器0中断允许 EA = 1; //打开总中断允许 TR0 = 1; //启动定时器0 } void timer0() interrupt 1 using 1 { TH0 = 0x3C; //给定时器赋初值,定时1ms TL0 = 0xAF; //中断执行任务 } ``` 在上面的程序中,timer0_init()函数用于初始化定时器0,设置模式1,计时1ms;timer0()函数是定时器0的中断处理函数,当定时器0计时结束后,会自动进入此函数进行中断处理。在这个函数中,可以编写相应的任务执行代码。在主函数中,通过while(1)循环不停地执行程序任务,而定时器0会在后台进行计时和中断处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值