#include <STC89C5xRC.H>typedef unsigned char u8;
typedef unsigned int u16;
sbit led = P2^0;
bit f,m;               //bit类型的变量取值只有0、1两种情况   通常作为标志位使用u8 Count5ms;void Delay10ms(void)//翻转一次 两倍时间
{while(m);while(!m);
}void Delay1s(void)
{while(f);while(!f);
}
void Timer0Init()         //基准1ms
{TMOD|=0X01;TH0=(65536-5000)>>8;     TL0=(unsigned char )(65536-5000);ET0=1;EA=1;TR0=1;
}void main()
{Timer0Init();while(1){led=!led;Delay1s();}
}
//定时器服务函数
void Timer0() interrupt 1          //5ms为基准
{TH0=(65536-5000)>>8;              //TH0=(65536-5000)/256;  TL0=(unsigned char )(65536-5000); //TL0=(65536-5000)%256;Count5ms++;m=~m;if (Count5ms == 100){Count=0;f=~f;}
}

--------------------------------------------------------------------------------------

关于定时器初值的计算
1、时钟周期,也称为振荡周期:定义为时钟脉冲的倒数,在单片机中也就等于晶振的倒数。
51单片机中把一个时钟周期定义为一个节拍(用P表示),2个节拍定义为状态周期(用S表示)
时钟周期是单片机中最小的时间单位。
eg:12M晶振的单片机,时钟周期=振荡周期=1/12 us。

2、机器周期:定义为完成一项基本操作所需要的时间,称为机器周期。
在计算机中,为了方便管理,把一条指令的执行过程分为若干个阶段,每个阶段去执行一项基本操作。
如:取指令,存储器读,存储器写等。
在51单片机中1个机器周期由6个状态周期组成,也就是12个时钟周期=12 x 1/12 us =1 us
定义机器周期是因为时钟周期时间太短,根本做不了什么。

3、指令周期:定义为执行一条指令所需的时间。
通常,包含一个机器周期的指令称为单周期指令,比如 MOV指令,CLR指令等。
包含两个机器周期的指令称为双周期指令。
另外还有四周期指令。

不要慌,其实我们这节课要用到的就一句话—— 在51单片机中1个机器周期由6个状态周期组成,也就是12个时钟周期=12 x 1/12 us =1 us

这里我们知道了一个机器周期的时间是1us,所以如果我们要延时1ms就是1000个机器周期;
可能大家我们刚开始了解定时器的时候都会与疑惑,为什么要用定时器这么麻烦的东西,自己用delay()慢慢调一个合适的参数就可以了。 其实如果深入了解定时器真的比delay() 强大太多我先列举几点:
1.就如上面所说用定时器定时1ms,这里就要注意了,这个1ms不是和delay延时1ms一样哦,这个1ms是精确的1ms哦,越往后学需要的定时就要求越高,所以定时器是一定要搞定的。

2.相比于delay计时,delay是要直接让单片机做空循环,死等。而定时器则是利用定时器的溢出间隔,如果时间上不够,可以在溢出中断中配合软件计数器来实现。 前者浪费cpu,后者更高效。

言归正传,现在来计算初值了,直接用例子说明,就比如用定时器0延时50ms

一言不合,先上代码

void main()
{TOMD|=0x01;         //设置TMOD工作方式寄存器的M0M1为01,对照表格即为定时器/计数器的4种模式中的16位定时器/计数器模式TH0=(65536-46080)/256; //装初值11.0592M晶振定时50ms数为46080TL0=(65536-46080)%256;EA=1;    //中断总开关ET0=1;   //开启定时器/计数器的中断允许位置为1TR0=1;   //return 0;
}
void T0_time() interrupt 1
{TH0=(65536-46080)/256;TL0=(65536-46080)%256;num++;if(num==20){num=0;}
}

首先一个机器周期=12一个时钟周期=12(1/晶振) 一般的51晶振频率为11.0592M

则一个机器周期= 1.085069444444444 us     单位是微秒

所以如果要定时50ms 则要50 000/1.085069444444444~=46080个机器周期

又因为TOMD|=0x01选择了16位的模式,就是TH0高八位 TL0低八位,所以最大到溢出就是65536故初值设为65536-46080即程序运行了大约46080个机器周期即50ms而后面的/256 %256就是划分低八位和高八位的

