文档库 最新最全的文档下载
当前位置:文档库 › 定时器定时时间的计算(SystemCoreClock与OS_TICKS_PER_SEC的关系)

定时器定时时间的计算(SystemCoreClock与OS_TICKS_PER_SEC的关系)

定时器定时时间的计算(SystemCoreClock与OS_TICKS_PER_SEC的关系)
定时器定时时间的计算(SystemCoreClock与OS_TICKS_PER_SEC的关系)

定时器定时时间的计算(SystemCoreClock与OS_TICKS_PER_SEC的关系)

定时器定时时间的计算

xcj 2015/06/03 09:23

假设定时器的时钟频率为f,f已知。那么定时器每计数一次所用时间为1/f。1/f代表了定时器的定时的时间精度(或最小计时单位)。

往计数器写的初值为Ticks,就是经过Ticks个周期后,定时器值变为0,定时时间到了。

如果我们要定时的时间为T,那么计算公式为:

T = ticks * (1/f) (1)

整理后可得

ticks = f * T (2)

举个例子,假如定时器的时钟为SystemCoreClock,要定时1mS。

那么 ticks = SystemCoreClock * 1mS =SystemCoreClock * 1 * 10^(-3)=SystemCoreClock/1000

换个思路,如果已知定时器的时钟频率为f,要用定时器产生一个频率为f1的定时中断(T=1/f1)。根据公式(2)有

ticks = f /f1 (3)

上面的式子中 f1

如果定时器的时钟频率为SystemCoreClock,要用定时器产生一个频率为1KHz(1000Hz,周期为1ms)的定时中断,

那么ticks = SystemCoreClock /1000

公式(3)比较常用,也好计算。

在ucos ii中,OS_TICKS_PER_SEC代表每秒产生的中断个数,也就是是说OS_TICKS_PER_SEC的单位是Hz。

由于SysTick定时器的时钟频率为SystemCoreClock,那么Ticks就需要设置为

Ticks = SystemCoreClock/OS_TICKS_PER_SEC

这也是函数OS_CPU_SysTickInit()的参数为什么是SystemCoreClock/OS_TICKS_PER_SEC的原因了。

CC2530定时器设置以及应用

定时器的应用 一、教学目标 1、熟悉定时器相关寄存器的功能 2、能对程序进行改写以实现不同时间的定时操作 二、教学重点 定时器T1寄存器设置 通过变量累计定时溢出调整定时时间的方法 三、教学难点 定时器以及定时中断寄存器的设置 四、教学方法 案例法、对比法 五、教学过程 [引入]定时器也是CC2530的重要资源之一,CC2530的定时器比51单片机的定时器功能更多,本次课通过阅读、修改程序以及相关寄存器的学习,使大家能基本应用定时器完成不同定时时间的程序设计。 定时器程序设计方法也分为查询法和中断法。 任务一、查询法程序设计 1)结合以下寄存器的功能介绍阅读程序,分析程序的功能,并分析定时时间 2)修改程序实现4个LED指示灯的流水灯控制,延时时间为1秒。 将P1口状态用数组存放,采用循环结构引用数组。 任务二、中断法程序设计 与定时器中断相关的寄存器 ◆定时器初始化

