投资建设个什么网站好,黄山旅游,小视频网站哪个可以推广,西安网站建设易网宣文章目录 1.定时器的作用和意义定时器中断定时器是定时器和计数器的统称。 2.STC32G单片机定时器使用原理2.1 先设置功能为定时器/计数器(本质都是加法计数器)2.2、在定时器模式下#xff0c;设置不分频或者12分频∶Tips#xff1a;选择不分频还是12分频2.3、定时器的工作模式… 文章目录 1.定时器的作用和意义定时器中断定时器是定时器和计数器的统称。 2.STC32G单片机定时器使用原理2.1 先设置功能为定时器/计数器(本质都是加法计数器)2.2、在定时器模式下设置不分频或者12分频∶Tips选择不分频还是12分频2.3、定时器的工作模式2.4 TCON寄存器设置2.5中断使能寄存器中断允许位) 3.定时器的简单应用定时时间 本节目标T0实现1毫秒的一个中断STC中断列表 4.定时器的快速使用方法中断频率越低越好 总结课后练习 1.定时器的作用和意义
什么是定时器定时器-与非网 上节课的一段代码
while(1){TimeCount;delay_ms(1);
}TimeCount然后一个延时1毫秒,每运行1ms变量就会加一。 系统已经运行了多少个毫秒。 实际使用时的代码如下
while(1)
{TimeCount;delay_ms(1);if (KEY1 0){delay_ms(10);if (KEY1 0){while(KEY1 0);}}
}判断按键有沿有按下的时候,我们等待按键松开,还有一个while循环。 如果没有松开会一直死在这一行。所以按下的时间段内TimeCount没有在执行变量不会动。 那么像这样while函数在不断循环执行的时候能不能有办法让这个变量每隔1ms能自动加一并且不受while循环的影响呢? 引入中断的概念 如果中断不发生就会一直执行主程序主函数。但是如果中断发生了先会进行这个中断的处理函数 处理完后从中断返回再继续执行主程序之前没有完成的一个人任务。
定时器中断
定时一定时间之后产生的中断也就是定时器中断。 主程序:你在背书 中断:妈妈让你五分钟以后看一下锅里的汤有没有烧干一个定时器中断的一个例子。
定时器是定时器和计数器的统称。
1)设置为定时器时可实现硬件计时或者使程序每隔一固定时间完成一项操作 2)设置为计数器时候能够对脉冲进行计数 3)替代长时间的delay,提高CPU的运行效率和处理速度,能及时的响应某个事件。
2.STC32G单片机定时器使用原理
T0实现1ms中断 手册原文
定时器/计数器24位定时器8位预分频1416位自动重装载)
STC32G系列单片机内部设置了5个24位定时器/计数器(8位预分频16位计数)。5个16位定时器T0、T1、T2、T3和T4都具有计数方式和定时方式两种工作方式。对定时器/计数器TO和T1用它们在特殊功能寄存器TMOD中相对应的控制位CT来选择TO或T1为定时器还是计数器。对定时器/计数器T2用特殊功能寄存器AUXR中的控制位T2_C/T来选择T2为定时器还是计数器。对定时器/计数器T3用特殊功能寄存器T4T3M中的控制位T3_C/T来选择T3为定时器还是计数器。对定时器/计数器
T4用特殊功能寄存器T4T3M中的控制位T4_C/T来选择T4为定时器还是计数器。定时器/计数器的核心部件是一个加法计数器其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统
时钟则为定时方式此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲计数值加1;如果计数脉冲来自单片机外部引脚则为计数方式每来一个脉冲加1。
当定时器/计数器TO、T1及T2工作在定时模式时特殊功能寄存器AUXR中的TOx12、T1x12和T2x12分别决定是系统时钟/12还是系统时钟/1(不分频〉后让TO、T1和T2进行计数。当定时器/计数器T3和T4工作在定时模式时特殊功能寄存器T4T3M中的T3x12和T4x12分别决定是系统时钟/12还是系统时钟/1(不分频〉后让T3和T4进行计数。当定时器/计数器工作在计数模式时对外部脉冲计数不分频。
定时器/计数器0有4种工作模式:模式0(16位自动重装载模式)﹐模式1(16位不可重装载模式)模式2(8位自动重装模式)模式3(不可屏蔽中断的16位自动重装载模式)。定时器/计数器1除模式3外其他工作模式与定时器/计数器О相同。T1在模式3时无效停止计数。定时器T2的工作模式固定为16位自动重装载模式。T2可以当定时器使用也可以当串口的波特率发生器和可编程时钟输出。定时器3、定时器4与定时器T2一样它们的工作模式固定为16位自动重装载模式。T3/T4可以当定时器使用也可以当串口的波特率发生器和可编程时钟输出。2.1 先设置功能为定时器/计数器(本质都是加法计数器)
STC32G系列单片机内部设置了5个24位定时器/计数器(8位预分频16位计数)。5个16位定时器T0、T1、T2、T3和T4都具有计数方式和定时方式两种工作方式。对定时器/计数器TO和T1用它们在特殊功能寄存器TMOD中相对应的控制位CT来选择TO或T1为定时器还是计数器。对定时器/计数器T2用特殊功能寄存器AUXR中的控制位T2_C/T来选择T2为定时器还是计数器。对定时器/计数器T3用特殊功能寄存器T4T3M中的控制位T3_C/T来选择T3为定时器还是计数器。对定时器/计数器T4用特殊功能寄存器T4T3M中的控制位T4_C/T来选择T4为定时器还是计数器。定时器/计数器的核心部件是一个加法计数器其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟则为定时方式此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲计数值加1;如果计数脉冲来自单片机外部引脚则为计数方式每来一个脉冲加1。 本节课主要用T0即timer 0也就是定时器0来实现功能。这个T就是一个定时的一个简称。 以定时器0/1模式寄存器TMOD)为例 T0 C/T:控制定时器0用作定时器或计数器清0则用作定时器(对内部系统时钟进行计数)置1用作 计数器对引脚TO/P3.4外部脉冲进行计数)。
2.2、在定时器模式下设置不分频或者12分频∶ 当定时器/计数器TO、T1及T2工作在定时模式时特殊功能寄存器AUXR中的TOx12、T1x12和T2x12分别决定是系统时钟/12还是系统时钟/1(不分频后让TO、T1和T2进行计数。当定时器/计数器T3和T4工作在定时模式时特殊功能寄存器T4T3M中的T3x12和T4x12分别决定是系统时钟/12还是系统时钟/1不分频)后让T3和T4进行计数。当定时器/计数器工作在计数模式时对外部脉冲计数不分频。 定时方式此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲计数值加1; 计数差了12倍。 看一下辅助寄存器AUXR)
用特殊功能寄存器AUXR中的控制位T2_C/T来选择T2为定时器还是计数器。 默认最高位为0
所以默认的频率是除以12的。
Tips选择不分频还是12分频
看具体的定时时间如果定时时间够那就用12分频。如果不分频相当于定时的时间短一些但是精度会更好。
2.3、定时器的工作模式 16位自动重载模式计数可以从0计数到65535,16位就是655352^16-165535。 定时时间到了系统会把你写入的定时时间重新给他自已装进去。不自动重载模式需要自己手动给定定时时间。 8位自动重载从0计数到255这就是他的最大值 不可屏蔽中断的16位自动重载与模式0相同不可屏蔽中断中断优先级最高高于其他所有中断的优先级并且不可关闭可用作操作系统的系统节拍定时器或者系统监控定时器。 这个中断只要一旦开启他就是最高优先级别的任何的中断都是不能打断它的。后期还有串口中断外部中断等等。 今天主要做16位自动重载模式的设置及测试。
2.4 TCON寄存器设置
TF0和TR0 TF0:T0溢出中断标志一定要手动给它写1不写1则不能开启即不能计数。T0被允许计数以后从初值开始加1计数当产生溢出时由硬件置“1”TFO, 向CPU请求中断一直保持CPU响应该中断时才由硬件清0(也可由查询软件清0。 TR0:定时器T0的运行控制位。该位由软件置位和清零,当然不清0也没关系。当GATE (TMOD.3)0TRO1时就允许TO开 始计数TRO0时禁止TO计数。当GATE(TMOD.3)1TRO1且INTO输入高电平时才允许TO计数TRO0时禁止TO计数。
2.5中断使能寄存器中断允许位) 回顾一下我们之前的课我们想要P60输出一个低电平我们可以这样写 方法1P60 0; 方法2P6 0XFE; //当然最好要写 P6 0XFE;
比如说我们要设置ET0等于1:可以直接写ET0等于1(这样子更方便而且不会影响到别的位) 也可以写IE0X02
3.定时器的简单应用 当c/T0时多路开关连接到系统时钟的分频输出TO0对内部系统时钟计数TO工作在定时方式。当 C/T1时多路开关连接到外部脉冲输入P3.4/T0即TO工作在计数方式。 STC单片机的定时器0有两种计数速率:一种是12T模式每12个时钟加1与传统8051单片机相同;另外一种是1T模式每个时钟加1速度是传统8051单片机的12倍。TO 的速率由特殊功能寄存器AUXR中的TOx12决定如果TOx120TO则工作在12T模式;如果TOx121T0则工作在1T模式 定时器0有两个隐藏的寄存器RL_THO和RL_TLO。RL_THO与THO共有同一个地址RL_TLO与TLO共有同一个地址。当TRO0即定时器/计数器О被禁止工作时对TLO写入的内容会同时写入RL_TLO对THO写入的内容也会同时写入RL_THO。当TRO1即定时器/计数器О被允许工作时对TLO写入内容实际上不是写入当前寄存器TLO0中而是写入隐藏的寄存器RL_TLO中对THO写入内容实际上也不是写入当前寄存器TH0中而是写入隐藏的寄存器RL_THO这样可以巧妙地实现16位重装载定时器。当读THO和TLO的内容时所读的内容就是THO和TLO的内容而不是RL_THO和RL_TLO的内容。 当定时器О工作在模式0(TMOD[1:0][M1.MO]00B)时[THO,TLO]的溢出不仅置位TFO而且会自动将[RL_THO,RL_TLO]的内容重新装入[THO,TLO]。 当TOCLKO/INT_CLKO.01时P3.5/T1管脚配置为定时器0的时钟输出TOCLKO。输出时钟频率为TO溢出率/2。 如果C/T0定时器/计数器TO对内部系统时钟计数则: TO工作在1T模式(AUXR.7/TOx121)时的输出时钟频率 (SYsclk)(TMOPS1)(65536-[RL_THO, RL_TLO])2To工作在12T模式(AUXR.7/TOx120)时的输出时钟频率-(SYsck)(TMOPS1)/12/(65536-[RL_THO,RL_TLO])2如果C/T1定时器/计数器TO是对外部脉冲输入(P3.4/TO)计数则: 输出时钟频率(To_Pin_CLK)/(65536-[RL_THO,RL_TLO])/2 根据手册 14.5范例程序 14.5.1 定时器0模式0一16位自动重载用作定时
TMOD 0x00;//模式0,16位自动重载模式
TL00x66;//65536-11.0592M/12/1000
TH0 0xfe;
TR0 1;//启动定时器
ET0 1;//使能定时器中断
EA1;TMOD 0x00 查询手册可知执行设置 1、16位自动重载模式 2、T0_C/T:控制定时器0用作定时器或计数器清0则用作定时器对内部系统时钟进行计数) 3、TO_GATE:控制定时器0当GATE0(TMOD.3)时如TRO1则定时器计数。
定时时间
相关公式
TL0 0x66;//65536-11.0592M/12/1000 TH0 0xfc; 0XFC66对应6461465536-64614922,92212(01)/(11.0592*1000000)0.0010004340277778s 约为1ms。
本节目标T0实现1毫秒的一个中断
用上节课的代码做模板编译运行会发现有一个小bug每次按key的时候数码管会闪一下。 用定时器就可以把这个闪的这个问题给修复掉。 首先打开stc手册14.5节例程
右键跳转到sys_init()的定义可以看到TMOD以前的定义均已有。 直接看到我们最重要的这个TMOD一般初始化的代码放在EA之前. 手册中给到是11.0592MHZ时间需要改成24MHZ:
根据前述公式24000000*0.001/12/012000改成程序员模式65536-20000XF830,则 TL0 0X30; //计算出24MB时钟下的1ms定时时间 TH0 0XF8;
打开定时器使能定时器中断。
STC中断列表 增加定时器中断函数函数名按规定写可以自定但是关键词interrupt不能少表示中断号 void TM0_Isr() interrupt 1 //定时器0对应中断号1自动找到中断号并去执行。 把需要的函数移植到中断中去这里只需将数码管刷新函数SEG_Fre()加入到其中并禁用SEG_Fre()中的延时语句将数码管刷新代码也加入
void TM0_Isr() interrupt 1 //1ms进来执行一次无需其他延时重复赋值
{SEG_Fre(); //数码管刷新1ms执行一次if( RUN_State1 ) //开始运行后每隔1ms加1需要移进来{TimCount; //每ms加1按键操作均不影响数码管刷新Show_Tab[4] TimCount/10000%10;Show_Tab[5] TimCount/1000%1010;Show_Tab[6] TimCount/100%10;Show_Tab[7] TimCount/10%10; //取10位}
}编译下载发现一个bug按键一直按住不松开时数码管显示有问题肯定是按键函数有问题找一下按键部分代码 将按键部分的刷新代码删除该部分刷新由中断函数每ms自动执行无需重复刷新。 再运行数码管无闪烁实验成功。
4.定时器的快速使用方法
STC-ISP有专用的定时器时间计算选项卡
输入参数后生产C代码
void Timer0_Isr(void) interrupt 1
{
}void Timer0_Init(void) //1000微秒24.000MHz
{AUXR 0x7F; //定时器时钟12T模式TMOD 0xF0; //设置定时器模式TL0 0x30; //设置定时初始值TH0 0xF8; //设置定时初始值TF0 0; //清除TF0标志TR0 1; //定时器0开始计时ET0 1; //使能定时器0中断
}将初始化函数 Timer0_Init()放在主程序前并将中断名称修改一致
中断频率越低越好
总结
1.了解定时器和定时器中断 2.学会分析什么时候该用定时器 3.熟悉工具并能快速使用定时器
课后练习
一、第十课的课后作业做一个简易时钟在此基础上将时钟改成定时器驱动。 二、在上述基础上是增加一个按钮按下一次就可以让时间暂停在按一下时间又能继续走在按一下再暂停!