51单片机应用定时器实现精准延时函数的封装相关推荐

  1. 51单片机学习--定时器--中断--串口通信

    51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...

  2. (六)51单片机基础——定时器

    定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成. 定时器主要作用: 用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作. 替代长时间的Dela ...

  3. 【51单片机】定时器/计数器的工作原理和结构(一)

    [51单片机]定时器/计数器的工作原理和结构 回看下单片机中断系统内部结构: 分析内部中断触发: 先看图 TCON:和外部中断相比少了IT位设置触发方式 :1跳沿触发 0电平触发:此处我的理解是:就好 ...

  4. 关于用51单片机内部定时器实现时钟和闹钟功能的概述

    关于用51单片机内部定时器实现时钟和闹钟功能的概述 仅个人观点,欢迎大家相互学习和讨论 STC89C52单片机,内部配置了三个定时器,T0\T1\T2,其中T2定时器我们几乎不用,或者说很少用到.我们 ...

  5. NXP JN5169使用滴答定时器进行精准延时

    NXP JN5169使用滴答定时器进行精准延时(us.ms) 一.滴答定时器介绍 二.滴答定时器系统图 1.系统图介绍 2.单次触发模式 3.可重启模式 4.连续运行模式 三.系统时钟 1.系统时钟域 ...

  6. 51单片机用定时器0实现流水灯

    51单片机用定时器0实现流水灯的代码如下,用P1口接led灯,代码如下都有注释就不具体解释了,英语不怎么好,有的地方将就一下喽,本次主要讲一下P1口怎么赋值.原先写的都是用查表来移位的,个人感觉不怎么 ...

  7. 51单片机之定时器\计数器的工作原理

    51单片机之定时器\计数器的工作原理 定时器/计数器的结构: 何时处于计数器方式?何时处于定时器方式? TCON和TMOD特殊功能寄存器: 定时器/计数器工作方式: 方式0:13位的定时器/计数器 方 ...

  8. 51单片机计算定时器初值

    51单片机计算定时器初值 前言 理论分析 工作方式寄存器 TMOD GATE 门控位 C/T' 计数器模式和定时器模式选择位 M1 M0 工作方式选择位 定时器/计数器控制寄存器 TCON TCON补 ...

  9. 51单片机内部定时器/计数器实验

    51单片机内部定时器/计数器实验 一.实验内容 使用MCS-51内部定时/计数器,定时1秒钟,CPU运用定时中断方式,实现每1秒钟输出状态发生一次反转,即发光管每隔1秒钟亮一次(P1.7接LED). ...

最新文章

  1. 【运维囧事】Citrix Xendesktop 与 XML 集成时添加信任关系
  2. SQL笛卡尔积结合前后行数据的统计案例
  3. Codeup-问题 A: 装箱问题
  4. php 前往页面,PHP实现网页截图?
  5. 2022最新微信小程序商城搭建教程(附源码)
  6. 如何拦截Windows键而不屏蔽它参与的组合键(如win+d等)
  7. Ubuntu18.0.4深度学习环境搭建及相应软件安装(Update)
  8. itextpdf解决PDF合并的问题
  9. 造数神器mocker带你10分钟完成千万级别数据量的造数能力-高级用法篇
  10. 计算机刷新的作用,为何要刷新BIOS?刷新BIOS能启到什么作用?
  11. 如何在Word中的项目符号列表中自定义项目符号
  12. OJ 1168 改写整数
  13. 写php什么梗,什么是php(php是什么梗)
  14. HTML5期末大作业:动漫人物介绍网站设计——柯南(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 学生动漫网页设计模板下载
  15. 七月在线笔记之推荐系统
  16. 人大金仓适配mysql和oracle函数适配
  17. 数据分析项目-某加油站订单分析(SQL需求篇)
  18. 微信进化史(未完待续)
  19. C#关联自定义文件类型到应用程序并实现自动导入
  20. 单选框radio赋值 js 及Ajax,layui radio性别单选框赋值方法

热门文章

  1. Python3+pygame实现的90坦克大战
  2. miniconda配置镜像源
  3. 陶瓷压力传感器放大电路的设计
  4. C++ 大型舞会(分治)
  5. wERP SWOT分析方法
  6. C - Marbles Gym - 102348C
  7. 远程工具无法连接VMware虚拟机 (Network error: Connection timed out)
  8. 在线CAD-梦想云图Node.JS服务
  9. bugku No one knows regex better than me
  10. c语言课程设计图书馆管理系统例子,C语言课程设计图书馆管理系统源程序