写在前面

1.本篇博文旨在帮助那些像我一样刚入门51单片机,如果你对定时器有一定了解,但是其中的的工作方式不能理解,那么这篇文章很适合你,如果你是大神的话…直接绕行吧……

2.我在学习的过程中由于知识上的不足很多的讲解看不懂,在翻找了许多资料真正理解之后,打算以一种简单易懂的方式进行解释,这是一份很 详尽基础 的讲解手册。

3.全文以定时器0为例,定时器1的用法与其相同。

4.由于是讲定时器实现原理,文章文字显得较多,不过都是很简单的文字,只要认真看都能看得懂。

知识填充

虽然看懂这篇博文不需要太多的知识储备,但是在这里还是做一个简单的知识普及,便于下文的讲解

  1. 4位二进制数可以和1位十六进制数相互转化,如二进制数1111转化为十六进制是0xf; 二进制转化11111111转化为十进制是255。
  2. 51单片机的时钟周期由晶振决定,假定晶振频率是12M,那么它的时钟周期为1/12M,机器周期是12倍的时钟周期,即为12/12M,文章以12M晶振为例讲解。

方式一

工作原理

采用方式1时,计数位数时16位,由TH0作为高八位,TL0 作为低八位,组成16位加一计数器,在TR0 置1后单片机开始计时,每经过一个机器周期单片机输出一个脉冲使定时器加一,加到16位全为1时会溢出,使TF0 置1,利用此性质可以去执行相应的功能,TF0置1是一个信号。
若 TH0 和 TL0 的初值都为0(即整个定时器的值为0000000000000000),当16位全为1时,单片机一共输出了655361个脉冲,时间经过了65536*12/12M秒钟即为65.536ms。

初值的设定

那么问题来了,我们想要利用的时间都是1s,2s这种,而不是65.536ms,如果能让开始计时到TF0 置1这个时间变成50ms这种,就能够通过几次计数溢出达到计时1s钟的目的,这就到了初值的计算。
由之前的分析可知,单次计时最长为65.536ms,以单次定时50ms(0.05s)为例,需要20次可以定时1s钟。假设开始计时时16位定时器的初值为x,由于单片机定时固定到达65536溢出,那么(65536-x)*12/12M = 0.05,可计算得到x = 15536。化为16进制为0x3cb0。那么TH0 = 0x3c, TL0 = 0xb0;2

代码实现

定时1s钟的代码如下:

#include<reg52.h>void main()
{unsigned char cnt = 0;TMOD = 0x01;  //设置定时器为工作方式1TH0 = 0x3c;TL0 = 0xb0; //设置初值TR0 = 1; //打开定时器开关,开始定时while(1){if(TF0 == 1){TF0 = 0;TH0 = 0x3c;TL0 = 0xb0;//单次计时完成后,TH0 与TL0 的值均为11111111,所以需要对他们重新赋初值cnt++;if(cnt == 20){cnt = 0;//此处填写定时完成时要执行的功能  }}}
}

方式二

工作原理

方式2是自动重装初值的8位计数方式,在本质上是与方式1一样的。在工作方式2中,TH0 只起到为TL0 重装初值的作用,并不参与计数。当TL0 计数到全为1时再有一个脉冲就会触发溢出,TL0 的溢出不仅使TF0 置1,TF0置1是一个信号 ,而且将TH0内容重新装入TL0 ,TH0 内容由代码设置,重装时值不变,然后进行新一轮的定时 ,这就是所谓方式2自动重装初值。

初值的设定

方式2的初值的计算方式和方式1相同,与方式1不同的是:由于方式2只有TL0 计数,最多可以记256个脉冲(8位从全0编为全1),单次定时最长也就只有0.256ms(方式1为65.536ms)
依然以定时1s钟为例,单次定时时间为0.2ms,设初值为x,(256-x)*12/12M = 0.2**10-3(0.2乘10的-3次方,由于格式问题只能打两个星号……),解得x = 56,化为十六进制为0x38,则TH0 和TL0 的初值均为0x38;

代码实现