定时中断初始化 void init(void) { P1SEL &= ~0x03; // 设置LED1、LED2为普通IO口 P1DIR |= 0x003 ; // 设置LED1、LED2为输出 LED1 = 0; LED2 = 1; //灭LED T1CTL = 0x05; // T1 通道0,8 分频; 自动重载模式(0x0000->0xffff); IEN1 |=0X02; //定时器1中断使能 EA=1; //开总中断 CLKCONCMD &= 0x80; //时钟速度设置为32MHz } 2)中断服务子程序设计 请同学们将任务一的程序调整为中断服务子程序 #pragma vector = T1_VECTOR //中断服务子程序 __interrupt void T1_ISR(void) { … … } 注意:中断标志需要软件清除,T1的中断标志位为T1IF 六、小结 本次课通过两个案例,分别采用查询法和中断法对定时器1进行程序设计,为后面的串口操作打下了基础。 七、作业 请同学们结合按键控制LED和定时器操作完成程序设计,按下按键,LED灯以1秒的时间间隔依次点亮

51单片机定时器初值的计算

51单片机定时器初值的计算 一。10MS定时器初值的计算: 1.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。10ms=10000次机器周期。65536-10000=55536(d8f0) TH0=0xd8,TL0=0xf0 2.晶振11.0592M 11.0592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。 65536-9216=56320(dc00) TH0=0xdc,TL0=0x00 二。50MS定时器初值的计算: 1.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次机器周期。65536-50000=15536(3cb0) TH0=0x3c,TL0=0xb0 2.晶振11.0592M 11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。 65536-46080=19456(4c00) TH0=0x4c,TL0=0x00 三。使用说明 以12M晶振为例:每秒钟可以执行1000000次机器周期个机器周期。而T 每次溢出 最多65536 个机器周期。我们尽量应该让溢出中断的次数最少(如50ms),这样对主程序的干扰也就最小。开发的时候可能会根据需要更换不同频率的晶振(比如c51单片机,用11.0592M的晶振,很适合产生串

口时钟,而12M晶振很方便计算定时器的时间),使用插接式比较方便。 51单片机12M和11.0592M晶振定时器初值计算 2011-01-04 22:25 at89s52,晶振频率12m 其程序如下: 引用代码:#include #include void timer0_init() { TMOD=0x01;//方式1 TL0=0xb0; TH0=0x3c; TR0=1; ET0=1; } void timer0_ISR(void) interrupt 1 { TL0=0xb0; TH0=0x3c;//50ms中断一次 single++; if(single==20) { kk++; single=0; } } void main() { int kk=0;//计数器 int single=0; timer0_init(); } TL0=0xb0; TH0=0x3c; 这两个是怎么算出来得

AVR定时器中断初值计算方法

AVR定时器中断初值计算方法 使用芯片ATMega16外部晶振 定时器1(16位定时器)寄存器TCCR1B=0x04设定256预分频要利用定时器定时1秒 1,4000000/256=15625说明定时器每当1/15625秒就会触发一次中断 2,65535-15625=49910计算出要累加多少次才能在1秒后出发定时器1的溢出中断 3,49910<==>C2F6将计算后的值换算成16进制 4,TCNT1H=0xC2;对寄存器赋值 TCNT1L=0xF6; ================================================= 例如用16位定时器TIMER1,4MHZ晶振,256分频,100ms定时,如何求得初值赋给TCNT1 65536-(4M/256)*= 其中,4M是晶体频率,是定时时长单位秒。 对于8位的定时器 T=(2^8-计数初值)*晶振周期*分频数=(2^8-计数初值)/晶振频率*分频数计数初值=2^8-T/晶振周期/分频数=2^8-T*晶振频率/分频数

因为AVR一指令一周期 IARForAVR精确延时 C语言中,想使用精确的延时程序并不容易。IAR中有这样的一个函数__delay_cycles(),该函数在头文件中定义,函数的作用就是延时N个指令周期。根据这个函数就可以实现精确的延时函数了(但不能做到100%精确度)。 实现的方法: 建立一个的头文件: #ifndef__IAR_DELAY_H #define__IAR_DELAY_H #include<> #defineXTAL8//可定义为你所用的晶振频率(单位Mhz) #definedelay_us(x)__delay_cycles((unsignedlong)(x*XTAL)) #definedelay_ms(x)__delay_cycles((unsignedlong)(x*XTAL*1000)) #definedelay_s(x)__delay_cycles((unsignedlong)(x*XTAL*1000000 )) #endif

单片机定时器习题

单片机定时器/计数器、中断和串行口习题 一、填空题 1、若要启动定时器T0开始计数,则应将TR0的值设置为 1 。 2、定时器T1工作在方式0时,其定时时间为(8192-定时器初值)*2us 。方式1时定时时间又为(65536-定时器初值)*2us 。 3、串行通信有异步通信和同步通信两种基本通讯方式。 4、波特率是指每秒钟传递信息的位数。 5、如果要将现有的波特率加倍,可使用指令MOV PCON,#80H 。 6、当串行口工作在方式1时,一帧信息共有10位,即起始位、8个数据位、停止位。 7、串行口工作在方式2时的波特率为fosc/32或fosc/64 。 8、外部中断1的程序入口地址是0013H 。 二、选择题 1、若要采用定时器0,方式1,如何设置TMOD__B__ A.00H B.01H C.10H D. 11H 2、单片机采用方式0时是13位计数器,它的最大定时时间是多少?_B__ A.81.92ms B.8.192ms C.65.536ms D.6.5536ms 3、以下哪项不是中断的特点? C A.分时操作 B.实时处理 C.在线编程 D.故障处理 4、外部中断响应时间至少需要__A个机器周期。 A.3 B.2 C.4 D.8 5、通过串口发送和接受数据时,在程序中使用__A___指令。 A.MOV BMOVX C.MOVC D.SW AP 6、以下哪个是中断优先级寄存器?__B A.IE B.IP C.TCON D.SCON 7、串行口中断的程序入口地址是 C 。 A 0003H B 001BH C 0023H D 000BH 三、判断题 1、8051的两个定时器T0和T1都是16位的计数器。(对) 2、单片机的计数器最高检测频率为振荡频率的1/12。(错) 3、定时/计数器的方式2具有自动装入初值的功能。(对) 4、引起中断的原因或发出中断申请的来源称为中断源。(对) 5、中断可使CPU和外设同时工作。(对) 6、定时器的特殊功能寄存器TMOD是用作中断溢出标志,并控制定时计数器的启动和停止。(错) 7、定时器控制寄存器TCON可以位寻址。(对) 8、MCS-51系列单片机的5个中断源都是可屏蔽中断。(对) 四、综合题

定时器产品使用说明书

定时器产品使用说明书 定时设置: 1、先检查时钟是否与当前时间一致,如需重新校准,在按住“时钟”键的同时,分别按住“星期”、“小时”、“分钟”键,将时钟调到当前准确时间。 2、按一下“设定”键,显示屏左下方出现“1开”字样(表示第一次开启的时间)。然后按“星期”调整本次设定的星期组合模式,再按“小时”、“分钟”键,输入所需开启的时间。 3、再按一下“设定”键,显示屏左下方出现“1关”字样(表示第一次关闭时间),再按“星期”、“小时”、“分钟”键,输入所需关闭的日期和时间。 4、继续按动“设定”键,显示屏左下方将依次显示“2开、2关、3开、3关……16开、16关”,参考步骤2、3设置以后各次开关时间。设置完成后,按一下“时钟”键返回。 5、如果每天不需设置16组开关,则必须按“清除”键,将多余各组消除,使其显示屏上显示“—:—”图样(不是00:00)。 6、按“模式”键,可以变换工作模式。总共有四种工作模式:A、液晶显示开(代表进入常开模式);B、液晶显示关(代表进入常关模式);C、由开进入自动(表示目前状态为开,等到下一组时间到后开始自动运行);D、由关进入自动(表示目前状态为关,等到下一组定时时间到后开始自动运行)。 当出现以下情况时: 1、定时器没有根据设定的程序开启或关闭,请检查设置程序是否正确或重新调整。 2、定时器长时间不用,显示模糊时,请将定时器接通电源充足,10分钟后无显示,按“复位”键,2-3秒。 3、如以上步骤均不能排除问题,请与公司或经销商联系维修。 注意事项: 1、对于那些因定时开关出错而可能发生的生命相关事故或者对社会产生重大影响的设备(如医疗设备等),请不要使用定时开关。 2、对于那些因定时开关出错而发生重大财产损失的设备(大型加热器或冷库),在使用本定时开关时,请务必是特性和性能的数值有足够的余量,并采取二重电路等安全对策。 3、请勿自行修理、分解或改造。 4、接通电源后请勿接触端子部分。本开关工作在无潮湿、腐蚀及高金属含量气体环境中。请勿沾染油或水。

定时器定时时间的计算(SystemCoreClock与OS_TICKS_PER_SEC的关系)

定时器定时时间的计算(SystemCoreClock与OS_TICKS_PER_SEC的关系) 定时器定时时间的计算 xcj 2015/06/03 09:23 假设定时器的时钟频率为f,f已知。那么定时器每计数一次所用时间为1/f。1/f代表了定时器的定时的时间精度(或最小计时单位)。 往计数器写的初值为Ticks,就是经过Ticks个周期后,定时器值变为0,定时时间到了。 如果我们要定时的时间为T,那么计算公式为: T = ticks * (1/f) (1) 整理后可得 ticks = f * T (2) 举个例子,假如定时器的时钟为SystemCoreClock,要定时1mS。 那么 ticks = SystemCoreClock * 1mS =SystemCoreClock * 1 * 10^(-3)=SystemCoreClock/1000 换个思路,如果已知定时器的时钟频率为f,要用定时器产生一个频率为f1的定时中断(T=1/f1)。根据公式(2)有 ticks = f /f1 (3) 上面的式子中 f1

STM32如何设置定时器

STM32如何设置定时器 STM32 如何设置定时器 下面以stm32 的TIM2 作为实例一步步配置成为定时器: 第一种 对定时器的基本配置 TIM_TimeBaseStructure.TIM_Period = 1000; //设置自动装载寄存器 TIM_TimeBaseStructure.TIM_Prescaler = 35999; //分频计数 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //选择向上计数 TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure); TIM_Cmd(TIM2, ENABLE); //是能定时器 始能定时器的中断: TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); 在开启时钟里一定要打开TIM2 的时钟,函数表达式如下: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 4:中断向量函数的编写: void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; #ifdef VECT_TAB_RAM //如果程序在ram 中调试那么定义中断向量表在Ram 中否则在Flash 中 /* Set the Vector Table base location at 0x20000000 */

智能编程定时器操作说明书

文案大全 此文档由恒飞电器提供 由杭州寰宇世极功放编写 ※系统概述: M P 3智能音乐播放器:采用世界最先进的微电脑控制技术。将广播自动分区播放、外部音频和麦克风录音存储等先进功能综合为一体。内存大小由你选择: (分别可用U 盘或T F 卡设计),成为广播设备的典范之精品,达到国内领先水平。广泛适用于校园自动广播音乐打铃、外语广播教学听力考试系统。 ※综合功能: M P 3自动广播、智能分区广播、日常教学广播、消防紧急广播、背景音乐播放、外语教学及听力考试广播功能。 ※技术参数: 信噪比:>90d B ; 谐波失真:<0.1%; 频响范围:20H z -18K ; 电压:220V ※前面板介绍(由于机型不同布局略有不同) 01、电源灯及开关 02、插U 盘或连接电脑U S B 囗 03、电源灯 (T F 卡插囗) 04、显示屏; 05、菜单上,下,左,右控制 选择键; 06、确定,停止,返回键; 07、咪,输入,监听音量控制键; 08、分区1,2,3,4,5,6按键 09、分区及电源全开全关按键; 10、手动与自动切换按键; 重要提示:当你插入新U 盘或TF 卡时,必须先把它插在本机上并开关本机电源,让它自动生成AUDIO 文件夹后并把有编号的MP3歌曲装到AUDIO 文件夹内才可以播放。 ※后面板介绍(由于机型不同布局略有不同)

2 注:短路输入端囗: 当这个端囗有短路信号输入时,本机会立刻播放你放在內存里AL A R M 文件夹内的这一首曲目,A L AR M 这文件夹內只能放一首用于紧急报警用的歌曲,其它需要定时播放的歌曲要放在AU DI O 文件夹內,如歌曲的路径放错则定时播放将不执行。短路输出端囗: 这个端囗与功放电源和分区的动作同步,即当有定时点到时,这端囗即短路,当定时歌曲放完或设定了结束时间到了即断开,这端囗作用是用于控制电源时序器接多台功放之用。 ※设备连接图(由于机型不同 布局略有不同) 01、FM 与遥控天线接囗; 03、MIC 输入插孔; 05、六个分区输入输出接线座; 07、输入电源接线座; 02、音频输入输出插孔; 04、短路输入警报与短路输出控制接口; 06、电源输出接线座;

STM32定时时间的计算

STM32 定时器定时时间的计算 假设系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由 PCLK1 得到关键是设定时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。RCC_Configuration()的SystemInit()的 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。因此,每次进入中断服务程序间隔时间为: ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒。定时器的基本设置如下: 1、TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数例如:时钟频率=72/(时钟预分频+1)。 2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时时间)累计 0xFFFF个频率后产生个更新或者中断(也是说定时时间到)。 3、TIM_TimeBaseStructure.TIM_CounterMode=TIM1_CounterMode_Up; //定时器模式向上计数。 4、 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值。 5、 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器2。 6、 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断溢出中断。 7、 TIM_Cmd(TIM2, ENABLE);//打开定时器或者: TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999,72M/ (35999+1)/2=1Hz 1秒中断溢出一次。 8、 TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒。 9、注意使用不同定时器时,要注意对应的时钟频率。例如TIM2对应的是APB1,而TIM1对应的是APB2 通用定时器实现简单定时功能 以TIME3为例作为说明,简单定时器的配置如下: void TIM3_Config(void) { TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; TIM_DeInit(TIM3); //复位TIM2定时器 /* TIM2 clock enable [TIM2定时器允许]*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* TIM2 configuration */ TIM_TimeBaseStructure.TIM_Period = 49; // 0.05s定时 TIM_TimeBaseStructure.TIM_Prescaler = 35999; // 分频36000 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分割TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方向向上计数 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* Clear TIM2 update pending flag[清除TIM2溢出中断标志] */

