第6章 单片机的定时器/计数器

6.1 定时/计数器的结构与工作原理

6.2 定时器的控制

6.3 定时/计数器的工作方式

6.4 定时/计数器的编程和应用

6**.1定时/**计数器的结构与工作原理

**6.1.1定时/**计数器的基本原理

纯软件定时/计数方法:

定时------空循环预定周次,等待预定时间

计数------读取I/O口电平,统计变化次数

基本思路:由CPU统计状态变化次数,待预定结果出现后结束统计。

存在问题:占用过多CPU机时

单片机软硬件联合定时/计数方法:

定时器的本质是计数器**(对时钟脉冲计数),计数器则是对外来脉冲计数.**

定时器基本工作原理:

计数器基本工作原理:

**6.1.2定时/**计数器的结构

6**.2定时器/**计数器的控制

T0有4种工作方式,T1有3种工作方式,每种工作方式都有定时和计数2种方式,故共有14种组合关系。

6**.3定时/**计数器的工作方式

实例****1 设单片机的fosc=12MHz,采用T1定时方式1在P2.0脚上输出周期为2ms的方波。

**1.**查询方式

#include <reg51.h>

sbit P2_0 = P2^0;

main () {

TMOD = 0x10; //设置T1定时方式1(0001000****0B)

TR1=1; //启动T0

for(;;){

TH1= 0****xfc; //装载计数初值

TL1= 0****x18;

do{ } while(!TF1); //等待TF1溢出

P2_0 =!P2_0; //定时时间到P2.0反相

TF1= 0; //TF1标志清0

}

}

使用定时/计数器的步骤小结

(1)设置TMOD------确定定时/计数器的工作状态

使用T0还是T1?

采用定时模式还是计数模式?

采用工作方式0、方式1、方式2、方式3?

强调:TMOD的设置只能以字节形式给出

(2)计算计数初值------产生期望的定时/定数间隔

定时计数初值 a = 216- t×fosc/12

(t ≤65536 ms, fosc=12MHz时)

定数计数初值 a = 216- N

(N≤65536, 脉冲频率≤0.5MHz,fosc=12MHz时)

装载计数初值:

THx = a / 256 TLx = a / % 256

3)确定采用何种方式处理溢出结果

若是中断方式→中断初始化设置和中断服务程序:

若是查询方式------采用条件判断语句

4)启动定时器:

TR0 = 1 或 TR1= 1

5)进行定时或计数结束后的其它工作

6)为下次定时/计数做准备(清TFx标志+重装载计数初值)

若是中断方式,则无需软件清TFx标志位;

若是查询方式,需要软件清除TFx标志位。

2.方式2

实例****2采用T0定时方式2在P2.0口输出周期为0.5ms的方波(设fosc=12MHz)。

分析:计数初值TL0= ((256-250)*12/12)%256 = 0x06,

TMOD = 0x02

实例****3将第4章实例6 "计数显示器"采用的按键查询法,改为T0计数方式2 + 中断法,实现原有功能。

**【】**电路改进:将按键BUT由P3.7引脚改为T0引脚(P3.4)。

编程分析:将T0设置为计数器方式2,设法使其在一个外部脉冲到来时就能溢出(即计数溢出周次为1)产生中断请求。

初始化:

TMOD = 0000 0110B = 0x06(T0计数方式2)

a = 2 8 -- 1 = 255 = 0xff(计数初值)

ET0 = EA = 1(T0开中断)

实例3源程序:

(3)工作方式0

使用13****位的定时/计数器(THx7-0+TLx4-0)

实例****4 计算用T0方式0定时5ms的计数初值a(设fosc=12MHz)

解:计数初值a=213-5000×12/12=3192= 1100 0111 1000B

由于方式0的TL0高3位未用(一般填0) ,因此

a= 0110 0011 0001 1000 = 6318H

结果:TH0 = 0x63; TL0 = 0x18;

方式0与方式1的比较

4)方式3(仅T0有此方式)

6**.4定时/**计数器的编程和应用

使用方法:
• 定时器应用 ------ 用于定时控制,或作为分频器发生各种不同频率的方波;
• 计数器应用 ------ 用于外部脉冲统计或外部中断源扩充;
• 定时 / 计数器复合应用 --- 将定时与计数两种方式结合起来。

实例****5由P3.4口输入一个低频窄脉冲信号。当该信号出现负跳变时,由P3.0口输出宽度为500μs的同步脉冲,如此往复。要求据此设计一个波形展宽程序(fosc= 6MHz)。

实例5源程序

实例6源程序

实例7源程序

编程分析:

(1)根据定时/计数器工作原理,当GATE=TR0=1时,允许 引脚脉冲控制定时器的启停,即 =1可启动定时器, =0可关闭定时器。

测量未知脉冲宽度的思路是:利用查询方式找到①点的出现时刻→利用 信号的上升沿在②点启动T0定时方式1→利用 信号的下降沿在③点中止T0定时→取出反映了脉冲宽度的T0计数值。

(2)在C51中进行内存储器操作的方法是,定义指针变量并赋地址值→按指针变量对数据进行读/写操作。

(3)十六进制数转BCD码的方法是:从最低位开始进行模10计算→删去最末位(相当于整除10)→继续模10计算,直至整除10的结果为0。

实例8 源程序

实例8小结

1、测量未知脉冲宽度的方法------利用INTx引脚接入待测脉冲→设置Tx定时方式→ THx和TLx清零→利用查询语句辅助计时→用Tx计数值计算脉宽值;

2、C51中进行存储器操作的方法------定义指针变量并赋地址值→按指针变量对数据进行读写操作;

3、任意位数BCD码的拆解方法------从最低位开始反复进行模10计算→ 取模后删去最低位(整除10)→直至整除10的结果为0 ;

4、在Proteus中进行C51调试的方法------改变keil 的输出设置→形成omf格式编译文件→在Proteus中加载omf文件→利用类似汇编调试方法进行调试。

本章小结

相关推荐
axuan126511 小时前
16.【NXP 号令者RT1052】开发——实战-FlexPWM 输出
单片机·嵌入式硬件·mcu
墨辰JC1 小时前
基于STM32标准库的FreeRTOS移植与任务创建
数据库·stm32·嵌入式硬件·freertos
时光の尘2 小时前
【STM32】DMA超详细解析·入门级教程
stm32·单片机·嵌入式硬件·mcu·串口·dma·usart
chao1898442 小时前
基于TMS320F28069 DSP开发板实现RS485通信
单片机·嵌入式硬件
速易达网络2 小时前
C语言常见推理题
java·c语言·算法
沪漂的码农2 小时前
C语言队列与链表结合应用完整指南
c语言·链表
朱嘉鼎3 小时前
消费级MCU如何管理内存
单片机·嵌入式硬件
小龙报3 小时前
《算法通关指南:算法基础篇 --- 一维前缀和 — 1. 【模板】一维前缀和,2.最大子段和》
c语言·数据结构·c++·算法·职场和发展·创业创新·visual studio
R6bandito_4 小时前
STM32 HAL库原子操作编译问题解决指南
c语言·ide·经验分享·stm32·单片机·嵌入式硬件·mcu
Jerry丶Li4 小时前
三十、STM32的USART (串口发送+接收)
stm32·单片机·嵌入式硬件