51单片机-定时器工作模式2

发布者:哈哈哈33最新更新时间:2021-10-14 来源: eefocus关键字:51单片机  定时器 手机看文章 扫描二维码
随时随地手机看文章

1.工作模式2的使用


这里我们顺便讲解一下定时器0的工作模式2,也就是使用“小试管”的方式,TMOD的初始化就为“TMOD=0x02;”。


我们知道工作模式2的最长溢出时间仅为256*(12/11059200)=0.000277秒=277微秒。


我们想实现间隔51ms的流水灯实验该怎么做,首先我们定义一个变量cnt用来记录每次的溢出次数,然后我们的定时时间为51微秒(因为最大定时只有278微秒),cnt记录的值等于1000的时候,证明时间已经过去了51ms,于是再去执行流水灯的任务。


我们已经知道工作模式2是不需要在溢出之后再填充初始值的,比如我们定时的时间为51微秒,那么计算出“距离溢出的刻度”就为47(实际计算出的是47.0016,所以定时为51微秒误差就不大)。


所以给TL0赋初值为256-47=209=0xD1。那么TH0也是给初值为0xD1,这是保证每次TL0溢出之后新的初始值是等于TH0的值的,所以定时器工作模式2又叫做8位自动重装载模式。相关概念还需读者再去另外学习这些理论知识。



2.工作模式2的代码


#include  

#include //详见第六章第8讲

 

void main()