51单片机定时器初值的计算

51单片机定时器初值的计算一。10MS定时器初值的计算: 1.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。10ms=10000次机器周期。 65536-10000=55536(d8f0) TH0=0xd8,TL0=0xf0 2.晶振11.0592M 11.0592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。 65536-9216=56320(dc00) TH0=0xdc,TL0=0x00 二。50MS定时器初值的计算: 1.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次机器周期。 65536-50000=15536(3cb0) TH0=0x3c,TL0=0xb0 2.晶振11.0592M 11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。 65536-46080=19456(4c00)

TH0=0x4c,TL0=0x00 三。使用说明 以12M晶振为例:每秒钟可以执行1000000次机器周期个机器周期。而T 每次溢出 最多65536 个机器周期。我们尽量应该让溢出中断的次数最少(如50ms),这样对主程序的干扰也就最小。 开发的时候可能会根据需要更换不同频率的晶振(比如c51单片机,用11.0592M的晶振,很适合产生串口时钟,而12M晶振很方便计算定时器的时间),使用插接式比较方便。 对12MHz 1个机器周期1us 12/fosc = 1us 方式0 13位定时器最大时间间隔 = 2^13 = 8.192ms 方式1 16位定时器最大时间间隔 = 2^16 = 65.536ms 方式2 8位定时器最大时间间隔 = 2^8 = 0.256ms =256 us 定时5ms,计算计时器初值 M = 2^K-X*Fosc/12 12MHz 方式0: K=13,X=5ms,Fosc=12MHz 则M = 2^13 - 5*10^(-3)*12*10^6/12= 3192 = 0x0C78 THx = 0CH,TLx = 78H, 方式1: K=16,X=5ms,Fosc=12MHz 则M = 2^16 - 5*10^(-3)*12*10^6/12= 60536 = 0xEC78 THx = ECH,TLx = 78H,

