STC15W408AS单片机定时器计数器简介

控制/MCU

1878人已加入

描述

在日常生活中,我们经常使用灯光来传递某种信息,如交通指示灯、报警灯等。这些灯光的变化是由控制电路中单片机来控制的。

下面我以利用STC单片机来的定时器来控制LED灯有规律的闪动来向大家介绍其中的控制原理。

一、STC15W408AS控制LED灯电路

STC15W408AS

二、定时器工作原理

定时器是一种计时的装置。是于1876年由英国外科医生索加申请的一项专利,定时器的出现给我们的生活带来了巨大的改变。起初,我们使用沙漏来对时间进行确定;在定时器出现的初始阶段,它利用机械钟带动 开关 来达到控制煤气阀 门 的目的,但需每周对其上一次发条;1918年后,使用电钟进行计时,使得定时器无需再上发条;

在单片机中,我们利用单片机中的计数器对单片机的脉冲进行计数来定时。也就是当计数脉冲个数达到一定的数时,就发生一次中断,然后又重新开始计数,再次达到这个数时,又进行一次中断。如此不断重复这个过程,直到关闭定时器为止。

三、STC15W408AS单片机定时器计数器简介

STC15W408AS只有定时器0和定时器2,工作工作位定时器或者计数器模式。定时器/计数器的核心部件是一个加法计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲,计数值加1。以定时器0为例,当定时器/计数器T0工作在定时模式时,特殊功能寄存器AUXR中的T0x12决定是系统时钟/12还是系统时钟/1后让T0进行计数。

定时器/计数器0有4种工作模式:模式0(16位自动重装载模式),模式1(16位不可重装载模式),模式2(8位自动重装模式),模式3(不可屏蔽中断的16位自动重装载模式)。

STC15W408AS单片机定时器计数器0相关寄存器

STC15W408AS

四、定时器/计数器0控制寄存器TCON

TCON为定时器/计数器T0的控制寄存器,同时也锁存T0、溢出中断源和外部请求中断源等,TCON格式如下:

STC15W408AS

TF0:T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置“1”TF0,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清0。

TR0:定时器T0的运行控制位。该位由软件置位和清零。当GATE(TMOD.3)=0,TR0=1时 就允许T0开始计数,TR0=0时禁止T0计数。当GATE(TMOD.3)=1,TR0=1且INT0输入高电平时,才允许T0计数,TR0=0时禁止T0计数。

五、定时器/计数器工作模式寄存器TMOD

定时和计数功能由特殊功能寄存器TMOD的控制位C/T进行选择,TMOD寄存器的各位信息如下表所列。

STC15W408AS

六、辅助寄存器AUXR

STC15系列单片机 1T 的8051单片机,为兼容传统8051,定时器0 , 复位后是传统8051的速度,即12分频,这是为了兼容传统8051。

STC15W408AS

七、定时器T0的中断控制寄存器IE

STC15W408AS

八、定时器T0的中断控制寄存器IP

STC15W408AS

九、定时器0控制下的LED闪亮程序

#define FOSC 11059200L

#define T1MS (65536-FOSC/1000)  // 1 T模式

#define BIT0 0x01

#define BIT1 0x02

#define BIT2 0x04

#define BIT3 0x08

#define BIT4 0x10

#define BIT5 0x20

#define BIT6 0x40

#define BIT7 0x80

#define TRUE 1

#define FALSE 0

#define Pin_LED P32

#define Pin_LED_M1  P3M1

#define Pin_LED_M0 P3M0

#define Pin_LED_BIT BIT2

#define PinLed_High() Pin_LED=1

#define PinLed_Low() Pin_LED=0

#define BOOL unsigned char

#define UINT unsigned int

UINT mTimer500ms=0;

void PinLED_DirOut(void);

void Timer0_Init(void);

BOOL bLedon=FALSE;

void main(void)

{

    PinLED_DirOut();

    PinLed_High();

    Timer0_Init();



    while(TRUE)

    {

    }  

}

void PinLED_DirOut(void)

{

    Pin_LED_M1 &=~Pin_LED_BIT;

    Pin_LED_M0 |=Pin_LED_BIT;  

}

void Timer0_Init(void)

{

    AUXR |= 0x80;   //定时器0为1T模式

    TMOD = 0x00;    //设置定时器为模式0(16位自动重装载)

    TL0 = T1MS;    //初始化计时值

    TH0 = T1MS > > 8;

    TR0 = 1;     //定时器0开始计时

    ET0 = 1;     //使能定时器0中断

    EA = 1;

}

// 定时中断函数:定时1ms

void Timer0_ISR (void) interrupt 1

{

    mTimer500ms++;

    if(mTimer500ms >=500)

    {

        mTimer500ms=0;      

        if(bLedon)

        {

            bLedon=FALSE;

            PinLed_High();          

        }else{

            bLedon=TRUE;

            PinLed_Low();       

        }         

    }  

}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分