STC8G1K08A定时器的使用(原理+代码+完整工程)

一、定時器的原理

在前面的例子中,我們使用DelayMs()实现延时.那除此之外,有没有其他方法进行精确的定时呢?
有的,那就是Timer定时器.

定时器的要素: 时钟源,初值
如图是一组标准的方波信号,假设它的周期5ms(频率200Hz). 这样的方波一直在不断地产生,源源不断,无始无终.
方波信号
那我们若想定200ms的时间,那要数多少个方波?
答案是: 40.
200ms/5ms= 40. 当我们数到40个方波时,定时时间刚好200ms.

注意:

  • 定时时间最好是频率的"整数分之一",免得出现误差!
  • 初值的计算还需要结合定时器的位数进行计算: 初值=2^位数-计时次数

二、STC8的定時器

STC8G内置5个16位定时器. 它们可以实现定时,计数,脉宽测量等功能.
通过配置不同的工作模式,可以实现8位/16位的切换.
以下,我们重点介绍Timer0定时器的模式0(16位自动重装载模式).
从图中我们可以看出:

  • A部分: 选择时钟源的频率
  • B部分: 选择定时/计数方式
  • C部分: 选择打开/关闭定时器
  • D部分: 设置定时器的初值
  • E部分: 选择是否打开时钟输出

模式0(16位自动重装载模式

假设我们单片机的时钟频率是24MHz,需要定时10ms.那么我们需要进行如下计算:

  • A部分: 设置AUXR.7 = 0, 定时频率=时钟频率/12=24MHz/12=2MHz
    – 每个脉冲的时间 = 1/2MHz = 0.0005ms
  • B部分: 设置C/T = 0,定时模式
  • C部分: 设置GATE=0,TR0=1,打开定时功能
  • D部分: 设置初值,计时次数=10/0.0005=20000
    – 由于是16位定时器,初值=2^16-20000=65536-20000=45536
    – 进制转换: 45536 (十进制)=0xB1E0 (十六进制)
    – TH0 = 0xB1, TL0 =0xE0
  • E部分: 设置T0CLKO=0,无需输出定时频率

在这里插入图片描述

三、关键代码

void main()
{


    AUXR &= 0x7F;			//定时器时钟12T模式  
	TMOD &= 0xF0;			//设置定时器模式: 模式0,16位自动重装载

	TL0 = 0xE0;				//设置定时初始值 定时时间10ms
	TH0 = 0xB1;				//设置定时初始值

	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断

	EA = 1;	//打开总中断
	
    while (1);
}

四、实验现象

下载程序后,LED看起来常亮.(难度不应该是闪动吗?)
在这里插入图片描述
使用示波器看LED引脚,可以发现引脚电平高低变化.测量高电平时间,刚好是10ms.
LED常亮是由于人眼的余晖效应.
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值