单片机系列(定时器)-2

时间:2021-08-10 23:28:06

    在单片机里定时器也是常用了一个东西,相比的于常用的延时delay(),更精确而且用delay()有个不太好的地方就是它把主程序执行的时间占用了很多对功能上来说没有问题,但从执行效率来说,花费大量的时间才跑delay()这种循环,好像有点划不才一样。所以在main loop 这样的程序中尽量不要去写太多的delay().除非在串口中断发送数据时必要的延时。

头文件 time.h

#ifndef _timer_h_
#define _timer_h_

extern void delay(unsigned char i);
void Delay100ms();
void timer0_init(void);
void timer0_start(void);
void timer0_stop(void);

extern unsigned int timer_cnt;

extern void timer0_init(void);
extern void timer0_start(void);
extern void timer0_stop(void);
#endif


c文件 time.c

#include "../include/timer.h"
#include "../include/stc12c5a60s2.h"

unsigned int timer_cnt;

void timer0_init(void)
{    
    //20毫秒@18.432MHz
    AUXR &= 0x7F;        //定时器时钟12T模式
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0x00;        //设置定时初值
    TH0 = 0x88;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 0;        //定时器0开始计时
    ET0 = 1;
}

void timer0_start(void)
{
    TR0 = 1;
}

void timer0_stop(void)
{
    TR0 = 0;
    timer_cnt = 0;
}


定时器中断interrupt.c

#include "../include/stc12c5a60s2.h"
#include "../include/timer.h"


void timer_0_isr(void) interrupt 1
{
    TF0 = 0;
    timer_cnt++;  
}


一般的话我用这个timer_cnt 这个变量来做成time_clik来用,复用成多个定时器,毕竟定时器就一两个嘛。