51定时器(1)

                             51定时器

定时器/计数器 任何一个时刻使用,只能使用其中一种功能

51单片机提供的定时器分别为T0、T1(T0定时器四种工作方式都有,而T1仅有模式0与2)

启动定时器后,每个机器周期到来,初值寄存器自动加1,直到记满溢出

以方式1为例:

  1. 启动
  2. 机器周期
  3. 初值寄存器

TH0 (高八位),TL0 (低八位) 初值均为00H

0000 0000  0000 0000    0-65536 一共经历了65536us  也就是65.536ms

1111 1111  1111 1111   

初值的计算:
  如果要记50ms   TH0 = (65536-50000)/256

TL0 = (65536-50000)%256

PS:机器自动将十进制转化为十六进制

      4.自动加1

      5.溢出

编程实现步骤

  1. 报备

TMOD   工作方式寄存器

T0部分

GATE:门控位

      D2 C/T   0代表定时器功能 1代表计数器功能

     M1 M0

  1. 0  :方式  0
  1. 1  :方式1
  2. 0  :方式2
  3. 1  :方式3

T1 不用 全部清0

TMOD = 0x01;

   2.置初值

根据时间更改 TH0 TL0

  3.启动

TCON寄存器

TR0 = 1; (如果停止TR0=0)

 4 .等待

开始前手动清0   TF0=0

溢出后 TF0=1;

5.重置初值

更改 TL0  TH0

6.清溢出

TF0=0;

下面代码定时器实现流水灯

#include <REGX52.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void Timer0Init(void)	
{
	TMOD = 0x01;                  // 报备
	TH0 =(65536-50000)/256;       // 置初值
	TL0 =(65536-50000)%256;
	TR0 = 1;                      // 启动
}
void main()
{
	uchar n = 0x01,k=0;     
	Timer0Init();
	while(1)
	{
		k=0;
		while(k<20)
		{
		while(TF0 == 0);        //等待
			k++;
			TF0=0;              //重置初值和清溢出
			TH0 =(65536-50000)/256;
	        TL0 =(65536-50000)%256;
		}
		P2=~n;
		if(n == 0x80){n=0x01;}
		else {n<<=1;}
    }
		
	
}
<think>嗯,用户问的是“51定时器1”,我应该先确定他指的是不是51单片机里的定时器151单片机通常指的是Intel的8051系列或者其兼容型号,定时器是其中的重要模块,用于计时、延时、脉冲生成等。 首先,用户可能是刚开始学习单片机,需要了解定时器1的基本概念和工作原理。我需要分步骤解释,结构清晰。定时器的工作模式、寄存器配置这些是关键点,必须准确。 接下来,用户可能需要知道如何配置定时器1,比如模式选择、计数方式、中断设置等。要确保术语正确,比如TH1、TL1这些寄存器名称,以及TMOD、TCON等控制寄存器的位设置。 还要考虑用户可能的实际应用场景,比如用定时器1做延时或者波特率生成。这时候可能需要提到不同的工作模式,比如模式116位定时器,模式2是自动重装8位定时器,这些区别很重要。 另外,中断服务函数的部分也不能少,用户可能需要知道如何编写中断处理程序,所以给出示例代码会有帮助。但要注意代码的正确性,尤其是寄存器的操作和中断号的正确使用。 需要检查LaTeX格式是否正确,比如寄存器名称用斜体,公式用$...$包裹。例如,$2^{16} = 65536$这样的表是否正确。 可能用户还有更深层的问题,比如定时器1定时器0的区别,或者如何计算定时初值,这些可以作为扩展内容提及,但不要偏离主题。确保回答简洁,但覆盖主要知识点。 最后,验证信息是否准确,比如定时器1在模式1下的最大计数值,以及如何计算初值,避免错误。比如使用12MHz晶振时,1个机器周期是1微秒,这样计算时间间隔是否正确。 总结,回答需要包括概述、工作原理、配置步骤、应用示例和注意事项,结构清晰,逐步引导用户理解定时器1的使用方法。同时确保LaTeX格式正确,避免语法错误,使用中文表自然。</think>好的,我将从原理和应用角度逐步介绍51单片机中的定时器1(Timer1)。 ### 1. 概述 51单片机定时器1是内部硬件计时模块,属于8051架构核心功能之一。主要用途包括: - 精确时间延迟 - 事件计数 - 串口通信波特率生成(模式2) - PWM波形生成 ### 2. 工作原理 #### 核心寄存器 - `TH1`(高8位)和 `TL1`(低8位):组成16位计数器,地址分别为$8D_H$和$8B_H$ - `TMOD`(定时器模式寄存器):设置工作模式 - `TCON`(定时器控制寄存器):启停控制 #### 工作流程 $$ \text{计数脉冲} \rightarrow \text{TL1递增} \rightarrow \text{溢出触发中断} $$ ### 3. 配置步骤 #### 步骤1:设置工作模式(TMOD寄存器) | 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |---|---|---|---|---|---|---|---|---| | 功能 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 | | 定时器1 | ← 高4位 → | ← 低4位(定时器0)→ | 常用模式: - **模式116位定时器)**:M1=0,M0=1 - **模式2(8位自动重装)**:M1=1,M0=0 #### 步骤2:计算初值 设晶振频率为$f_{osc}$,所需定时时间为$t$,则: $$ 初值 = 2^{16} - \frac{t \times f_{osc}}{12} \quad (\text{模式1}) $$ 例:12MHz晶振,50ms定时: $$ 初值 = 65536 - \frac{0.05 \times 12\times10^6}{12} = 65536 - 50000 = 15536 = 3CB0_H $$ #### 步骤3:装入初值 ```c TH1 = 0x3C; // 高字节 TL1 = 0xB0; // 低字节 ``` #### 步骤4:启用中断 ```c EA = 1; // 总中断允许 ET1 = 1; // 定时器1中断允许 ``` #### 步骤5:启动定时器 ```c TR1 = 1; // 启动定时器1 ``` ### 4. 应用示例(模式1) ```c #include <reg51.h> void Timer1_Init() { TMOD &= 0x0F; // 清零高4位(定时器1设置) TMOD |= 0x10; // 定时器1模式1 TH1 = 0x3C; TL1 = 0xB0; EA = 1; ET1 = 1; TR1 = 1; } void Timer1_ISR() interrupt 3 { // 中断号3 TH1 = 0x3C; // 重装初值 TL1 = 0xB0; // 用户代码 } ``` ### 5. 注意事项 1. 模式2常用于串口波特率发生器 2. 使用外部时钟时(C/T=1),最高频率不超过$f_{osc}/24$ 3. 定时器与计数器模式通过`TMOD.6`位切换 4. 12T模式下每个机器周期=12个时钟周期 ### 扩展应用 - 配合串口实现115200bps通信(模式2自动重装) - 多定时器联动实现长时间定时 - 输入捕捉功能(需外部电路配合) 需要具体实现某个功能时,可以提供更详细的配置方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值