定时器-计数器

定时器 / 计数器 一、实验目的 ⒈学会8253芯片和微机接口的原理和方法。 ⒉. 掌握8253定时器/计数器的工作方式和编程原理。 二、实验内容 利用8253进行二次分频,控制LED灯亮10秒,灭10秒。 三、实验程序清单(在H8253.ASM的基础上修改) CODE SEGMENT ;H8253.ASM ASSUME CS: CODE ORG 1290H START: JMP TCONT TCONTRO EQU 0043H TCON0 EQU 0040H TCON1 EQU 0041H TCONT: MOV DX,TCONTRO MOV AL,36H ;0号通道控制字需要修改 OUT DX,AL MOV DX,TCON0 ;计数初值要按计算出的值来写 MOV AL,00H OUT DX,AL MOV AL,04H OUT DX,AL MOV DX,TCONTRO MOV AL,36H ;1号通道控制字需要修改 OUT DX,AL MOV DX,TCON1 MOV AL,00H ;计数初值要按计算出的值来写 OUT DX,AL MOV AL,02H OUT DX,AL JMP $ CODE ENDS END START

四、实验步骤 ⒈8253的GATE0、GATE1接+5V,OUT0接CLK1,CLK1接LED灯(L1)。 8253的CLK0插孔接分频器74LS393(左下方)的T2插孔,分频器的频 率源为8.0MHZ,T→8.0MHZ。 ⒉运行实验程序 在系统提示符“P.”状态下,联机运行程序 3. 观察实验现象,修改程序中的计数初始值,观察结果。

定时器工作原理

定时器工作原理 通电延时型。只要在定时的时间段内(即1分钟)定时器一直得电,则常开触电就会闭合,只要定时器不断电常开触电就会一直闭合。定时器断电则常开触电断开 1,定时器/计数器的结构与功能 主要介绍定时器0(T0)和定时器1(T1)的结构与功能。图6.1是定时器/计数器的结构框图。由图可知,定时器/计数器由定时器0、定时器1、定时器方式寄存器TMOD和定时器控制寄存器TCON组成。 定时器0,定时器1是16位加法计数器,分别由两个8位专用寄存器组成:定时器0由TH0和TL0组成,定时器1由TH1和TL1组成。 图6.1 定时器/计数器结构框图 TL0、TL1、TH0、TH1的访问地址依次为8AH~8DH,每个寄存器均可单独访问。定时器0或定时器1用作计数器时,对芯片引脚T0(P3.4)或T1(P3.5)上输入的脉冲计数,每输入一个脉冲,加法计数器加1;其用作定时器时,对内部机器周期脉冲计数,由于机器周期是定值,故计数值确定时,时间也随之确定。 TMOD、TCON与定时器0、定时器1间通过内部总线及逻辑电路连接,TMOD 用于设置定时器的工作方式,TCON用于控制定时器的启动与停止。 6.1.1 计数功能 计数方式时,T的功能是计来自T0(P3.4)T1(P3.5)的外部脉冲信号的个数。 输入脉冲由1变0的下降沿时,计数器的值增加1直到回零产生溢出中断,表示计数已达预期个数。外部输入信号的下降沿将触发计数,识别一个从“1”到“0”的跳变需2个机器周期,所以,对外部输入信号最高的计数速率是晶振频率的1/24。若晶振频率为6MHz,则计数脉冲频率应低于1/4MHz。当计数器满后,再来一个计数脉冲,计数器全部回0,这就是溢出。 脉冲的计数长度与计数器预先装入的初值有关。初值越大,计数长度越小;初值越小,计数长度越大。最大计数长度为65536(216)个脉冲(初值为0)。 6.1.2 定时方式 定时方式时,T记录单片机内部振荡器输出的脉冲(机器周期信号)个数。 每一个机器周期使T0或T1的计数器增加1,直至计满回零自动产生溢出中断请求。 定时器的定时时间不仅与定时器的初值有关,而且还与系统的时钟频率有关。在机器周期一定的情况下,初值越大,定时时间越短;初值越小,定时时间越长。最长的定时时间为65536(216)个机器周期(初值为0)。

关于定时器初值的设定

深入理解需要精通定时器溢出原理: 晶振时钟12分频后得到机器时钟,定时器启动后会按机器时钟进位,16bit模式,定时器溢出频率就是机器时钟除以定时器多余“空间”, 例如定时器初值是0xffff,则每1个机器时钟都会溢出,产生中断 例如定时器初值是0xfffe,则每2个机器时钟会溢出 …… 例如定时器初值是【65535(0xffff)-999】,则每1000个机器时钟会溢出,或 例如定时器初值是【65536-1000】,则每1000个机器时钟会溢出 …… 依次类推 实例 例如:设T0工作方式1定时,定时时间为2ms,在P1.0引脚上输出周期为4ms的方波,设单片机的晶振频率为12MHz。 解:要在P1.0输出周期为4ms的方波,即要使P1.0每隔2ms取反1次。 T0方式1定时,则T0的方式字为:TMOD=01H 计算2ms定时T0的初值: 12M晶振,机器周期为1M,2ms就是X个机器周期 X=T(2ms)/T0(1s/(12M/12))=0.002/1/1000000=2000 定时器初值就是65536-X=65536-2000=63536=F830H 其中将高8位F8H赋给TH0,低8位30H赋给TL0。 采用查询方法,编程如下: 1. https://www.wendangku.net/doc/2f3929451.html, 0000H 3.AJMP MAIN 4. https://www.wendangku.net/doc/2f3929451.html,O 0100H 6.MAIN: MOV TMOD,#01H 7.MOV TL0,#30H 8.MOV TH0,0F8H 9.SETB TR0 10.LOOP: JBC TF0,NEXT 11.SJMP LOOP 12.NEXT: MOV TL0,#30H 13.MOV TH0,#0F8H 14.CPL P1.0 15.SJMP LOOP 复制代码 采用中断的方法,编程如下: https://www.wendangku.net/doc/2f3929451.html, 0000H 2.AJMP MAIN

89C51单片机定时器所定时间的计算以及写法

89C51单片机定时器时间的计算以及写法 今晚学单片机的时候,有一点儿问题,就去网上看了看,发现了很多人不会单片机定时,也就是具体时间的设定,不知道如何设定,而且有关方面的书籍、资料讲解又太过术语化,所以就写一篇通俗些的语言讲述一下如何定时。 为了便于理解,先讲解一点儿关于单片机内部定时器和计数器的基本知识,如果学过数字电路,就不用管这些,看下边的就好了: (1)由于单片机内部定时器、计数器均为八位,所以它们从0开始到计数计满,也就是能从0000 0000计数到1111 1111,即 2^0到2^16,转换成十进制,就是0——65536。 (2)外部的晶振电路提供的频率,到单片机内部,经过硬件电路,进行了12分频,不要问为什么,就这么记着就好了。比如外 部晶振是12MHZ的,那么到了单片机内部,用的频率就是 1MHz的。 89C51单片机常使用的晶振频率为12MHz和11.0592MHz两种,主要讲述这两种频率的,如果用其他的,只需要相应改变即可,下面分别讲述如何定时: (1)使用12MHz晶振: 单片机工作的频率f:12MHz/12=1MHz, 那么时钟周期T1:T1=1/f=1μs, 比如你要定时T2=50ms=50000μs,

你需要总时间T=T1 x T2=50000,也就是说你需要50000个周期才能走完你所要定的时间,当把数全都计满,是需要65536个周期,也就是说还有65536-50000=15536个周期没有走,那么,我们可以把这个初始值放到计数器里面,让它从15536开始计数,当计够50000个周期,也就计满了,即到达了65536。 就像水往水缸里流,你需要流满半缸水的时间,但是现在水缸是空的,你可以先把水缸灌半缸水,然后让它从半缸水开始流,当流满了的时候,也就到了你需要的那个时间。 然后,15536转成十六进制为:0x3CB0,将3C放到定时器的高8位,B0放到第8位,就完成了定时。 我们在写程序赋初始值的时候一般是这么写的,可以参考一下:TH0=0x3C; TL0=0xB0; 或者 TH0=(65536-50000)/256; TL0=(65536-50000)%256; PS:如果你定时是其他的,可以把根据我上边讲解的,把T=50000换成相应的数值即可。 (2)使用11.0592MHz晶振: 单片机工作的频率f:11.0592MHz/12=0.9216MHz, 那么时钟周期T1:T1=(1/0.9216)μs,

mcgs定时器操作函数设置

定时器号:系统定时器的序号1—127,MCGS系统内嵌127个系统定时器。 系统定时器以秒为定时单位。 !TimerClearOutput(定时器号) 函数意义: 断开定时器的数据输出连接 返回值:数值型。返回值=0:调用成功;<>0:调用失败。 参数:定时器号。 实例:!TimerClearOutput(1),断开1号定时器的数据输出连接 !TimerRun(定时器号) 函数意义:启动定时器开始工作 返回值:数值型。返回值=0:调用成功;<>0:调用失败。 参数:定时器号 实例:!TimerRun(1),启动1号定时器工作。 !TimerStop(定时器号) 函数意义:停止定时器工作 返回值:数值型。返回值=0:调用成功;<>0:调用失败。 参数:定时器号 实例:!TimerStop(1 ),停止1号定时器工作。 !TimerSkip(定时器号,步长值) 函数意义:在计时器当前时间数上加/减指定值 返回值:数值型。返回值=0:调用成功;<>0:调用失败。 参数:定时器号;步长值 实例:!TimerSkip(1,3),1号定时器当前值+3 !TimerReset(定时器号,数值) 函数意义:设置定时器的当前值,由第二个参数设定,第二个参数可以是MCGS变量返回值:数值型。返回值=0:调用成功;<>0:调用失败。 参数:定时器号;数值 实例:!TimerReset(1,12),设置1号定时器的值为12 !TimerValue(定时器号,0) 函数意义:取定时器的当前值

返回值:将定时器的值以数值型的方式输出(数值格式) 参数:定时器号 实例:Data3=!TimerValue(1,0),取定时器1的值给Data3 !TimerStr(定时器号,转换类型) 函数意义:以时间类字符串的形式返回当前定时器的值 返回值:字符型变量,将定时器的值以字符型的方式输出(时间格式) 参数:定时器号 转换类型值:开关型 = 0:取定时器的值以“00:00”形式输出; = 1:取定时器的值以“00:00:00”形式输出; = 2:取定时器的值以“0 00:00:00”形式输出; = 3:取定时器的值以“0 00:00:00.000”形式输出; 实例:Time=!TimerStr(1,1),取定时器的值以“00:00:00”形式输出给Time !TimerState(定时器号) 函数意义:取定时器的工作状态 返回值:数值型变量,0 - 定时器停止,1 - 定时器运行 参数:定时器号 实例:data1=!TimerState(1),取定时器1的工作状态给data1 !TimerSetLimit(定时器号,上限值,参数3) 函数意义:设置定时器的最大值,即设置定时器的上限 返回值:数值型。返回值=0:调用成功;<>0:调用失败。 参数:定时器号;上限值;参数3,1 - 表示运行到60后停止;0 - 表示运行到60后重新循环运行 实例:!TimerSetLimit(1,60,1),设置1号定时器的上限为60,运行到60后停止。 !TimerSetOutput(定时器号,数值型变量) 函数意义:设置定时器的值输出连接的数值型变量 返回值:数值型。返回值=0:调用成功;<>0:调用失败。 参数:定时器号;数值型变量,定时器的值输出连接的数值型变量 实例:!TimerSetOutput(1,Data0),将1号定时器的数据连接到Data0 !TimerWaitFor(定时器号,数值)

51单片机定时器使用

51单片机定时器使用——小灯闪烁一、定时器工作方式设置TMOD=0x01 GATE =0 由TR=1控制开始计时; C/ T=0 作为定时时器使用; M1=0\M0=1 用作16位定时器 二、计数寄存器TH0\TL0初始值计算如定时0.02秒 普通51单片机12T模式: (一)手工计算例如晶振为10.6850MHZ 定时20毫秒 X/10.6850*1000000*12=20毫秒 X=17808 原始值T0=Y Y+17808=65536 Y=47728 利用科学计算器进行16进制转换为0Xb800 TH0=0x80 TL0=0x00 (二)单片机公式计算 TL0=T1MS;//初始化定时的计数初值(第8位),高8位丢失 (三)启动定时器(TR0=1),判断是否溢出(If(TF0==1){//}),时间到。 (四)闪烁的小灯代码 #include //P1 0脚接LED小灯 sbit led=P1^0;

//定义延时函数,循环cs次,时间长为20*cs毫秒 void delay20(unsigned int cs) { unsigned int shuL=0; TMOD=0x01; //初始值根据单片机时钟频率计算 TH0=0xB8; TL0=0x00; //启动定时器 TR0=1; while(shuL<=cs) { if(TF0==1) //查询是否溢出,溢出后复位溢出标志,赋初始值,循环计数加。{TF0=0; TH0=0xBA; TL0=0x70; shuL=shuL+1; } } } void main()

{ delay20(500); //小灯取反,亮500*20毫秒,即10秒; led=~led; delay20(500); }

AVR定时器中断初值计算方法

AVR 定时器中断初值计算方法 使用芯片AT Mega16 外部晶振 定时器1 (16位定时器)寄存器TCCR1B = 0x04 设定256预分频 要利用定时器定时1秒 1,4000000 / 256 = 15625 说明定时器每 当1/15625 秒就会触发一次中断 2,65535 - 15625 = 49910 计算出要累加多少次才能在1秒后出发定时器1的溢出中断 3,49910 <==> C2 F6 将计算后的值换算成16进制 4,TCNT1H = 0xC2 ; 对寄存器赋值 TCNT1L = 0xF6 ; ================================================= 例如用16位定时器TIMER1,4MHZ晶振,256分频,100ms定时,如何求得初值赋给TCNT1 65536-(4M/256)*= 其中,4M是晶体频率,是定时时长单位秒。 对于8位的定时器

T=(2^8-计数初值)*晶振周期*分频数=(2^8-计数初值)/晶振频率*分频数计数初值=2^8-T/晶振周期/分频数=2^8-T*晶振频率/分频数 因为AVR一指令一周期 IAR For AVR 精确延时 C语言中,想使用精确的延时程序并不容易。IAR 中有这样的一个函数__delay_cycles(),该函数在头文件中定义,函数的作用就是延时N个指令周期。根据这个函数就可以实现精确的延时函数了(但不能做到100%精确度)。 实现的方法: 建立一个的头文件: #ifndef __IAR_DELAY_H #define __IAR_DELAY_H #include <> #define XTAL 8 //可定义为你所用的晶振频率(单位Mhz)#define delay_us(x) __delay_cycles ( (unsigned lon g)(x * XTAL) )

时钟源及定时器计算方法

时钟源及定时器计算方法示例一.时钟源 Fin=8MHz ●时钟源定义 规则: Fpllo必须大于20MHZ且少于66MHZ Fpllo * 2s必须少于170MHZ Fin/p推荐为1MHZ 或大于,但小于2MHZ 例:设晶振工作频率fin=8MHz,要求产生主时钟频率MCLK==64MHz m = (MDIV + 8),p = (PDIV + 2),s = SDIV 由于Fpllo * 2s<170MHZ →2s <170MHz/64 MHz = 2.65 →s=1=SDIV Fin/p推荐为1MHZ 或大于,但小于2MHZ, 1MHz<=Fin/p<2M Fin /2M<=P< Fin/1M →4<=P<8 p = (PDIV + 2) →2<=PDIV<6

Fpllo = (m * Fin)/(p * 2s) 注:答案不唯一 ●SDIV=1 (0x01) PLLCON[1:0] 2位0~3 ●取PDIV=2 (0x02) PLLCON[9:4] 6位0~63 ●MDIV=?(0x38) PLLCON[19:12] 8位0~255 由 Fpllo=MCLK=( MDIV +8)*8M/( PDIV +2)*2SDIV =( MDIV +8)*8M/((2+2)*21)= 64MHz →( MDIV +8)*8M/8= 64MHz →MDIV +8=64 →MDIV=56 PLLCON:MDIV[19:12],PDIV[9:4],SDIV[1:0] 0x38 0x2 0x1 ●对PLLCON赋值方法一: PLLCON=0b0011 1000 0000 0010 0001或PLLCON=0x380201 ●对PLLCON赋值方法二: PLLCON= ((MDIV<<12)| (PDIV<<4)|( SDIV<<0)) 二.定时器定义 定时器输入时钟频率f in=MCLK/{预分频值+1}/{再分频值}= MCLK/{ prescaler +1}/{DIV},其中预分频值为0~255,再分频DIV为2,4,8,16,32 例:设系统输入主时钟频率为MCLK=64MHz,要求定时器Time0输出脉冲时间间隔T=5s,占空比为20%。 注:答案不唯一。 ●由定时器输出频率要求可知:f out=1/T=1/5=0.2Hz ●设取DIV= 32 Prescaler=199 Prescaler:0~255 ●由f in= MCLK/{ prescaler +1}/DIV=64MHz/200/32=10KHz 尽量保持整除 ●TCNTBn = f in / f out=10KHz/0.2=50K=50000 TCNTBn寄存器为16位:0~65535 ●占空比20%,可得TCMPBn= TCNTBn*20%=50000*20%=10000,即定时器从50000递 减计数至10000时(即TCMPBn= TCNTBn),Tout输出高电平 定时器配置及启动!

51单片机定时器实验报告

51单片机定时器实验 实验内容: 实验内容: (1)编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。C语言程序 #include #define uint unsigned int #define ucahr unsigned char sbit FM=P0^0; void main() { TMOD=0x01; TH0=(65535-50000)/256; TH0=(65535-50000)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; while(1); } void T0_time()interrupt 1 { TH0=(65535-50000)/256; TH0=(65535-50000)%256; FM=~FM; } 汇编程序 ORG 0000H JAMP MAIN ORG 000BH

LJMP INT0_INT ORG 0100H MIAN: SETB EA SETB ET0 AJMP $ INT0_INT:MOV R2,#0FAH MOV R3,#0C8H DJNZ R3,$ DJNZ R2,INT0_INT RETI (2)编写程序使定时器0或者定时器1工作在方式1,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。 #include #define uint unsigned int #define ucahr unsigned char uint num,num1; sbit FM=P0^7; int shi,ge,a; void delay(uint); void shumaguan(); unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; //共阳极数码管0-F编码表 void main() { TMOD=0x01; TH0=(65535-50000)/256; TH0=(65535-50000)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1;

相关文档
相关文档 最新文档