例程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):
interrupt.c中,定时器0每10ms中断一次:
这样,每隔10ms会进中断查询按键,一旦有按键被按下,Key_Scan()中的i++;开始执行,下一次进入中断,由于按键仍被按下,i是静态变量,满足if(i>=xiaodou+1),也就完成了按键的消抖,这就是使用定时器改造按键代码的原理。同理,可以分析interrupt.c中无源蜂鸣器不用Delay_ms()的原理.
同时,本程序也给出了一个定时器调度的实现方式,可以很好的摆脱Delay_ms()的困扰. 如程序中实现了1000ms改变一次LED的状态:
后面的程序基本都是这个思想,这样我们的主程序完全没有成块的Dealy_ms级延时, 可以大大提高CPU的利用率。
原作于 2014年10月
CSDN发表于2016年4月
weifengdq
0 0
- 例程2. TIMER0--使用时基定时器改造按键代码 --慕司板IAP
- LPC1768之定时器TIMER0
- 定时器——timer0和timer0
- 例程4. SPI_LCD -- 慕司板IAP
- PWM定时器timer0学习笔记
- AB1601定时器timer0,timer1简介
- EFM32的定时器使用例程
- ARM学习之定时器Timer0实验
- TQ2440裸机中断(定时器TIMER0中断)
- PIC16F1628 Timer0 定时器 控制IO翻转
- PIC12系列 TIMER0定时器初始化设置
- [RTT例程练习] 4.1 定时器基本使用
- 独立按键与定时器的使用练习
- 【蓝桥杯单片机组】(4)Timer0/1 定时器
- 定时器模块改造
- C#使用指针的代码例程
- S3C6410 按键驱动(四) --- 内核定时器的使用
- 内核定时器的使用和按键防抖原理
- 对R语言因子的浅读
- 百度云分享文件自己设置密码
- c++ 初学者写的图书馆管理系统 多多指教
- 幂运算-分治法
- [Guava]——集合操作
- 例程2. TIMER0--使用时基定时器改造按键代码 --慕司板IAP
- JAVA泛型擦除
- POJ2718-Smallest Difference
- Problem 瞎子与瘸子的故事 bfs + 优先队列
- pybrain 的安装及报错 ImportError:No module named structure的解决方案
- javac编译servlet类出现的一系列问题及分析解决(javac编译servlet找不到javax.servlet.*包的问题)
- Java数据类型转换汇总 (持续更新)
- 文章标题@property生成的是私有变量,即,实在implementation 中生明的
- 关于python 的url_encode关于的嵌套字典类型变量的编码扩展