{

    u8 i;

    u16 cnt;

    LED_Init();   //初始化LED硬件模块 

    TMOD = 0x02;  //设置定时器0为工作模式2

    TH0  = 0xD1;  

    TL0  = 0xD1;  //定时51us

    TR0  = 1;     //启动定时器0

     

    while(1)

    {

        if (TF0 == 1)    //每隔51us就可以进入一次这个if语句

        {

            TF0 = 0;     //定时器0溢出后,清零中断标志

            cnt++;       //记录溢出次数

        }   

        if(cnt>=1000)    //时间过去了51ms

        {

            cnt=0;   

            P0=~(0x01<            i++;

        }      

        if(i>=8)i=0;

    }

}


大家对照上一讲的工作模式1的代码会发现,工作模式2在while循环中不再出现TH0和TL0的身影,TL0每次溢出之后,初值又变为TH0初始时候的值了,所以定时时间在while循环之前就已经决定好了。


大家可以尝试着把“if(cnt>1000)”里的1000改为10000就是间隔510ms的流水灯了。


往后我们做的题目定时时间一般最少都是要定时1毫秒以上,所以用工作模式1的机会会很多,而工作模式2在我们前期教程里会很少运用,等学到串口通信相关知识时我们再重拾这个知识点。


关键字:51单片机  定时器 引用地址:51单片机-定时器工作模式2

上一篇:51单片机-定时器简单运用
下一篇:51单片机-定时器中断函数的使用

推荐阅读最新更新时间:2024-11-12 11:11

(STC12 默认12分频)定时器用法
#include reg52.h #define uchar unsigned char #define uint unsigned int uchar num,LED; void TR0_()interrupt 1 { TMOD=0x01; //定时器0的工作方式1 TH0=(65535-50000)/256;//计时50ms一次 TL0=(65535-50000)%256; num++; } void main() { TMOD=0x01; //定时器0的工作方式1 TH0=(65535-50000)/256; TL0=(65535-50000)%256; EA=1; //开总中断 ET0=1; //开定时器0 TR
[单片机]
定时器的应用---中断方式---让8个LED灯,左右各4个来回亮
/*************************** 中断方式 是主程序专注于其他的事情, 待定时器中断时才执行中断子程序。 *****************************/ #include reg51.h #define LED P1 #define count 50000 // 50000 * 1us = 0.05s 机器周期1us 12MH晶振 #define TH_M1 (65536-count)/256 //TMOD 寄存器 方式 1 , 2^8 = 256 THX跟TLX都是8位 除以256取商赋值高4位 #define TL_M1 (65536-count)%256 //将余数
[单片机]
<font color='red'>定时器</font>的应用---中断方式---让8个LED灯,左右各4个来回亮
51单片机控制两个步进电机
/*----------------------------------------------- 步进电机控制 ------------------------------------------------*/ #include reg52.h #define KeyPort P3 #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换 sbit LATCH1=P2^2;//定义锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code dofly_DuanMa ={0x3f,0x06,0x5b,0x4f,0x66,
[单片机]
定时器的输出比较模式产生的PWM波的频率计算
定时器的输出比较模式产生的PWM波的频率计算的公式:72M/((2*(arr+1))*(psc+1) ) 比如设置: PWM_Init(1000-1,72-1); (PWM_Init(arr,psc);) 则每路PWM频率为500Hz 。 PWM_Init(arr,psc) { TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; }
[单片机]
STM8S103之tim4普通定时器
本文以STM8S103F3P6编程为例,介绍STM8S103F3P6定时器4计时驱动PB5脚 电脑平台:Windows7 64位旗舰 编译软件:IAR 硬件平台:STM8S103F3P6 1.系统时钟初始化为内部16M CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //时钟 初始化时钟为1分频 16M 2.初始化定时器4设置PB5为输出 void Init_Timer4(void) { GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST); //初始化IO口 TIM4_DeInit()
[单片机]
51单片机IO口模拟串口通讯C源程序
#include reg51.h sbit BT_SND =P1^0; sbit BT_REC =P1^1; /**********************************************    IO 口模拟232通讯程序    使用两种方式的C程序 占用定时器0    **********************************************/    #define MODE_QUICK    #define F_TM F0    #define TIMER0_ENABLE TL0=TH0; TR0=1; #define TIMER0_DISABLE TR0=0;
[单片机]
51单片机定时器与计数器
1.0 1.0.1定时器 (1)51单片机的定时器是一个内部外设。 (2)定时器相当于CPU的一个“闹钟”。 (3)定时器是用计数器来实现的。 1.0.2计数器 (1)计数器可以计数外部脉冲的个数. (2)脉冲:(个人理解)单片机中一个低电平跳变成高电平在回到低电平的这么一个过程就称为一个脉冲。 1.0.3定时器是如何工作的 (1)第一步:先设置好定时器的时钟源(AT89C51单片机的时钟源只有一个不需要设置) (2)第二步:初始化时钟相关寄存器 (3)第三步:设置定时时间(计数个数) (4)第四步:设置中断处理程序(定时器总是与中断相互配合使用) (5)第五步:打开定时器 (6)第六步:定时器计数到后产生中断,然后执行中
[单片机]
GD32开发实战指南(基础篇) 第8章 定时器
开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK 1 PWM输出的工作原理 脉冲宽度调制(PWM) ,是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。 GD32 的定时器除了 TIMER5 和 6(基本定时器)。其他的定时器都可以用来产生 PWM 输出。 每个定时器有四个通道,每一个通道都有一个捕获比较寄存器,,将寄存器值和计数器值比较,通过比较结果输出高低电平,便可以实现脉冲宽度调制模式(PWM信号)。 在上一节,讲解了定时器
[单片机]

推荐帖子

如何从单片机将程序上传到电脑?
如何从单片机将程序上传到电脑?如何从单片机将程序上传到电脑?是上传附件吗?还是复制?回复楼主prince11的帖子就是将已经下载到单片机中的程序再从单片机上载到电脑。回复沙发小志的帖子这种应用没听说过,楼主做的什么项目啊,回复板凳prince11的帖子
prince11 单片机
有谁有用过Verilog写can总线模块的吗?
现在正在学习FPGA,然后现在也不知道该具体做点什么出来,感觉我以后可能会用到can总线,所以就想是不是能用Verilog来编写出can总线的实现功能模块,即为以后的学习打下基础,又同时学习了Verilog的使用,一举两得。可是没有个头绪,不知道是否有人写过相关的,希望大家一起分享一下经验,共同在FPGA的学习过程中一起进步!有谁有用过Verilog写can总线模块的吗?为啥要用fpga实现就是想着练习一下Verilog,然后再未来学习中可能会用到can总线。所以就想这么做回复沙发
奔跑的蜗牛 FPGA/CPLD
quartus有直接可以调用的随机数函数吗?
如题\0\0\0eeworldpostqqquartus有直接可以调用的随机数函数吗?有,不能综合,只在tb中用可以用LFSR产生伪随机数楼上有答案,当然也可以使用PRBS码来产生伪随机码
通通 FPGA/CPLD
【2.6TFT】NBCTFT2.6_V2.2使用手册
NBCTFT2.6_V2.2使用手册【2.6TFT】NBCTFT2.6_V2.2使用手册了解下
Sur 微控制器 MCU
请教大神~如何在电子产品的固件上写入产品序列号
想请教各位大神一个关于产品序列号的问题~我们想给产品设置序列号,让产品联网后,后台能自动读出序列号。而且我们需要实现序列号标签(贴在机身和包装上),固件序列号一致。但是在开发过程发现,产品量产烧录的固件都是一样的,求各位大神指教一下产品固件的序列号是如何实现的?序列号通常是怎么样生成的?能够使得量产中序列号标签、固件序列号一致?谢谢!!!请教大神~如何在电子产品的固件上写入产品序列号都是生产最后一道工序就是写和贴系列号吧读芯片UID号有的烧写软件可以在HEX固定几个字节累加变化
henson186 stm32/stm8
【STM32H7S78-DK】 六 可设置时钟及代码分析
【STM32H7S78-DK】六可设置时钟及代码分析【STM32H7S78-DK】一开箱贴【STM32H7S78-DK】二touchgxf环境搭建和基本测试【STM32H7S78-DK】三touchgxf和stm32cubeide和led按键测试【STM32H7S78-DK】四下载失败问题及解决、计数器实现及分析【STM32H7S78-DK】五乱序键盘实现及分析之后一、打开to
damiaa stm32/stm8
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved