例程2. TIMER0--使用时基定时器改造按键代码 --慕司板IAP

来源:互联网 发布:淘宝上在哪里买微信号 编辑:程序博客网 时间:2024/05/16 13:07

STC15系列的定时器0有四种工作模式,与STC89C52不同的是,芯片手册建议我们用16位自动重装模式即可,确实,这是一种比较方便的方式. 各个寄存器的介绍可以参考STC15的芯片手册。初始化函数是可以自动适应各个时钟频率的,至于系统时钟FOSC,在config0.h中定义:

void Timer_Init(unsigned int T_N100us)  //百微秒{    unsigned int T_100us;//  AUXR |= 0x80;                       //定时器0为1T模式  //33.1776MHz下最多1.97ms//  T_100us = 65536-FOSC/10000*T_N100us;    //1T模式    AUXR &= 0x7f;                       //定时器0为12T模式 //33.1776MHz下最多23.7ms    T_100us = 65536-FOSC/12/10000*T_N100us;     //自适应系统时钟,12T模式    TMOD = 0x00;                        //设置定时器为模式0(16位自动重装载)    TL0 = T_100us;                      //初始化计时值    TH0 = T_100us >> 8;    TR0 = 1;                            //定时器0开始计时    ET0 = 1;                            //使能定时器0中断    EA = 1;     }

下面我们就介绍本节的核心部分:使用定时器省去按键代码的Delay:
lkb.c中,定义一个静态变量i,去掉了Delay_ms(10):
d01

interrupt.c中,定时器0每10ms中断一次:
d02

这样,每隔10ms会进中断查询按键,一旦有按键被按下,Key_Scan()中的i++;开始执行,下一次进入中断,由于按键仍被按下,i是静态变量,满足if(i>=xiaodou+1),也就完成了按键的消抖,这就是使用定时器改造按键代码的原理。同理,可以分析interrupt.c中无源蜂鸣器不用Delay_ms()的原理.

同时,本程序也给出了一个定时器调度的实现方式,可以很好的摆脱Delay_ms()的困扰. 如程序中实现了1000ms改变一次LED的状态:
d03

后面的程序基本都是这个思想,这样我们的主程序完全没有成块的Dealy_ms级延时, 可以大大提高CPU的利用率。

原作于 2014年10月
CSDN发表于2016年4月
weifengdq

0 0
原创粉丝点击