第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文件→利用类似汇编调试方法进行调试。

本章小结

相关推荐
一路往蓝-Anbo几秒前
第 2 篇:单例模式 (Singleton) 与 懒汉式硬件初始化
开发语言·数据结构·stm32·单片机·嵌入式硬件·链表·单例模式
嵌入你的世界12 分钟前
cmBacktrace 实现原理解析:从 HardFault 现场到源码回溯
stm32·单片机·嵌入式硬件·cmbacktrace
BackCatK Chen18 分钟前
浅聊:STM32 2026 年核心技术及选型建议
stm32·单片机·嵌入式硬件·csdn年度技术趋势预测
心态还需努力呀19 分钟前
【鸿蒙 PC 命令行适配】c-ares 在鸿蒙 PC 上的移植与交叉编译实战(可复现指南)
c语言·开源·harmonyos·鸿蒙·openharmony
代码无bug抓狂人33 分钟前
(蓝桥杯省B)R格式
c语言·蓝桥杯
【赫兹威客】浩哥33 分钟前
【赫兹威客】ESP32点灯实验
单片机·嵌入式硬件·esp32
羽获飞34 分钟前
从零开始学嵌入式之STM32——4.使用寄存器点亮一个LED灯--代码优化
stm32·单片机·嵌入式硬件
养军博客40 分钟前
C语言五天速成(可用于蓝桥杯备考)
c语言·数据结构·算法
Yupureki41 分钟前
《算法竞赛从入门到国奖》算法基础:搜索-BFS初识
c语言·数据结构·c++·算法·visual studio·宽度优先
卜锦元1 小时前
Mac 上无痛使用 Windows 双系统的完整实践(Intel 或 Apple M芯片都可以)
windows·单片机·macos·金融·系统架构