【C51】单片机定时器介绍
来源:互联网 发布:游戏编程入门 pdf 编辑:程序博客网 时间:2024/04/28 20:32
【C51】单片机定时器介绍http://www.cnblogs.com/lulipro/p/5064099.html
标准51架构的单片机有2个定时器 :T0 和 T1,他们2个的用法几乎一样。下面主要讲T0定时器的用法。
初步认知
加法存储寄存器THx & TLx
sfr TL0 = 0x8A; // TL中的L是LOW的意思,代表低位,同理H代表HIGH高位。sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;
....if(TF0==1) //如果T0 溢出了{ TF0=0; //重新初始化 TH0 和 TL0 //说明过了一个溢出周期了}
2个重要的寄存器:TMOD 和 TCON
复位时所有位全 为 0
复位时所有位全 为 0
时钟周期和机器周期
那么,无论是定时器,还是计数器,每隔1个机器周期 ,加法存储器就1,代表时间经过了 12 x 1 / (11.0592x10^6) 秒。这就是我们衡量的基础依据。
为THx和TLx赋初始值
12 / (11.0592x10^6) s ----- 1 次
代码例子验证
#include<reg51.h>typedef unsigned int uint; /**************函数声明******************/void delay10ms(uint m) ;void delay1ms(uint m) ;/********************************/ /*****************************/sbit LED = P0^0; /*****************************/void main() { while(1) { LED = 1; delay10ms(100); // delay1ms(1000) LED = 0; delay10ms(100); // delay1ms(1000) }} void delay10ms(uint m) //溢出周期为10ms{ /******************** 使用到的寄存器(位) TH0 TL0 TCON: TR0 TF0 TMOD: ***********************/ uint count =0; TMOD = 1; //GATE = 0 C/T =0 M1 = 0 M0 = 1; 16位计数器 TL0 = 0 ; TH0 =220 ; TR0 = 1; for(;count<m;) { if(TF0 == 1) { TF0 = 0; TL0 = 0; TH0 = 220; ++count; } } TR0 = 0; //关闭定时器 }void delay1ms(uint m) //溢出周期为1ms{ uint count=0; TMOD = 1; //计时器0以16为存储计时器工作 TH0 = 252 ; TL0 = 102; TR0 = 1; for(;count<m;) { if(TF0==1) //发生一次溢出,也就是过了1ms { TF0=0; //溢出位清零,取消警报 TH0 = 252 ; //重新配置初始值 TL0 = 102; count++; //溢出次数加1 ,溢出1次是1ms,溢出t次就是t ms } } TR0 = 0;}
8位重装模式
8位重装模式是:只有TL0计数,TH0不变,他只为TL0提供初始值。当TL计数溢出后,TF0就为1,如果继续工作,TH0就把自己的值赋给TL0,再开始计数,如此循环下去。
上面些写了一个毫秒级的delay函数,下面用8位重装模式写一个控制微秒级别的函数。并控制P0.0的LED实现呼吸灯。
计算方法和上面一样,大家可以自己算
#include<reg51.h>typedef unsigned int uint;# define TRUE 1# define FALSE 0/**************函数声明******************/
void delay1ms(uint t);/********************************/sbit LED = P0^0;void main(){ int step = 0; int again = FALSE; while(1) { LED = again?0:1; delay1ms(step); LED = again?1:0;; delay1ms((500-step)); step+=1; if(step>500) { step =0; again = !again; } }}void delay1ms(uint m) //延时t微秒{ int count=0; TMOD = 2; TH0= 255 ; TL0= 255; TR0=1; for(;count!=m;) { if(TF0==1) { TF0=0; //自动重装 count++; } } TR0=0; }
值得注意的地方
我们应该尽量让溢出周期 越长越好。溢出周期为10ms 的优于 1ms 的。因为,在同样的延时时间下,如100ms,溢出周期为10ms 的 只需要溢出10次,为TH0 和 TL0重新赋值10次,而溢出周期为1ms的要溢出100次,为TH0 和 TL0重新赋值100次。减少溢出次数和赋值次数,可以减轻单片机的负担,提高定时的准确性。
/***************************************************/
欢迎转载,请注明出处:www.cnblogs.com/lulipro
为了获得更好的阅读体验,请访问原博客地址。
代码钢琴家
/***************************************************/
作者:代码钢琴家
出处:http://www.cnblogs.com/lulipro/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。为了获得更好的阅读体验,请访问原博客地址。限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
- 【C51】单片机定时器介绍
- C51单片机定时器
- C51单片机定时器/计数器控制字设置
- C51单片机 的定时器学习笔记
- C51单片机 AT89S52 定时器使用方法及总结
- C51单片机学习(二):中断系统和定时器
- C51单片机定时器T0,T1的常用基本设置
- C51单片机中断,寄存器,定时器,PWM原理,配置及使用
- C51单片机
- 89c51单片机的简单应用2——中断、定时器
- 单片机C51编程规范
- 单片机C51编程规范
- 单片机C51学习心得_01
- 单片机C51学习心得_02
- c51单片机寻址结构
- C51单片机学习记录
- C51单片机编程规范
- C51单片机中断定义
- char *name和char name[]的区别
- 我很菜
- spring-boot启动报错:This application has no explicit mapping for /error, so you are seeing this as a fal
- Qt 发送httpHeader
- ubuntu安装navicat
- 【C51】单片机定时器介绍
- Leetcode 200.Number of Islands(第三周作业)
- 读、写连续图片
- 安装完Oracle数据库,给scott账户解锁方法
- POJ 2187(计算几何+旋转卡壳法或暴力)
- 问号表达式与赋值符
- 利用递归方法求5!的阶乘
- learn English for ten years but still can not learn! Suggest you:then don't study(2)
- 关于NumPy函数库的基础学习(1)