#include<reg52.h>void main()
{unsigned int cnt = 0;TMOD = 0x02;TH0 = 0x38;TL0 = 0x38;TR0 = 1;if(TF0 == 1){TF0 = 0;//TH0 = 0x38;//TL0 = 0x38; 这两处由于是自动重装初值,所以单次定时结束后不需要再赋值cnt++;if(cnt == 5000){cnt = 0;//单次定时0.2ms,5000次后定时1s//此处填写定时完成时要执行的功能}}
}

效果跟方式1相同3,经过笔者实验方式2更精准一些?咱也不知道,咱也不敢问


  1. 16位全为1的二进制数的值为216 = 65536 ↩︎

  2. 计算初值还有另外一个方法,就是以产生的脉冲次数(频率)为中心。
    单片机时间频率为12M,机器频率为12M/12,即定时1s钟定时器计数的个数为12M/12(我在这里卡住很长时间,不太好理解),但是方式1单次计数个数最多为65536,远远达不到12M/12次。
    计时1s单片机计数个数为12M/12.那计时50ms(0.05s)计数个数就应该是(12M/12)/ 20 = 50000,那初值就应该是15536。 ↩︎

  3. 不知道读者有没有注意到,在定义cnt变量时,方式1采用的是unsigned char cnt = 0; 而方式2采用的却是unsigned int cnt = 0; 这里涉及到了数据结构的问题,我会在其它博文里提到,这里只需简单理解为方式2中cnt的值过大,unsigned char型容不下就行了。 ↩︎

51单片机定时器工作方式1、2原理详解相关推荐

  1. c语言 定时器作用,单片机定时器的作用及使用方法详解

    单片机定时器的作用及使用方法详解 单片机定时器在单片机的功能是很重要的,它一般被用作定时功能,来做定时检测.定时响应和定时控制,并且可以产生毫秒宽的脉冲信号来驱动步进电机.计时和计数的最终功能是通过计 ...

  2. 51单片机串口通信发送以及接收代码详解1

    #include <reg51.h> //实验现象:单片接收电脑发送的字符串,并发回给PC端的代码.//函数声明 void uart_init(void); void uart_seng_ ...

  3. 51单片机串口通信发送以及接收代码详解2

    #include <reg51.h> //实验现象:在电脑端没按下发送的时候,单片一直给电脑发送aaa字符串: //实验现象:在电脑端按下发送的时候,结束字符串aaa的发送代码,执行单片接 ...

  4. 学习51单片机串口工作方式及应用

    1.串口控制寄存器SCON SM2:多机通信控制位 REN:允许接收控制位 TB8:发送第九位数据 RB8:接收第九位数据 TI:发送中断标志位 RI:接收中断标志位 2.电源控制寄存器PCON 当S ...

  5. 51单片机c语言编程的头文件,51单片机编程的头文件reg51.h详解

    我们在用c语言编程时往往第一行就是头文件,51单片机为reg51.h或reg52.h,51单片机相对来说比较简单,头文件里面内容不多,像飞思卡尔.ARM系列的单片机头文件往往内容就非常多,尽管如此,对 ...

  6. 51单片机之蜂鸣器模拟钢琴(代码详解)——起风了

    目录 前言 正文 乐理 程序 补充 前言 最近心血来潮,想要用蜂鸣器播放音乐(全损音质),于是最初的想法诞生了,但是我总不能每次想听歌都敲一遍蜂鸣器的代码吧,有没有什么办法只需要敲一遍的代码便可以实现 ...

  7. 51单片机定时器(T0/T1)的使用与配置流程

    第一步:配置工作方式寄存器-TMOD TMOD寄存器的字节地址为89H,不能位寻址.一般采用整体赋值的方式进行配置:如:TMOD=0x01 // 0000 0001 GATE=0,定时器仅受TCON寄 ...

  8. 51单片机定时器初值计算以及初值计算软件

    51单片机定时器初值计算以及初值计算软件 不想搞懂计算原理的直接跳到文章末尾,使用初值计算软件来解决有关初值计算的问题 51单片机定时器初值计算部分 时钟周期,也称为振荡周期:定义为时钟脉冲的倒数,在 ...

  9. 51单片机定时器/计数器(定时器中断)

    51单片机定时器/计数器(中断系统:定时器中断) 实现功能 通过定时器终端控制LED灯 D1 间隔一秒闪烁 单片机型号:STC89C52 定时器介绍 1.51单片机定时器原理 定时器实质上就是一个加1 ...

最新文章

  1. 一个5年运维工程师的新年回首
  2. 用JSP实现学生查询
  3. element-ui中表单验证rules
  4. oracle实时分析,Oracle Exalytics 大幅提升实时分析洞察力
  5. golang调用java的函数_大话golang性能分析(一):profile基本原理
  6. springboot导包显示不存在_BOOT项目依赖另外一个模块的包,开发的时候都正常,执行clean package打包成jar时却提示依赖的模块包不存在。...
  7. 用 Python 分析今年考研形势
  8. tushare数据存入mysql代码_下载股票的历史日交易数据并存入数据库——基于tushare...
  9. 为什么农村出来的大学生大多混得比较差?
  10. 交什么样的朋友有什么样的天
  11. LINUX下载编译libreadline
  12. 1一9数字行书写法_阿拉伯数字怎么写好看(数字1到10的漂亮手写体)
  13. 我的团长我的团第二十七集
  14. 渗透测试-HTTP Strict Transport Security
  15. vm连接服务器桌面,Vmware之使用Windows自带的远程桌面连接
  16. 数字信号处理专题(1)——DDS函数发生器环路Demo
  17. 计算机系统C盘会还原,重装系统c盘东西还在吗|电脑重装系统c盘文件会被清空吗...
  18. MATLAB傅里叶级数分解极其图像
  19. 代理记账公司是如何进行缴税的?
  20. feifeicms 火车头文章采集 自动图片本地化

热门文章

  1. win10安装PL2303_Prolific_DriverInstaller_v1.5.0驱动
  2. 屏幕后期处理之:Sobel算子实现边缘检测
  3. 字符编码问题三个不可见的字符(0xEF-0xBB-0xBF,即BOM)
  4. 表达母亲节快乐的c语言编程,表达母亲节快乐的祝福语锦集38句
  5. 云计算笔记一 云计算系统的产生
  6. 告诉你,如何成就DBA职业生涯
  7. 用全站 CDN 部署 Discourse 论坛
  8. 童继龙的ERP顾问成长感悟
  9. myeclipse10下载问题
  10. 制作一枚有针对性的fork炸弹