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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值