ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

【嵌入式成长4】STC89C51定时器|定时器/计数器原理、初值计算、定时器中断实现1秒LED闪烁

【嵌入式成长4】STC89C51定时器|定时器/计数器原理、初值计算、定时器中断实现1秒LED闪烁 一、定时器简介STC89C52RC内置2个定时器T0、T1。具备两种工作功能定时器模式对单片机内部机器周期计数用来做定时。计数器模式对外部引脚脉冲跳变计数统计外部脉冲数量。软件delay函数缺点CPU死等延时过程中CPU不能干别的任务。定时器硬件独立后台计数CPU正常跑主循环业务计时时间到产生中断通知CPU处理事件。定时与计数器本质区别定时模式时钟源来自单片机内部机器周期每来1个机器周期计数器1。适合做定时、计时。计数模式时钟源来自外部引脚T0对应P3.4T1对应P3.5引脚检测到负跳变计数器1适合统计脉冲、编码器计数。二、定时器相关寄存器TMOD寄存器模式寄存器不可位寻址❌错误写法M0 1;✅正确写法TMOD 0x01;直接给整个寄存器赋值。T0与T1一共有4种工作模式模式M1M0说明模式00013位定时器现在基本不用模式10116位定时器项目最常用最大计数65536无自动重装中断内手动重装初值模式2108位自动重装适合串口波特率模式311T0拆成两个8位计数器T1停止工作极少使用C/T位0定时器模式内部机器周期1计数器模式外部引脚脉冲GATE门控位GATE0软件启动定时器TR01即可开启GATE1需要外部INT引脚高电平TR01双重条件开启。示例配置TMOD0x01;// T0选择模式116位定时器软件启动内部时钟源//0x01 二进制0000 0001如果配置T1为模式1TMOD0x10;//0001 0000TR0定时器运行控制位可以位寻址TR01;//打开T0开始计数TR00;//关闭T0停止计数TH0、TL016位计数初值寄存器模式1模式1为16位TH0存放高8位TL0存放低8位计数范围0~65535。计数器从初值不断1计数到达65536时产生溢出硬件置位TF0溢出标志触发定时器0中断。IE中断允许寄存器ET01开启定时器0中断EA1开启全局总中断STC‑ISP硬件分频选项12T /6TSTC单片机支持12T传统51默认与6T双倍速模式在STC‑ISP烧录软件硬件选项中设置。12T模式1个机器周期 12个晶振时钟本教程全部使用默认12T模式。修改6T之后定时器初值需要重新计算。三、定时器初值计算公式晶振11.0592MHz12T模式机器周期 12 / fosc 12 / 11059200 ≈1.085μs目标定时10ms需要计数多少次计数次数定时时间机器周期0.01s1.085μs9216次计数次数 \frac{定时时间}{机器周期} \frac{0.01s}{1.085μs}9216次计数次数机器周期定时时间​1.085μs0.01s​9216次16位最大计数值65536。初值65536−计数次数初值 65536 - 计数次数初值65536−计数次数初值65536‑921656320初值65536‑9216 56320初值65536‑921656320将初值拆分高8位、低8位TH0 初值 8; //取高8位TL0 初值; //取低8位#defineTIM_10MS(65536-9216)TH0TIM_10MS8;TL0TIM_10MS;⚠️模式1没有自动重装每次进定时器中断服务函数必须手动重新给TH0、TL0赋值初值否则下一次定时就不准。四、定时器中断号中断源中断号定时器0 T01定时器1 T13定时器0中断服务函数模板voidTimer0_ISR(void)interrupt1{TH0TIM_10MS8;TL0TIM_10MS;//定时到之后业务逻辑}五、完整实战代码示例1定时器0每10ms触发一次中断基础模板#includereg52.h//11.0592M晶振12T模式定时10ms#defineTIM_10MS(65536-9216)voidTimer0_Init(void){TMOD0x01;//设置T0模式116位定时器TH0TIM_10MS8;TL0TIM_10MS;ET01;//使能定时器0中断EA1;//打开全局总中断TR01;//启动定时器0}//定时器0中断服务函数中断号1每10ms进来一次voidTimer0_ISR(void)interrupt1{TH0TIM_10MS8;//模式1手动重装初值TL0TIM_10MS;//这里写10ms周期执行的代码}voidmain(void){Timer0_Init();while(1){//主循环可以执行其他业务定时器硬件后台计时}}示例210ms中断累计实现LED(P2.7)1秒闪烁思路10ms进一次中断全局变量count自加累计100次即10ms ×100 1000ms 1s翻转LED电平。#includereg52.h//11.0592M晶振12T定时10ms#defineTIM_10MS(65536-9216)sbit ledP2^7;unsignedintcount0;voidTimer0_Init(void){TMOD0x01;TH0TIM_10MS8;TL0TIM_10MS;ET01;EA1;TR01;}voidTimer0_ISR(void)interrupt1{TH0TIM_10MS8;TL0TIM_10MS;count;if(count100)//10ms*100 1s{led~led;//翻转LEDcount0;//计数器清零}}voidmain(void){Timer0_Init();while(1){//主循环可以做别的任务不受定时影响}}六、开发注意事项TMOD寄存器不可位寻址不能单独操作某一位直接整体赋值。模式116位定时器没有硬件自动重装中断服务函数内部必须手动重装TH0、TL0初值否则定时错乱。晶振、12T/6T分频会直接影响初值更换硬件晶振或修改ISP的6T选项初值要重新计算。中断服务函数尽量简短复杂逻辑不要放在中断内部使用全局标志位放到while(1)主循环处理。定时时间超过65536个机器周期不能一次完成采用短定时中断软件计数累加的方式实现长定时如上面1s闪烁例子。定时器模式对内部机器周期计数计数器模式统计外部引脚P3.4(T0)脉冲跳变。七、本章小结定时器硬件后台计时解放CPU相比软件delay不会阻塞主程序。TMOD配置定时器工作模式模式116位最常用。初值计算公式初值65536‑需要计数的脉冲次数中断内手动重装TH0/TL0。打开定时器四步配置TMOD模式、装载TH0/TL0初值、开启ET0与EA中断总开关、TR01启动定时器。长定时短周期定时器中断 全局变量计数累加实现。
返回列表