宏晶科技 STC8G1K系列单片机教程「九」定时器

大家好,我是远方,这一章我们来学习下STC8G1K12的定时器/计数器。

手册上理论讲了一大推,我们直接进行总结:

1. STC8G 系列单片机有 3 个 16 位定时器/计数器,T0,T1,T2。

2. 本质是对脉冲进行计数,如果计数脉冲来自系统时钟,则为定时方式,如果计数脉冲来自单片机外部特定引脚,则为计数方式。

3. 有4 种工作模式:模式 0(16 位自动重装载模式),模式 1(16 位不可重装载模

式),模式 2(8 位自动重装模式),模式 3(不可屏蔽中断的 16 位自动重装载模式)。

我们今天以定时器T0举例,工作在模式 0,定时器1mS,控制LED亮1S灭1S。

宏晶科技 STC8G1K系列单片机教程「九」定时器/计数器

宏晶科技 STC8G1K系列单片机教程「九」定时器/计数器

TMOD寄存器,跟定时器T0有关的位是 T0_GATE T0_C/T T0_M1 T0_M0 。

T0_GATE:控制定时器0,置1时只有在INT0脚为高及TR0控制位置1时才可打开定时器/计数器0。 这里我们把T0_GATE写0,如果写1的话,T0受INT0脚和TR0一起控制。

T0_C/T:控制定时器0用作定时器或计数器,清0则用作定时器(对内部系统时钟进行计数),置1用作计数器(对引脚T0/P3.4外部脉冲进行计数)。我们这里是做定时器。所以写 0。

T0_M1/T0_M0:定时器定时器/计数器0模式选择 ,我们是工作在模式0,所以这二位写0。

TMOD &= 0xF0; //模式 0

宏晶科技 STC8G1K系列单片机教程「九」定时器/计数器

TCON 寄存器,跟定时器T0有关的是TR0位,TR0写0禁止定时器T0运行,写1允许定时器T0运行。我们这里要运行T0,所以写1。

TCON |= (1 << 4);

宏晶科技 STC8G1K系列单片机教程「九」定时器/计数器

宏晶科技 STC8G1K系列单片机教程「九」定时器/计数器

IE中断使能寄存器,跟定时器T0有关的是EA 和 ET0。

EA:总中断允许控制位。0:CPU 屏蔽所有的中断申请 1:CPU 开放中断 ,我们这里写1。

EA = 1;

ET0:定时/计数器 T0 的溢出中断允许位。 0:禁止 T0 中断 1:允许 T0 中断 ,我们这里需要用到定时器T0中断,所以写1。

ET0 = 1;

宏晶科技 STC8G1K系列单片机教程「九」定时器/计数器

宏晶科技 STC8G1K系列单片机教程「九」定时器/计数器

IP和IPH是优先级控制,我们这里只有一个中断,就设置为最高级。

IP |= (1<<1);

IPH |= (1<<1);

宏晶科技 STC8G1K系列单片机教程「九」定时器/计数器

AUXR铺助寄存器,T0x12是定时器0的速度控制位 。我们这里设置为12T模式。

AUXR &= ~(1 << 7);

宏晶科技 STC8G1K系列单片机教程「九」定时器/计数器

TL0和TH0是定时器T0的计数寄存器,这二个寄存器非常重要,我们定时多长时间,就取决于TL0和TH0的值。那我们定时1mS,该设置多少呢?在这个快速开发的年代,产品需迅速占领市场。我们以最简单的方式来做,借助于下载软件中的工具定时器计算器。大家以后在开发过程中,能简单就简单处理,不要什么都想搞明白,等搞明白了,黄花菜都凉了,竞争公司的产品都已经占领市场了。

宏晶科技 STC8G1K系列单片机教程「九」定时器/计数器

通过计算,得到

TL0 = 0x66;TH0 = 0xFC;

相关配置已经讲完了。开始写代码。

全部工程代码如下:

#include "STC8.H"

sbit LED = P1^1;

void TM0_Isr() interrupt 1

{

static unsigned int Cnt = 0;

Cnt++;

if (Cnt >= 1000) //1mS中断 0.001*1000=1S

{

Cnt = 0;

LED = !LED;

}

}

void main(void)

{

//使用内部时钟 烧录软件会帮我们配置好 如不懂 参考前面第3章系统设置学习。

// 烧录软件设置11.0592MHz为系统时钟。以后我们的学习都是这个时钟频率。

P_SW2 |= (1<<7);

CKSEL = 0x00; //选择内部 IRC ( 默认 )

P_SW2 &= ~(1<<7);

//配置端口 对于控制我们系统板的LED,配置准双向口和推挽输出都可以。

//只要是做为输出,我建议全部设置为推挽输出。

/*

PnM1.x PnM0.x Pn.x 口工作模式

0 0 准双向口

0 1 推挽输出

1 0 高阻输入

1 1 开漏输出

*/

P1M1 &= ~(1<<1); P1M0 |= (1<<1); //设置为推挽输出

P_SW2 |= (1<<7);

P1PU = 0x00;//禁止P1端口内部的 3.7K 上拉电阻

P1NCS = 0xFF; //禁止P1端口的施密特触发功能。

P_SW2 &= ~(1<<7);

AUXR &= ~(1 << 7);//定时器0为12T模式

TMOD &= 0xF0; //模式 0

TL0 = 0x66;//定时器1mS

TH0 = 0xFC;

TCON |= (1 << 4);//启动定时器0

IP |= (1<<1); //最高优先级

IPH |= (1<<1);

ET0 = 1;//允许定时器0中断

EA = 1;//总中断打开

LED = 1;//LED灭

while (1) ;

}

我们把程序编译好,烧录到板子里面,就会看到D2 LED一闪一闪亮晶晶。

宏晶科技 STC8G1K系列单片机教程「九」定时器/计数器

好了这章就讲到这里。希望大家多多关注我的原创文章。谢谢。


分享到:


相關文章: