1.再遇多文件编程
因为定时器经常在后面的教程中使用到,所以我们也把这部分功能代码单独使用文件封装起来。
在第六章的教程中已经教过大家多文件创建,这里点到为止。
创建好“timer.c”和“timer.h”
添加进工程中
2.timer.c的代码
#include #include u8 T0RH,T0RL,T1RH,T1RL; void TIM0_Init(u32 us,int trim)//trim:微调 { u32 tmp; //临时变量 tmp = 11059200 / 12; //定时器计数频率 tmp = ( tmp * (us/100) )/10000; //计算所需的计数值 tmp = 65536 - tmp; //计算定时器重载值 tmp = tmp+trim; //微调计数值使其定时更精确到我们想要的定时时间 T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xF0; //清0低四位 TMOD |= 0x01; //设置定时器0为工作模式1 TH0 = T0RH; //加载T0重载值 TL0 = T0RL; ET0 = 1; //闭合定时器0中断的开关 TR0 = 1; //启动定时器0 } void TIM1_Init(u32 us,int trim)//trim:微调 { u32 tmp; //临时变量 tmp = 11059200 / 12; //定时器计数频率 tmp = ( tmp * (us/100) )/10000; //计算所需的计数值 tmp = 65536 - tmp; //计算定时器重载值 tmp = tmp+trim; //微调计数值使其定时更精确到我们想要的定时时间 T1RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节 T1RL = (unsigned char)tmp; TMOD&=0x0F;//清0高四位 TMOD|=0x10;//设置定时器1为工作模式1 TH1 = T1RH;//加载T1重载值 TL1 = T1RL; ET1 = 1; //闭合定时器1中断的开关 TR1 = 1; //启动定时器1 } “TMOD&=0xF0;”的作用跟数码管显示小数点的代码技巧一样,保持前面4位的值不变,清0后四位,然后“TMOD|=0x01;”就是不改变原来高四位的值,然后把低四位设成 0001。 如果在TIM0_Init()函数中只写“TMOD=0x01;” 在TIM1_Init()函数中只写“TMOD=0x10;” 然后初始化时像这样按顺序来写 TIM0_Init(20000,20);//定时20ms,20微调使定时精度更高 TIM1_Init(50000,20);//定时50ms,20微调使定时精度更高 那么执行TIM1_Init()的函数内容时就会执行“TMOD=0x10;”把人家低四位给清0了,原本想让定时器0工作在模式1,现在低2位的值变了也就不是工作在模式1了。 所以“TMOD&=0x0F; TMOD|=0x10;”的写法是不干涉互相的位。 我们定义了“T0RH,T0RL,T1RH,T1RL”四个8位的全局变量(R:reload)用来在中断函数里重新赋值。 因为工作模式1都是需要在中断函数中重新赋初值,所以这四个变量是存取初始化时给THx和TLx的初值。 3.timer.h的代码 #ifndef __TIMER_H__ #define __TIMER_H__ extern u8 T0RH,T0RL,T1RH,T1RL; void TIM0_Init(u32 us,int trim);//trim:微调 void TIM1_Init(u32 us,int trim);//trim:微调 #endif 4.main.c的代码 这样,实现间隔50ms的流水灯在书写上就相当简洁了 #include #include #include void main() { LED_Init(); //初始化LED硬件模块 EA = 1; //闭合总中断开关 TIM0_Init(50000,20);//用定时器0定时50ms,20是微调使中断函数里的i均匀地50.00ms后自加,精度更高 while(1); } void TIM0_IRQHandler() interrupt 1 { static u8 i; TH0 = T0RH; //重新加载重载值 TL0 = T0RL; P0=~(0x01< i++; if(i>=8)i=0; }
上一篇:51单片机-微调定时精确时间
下一篇:51单片机-输入捕获
推荐阅读最新更新时间:2024-11-06 10:18
设计资源 培训 开发板 精华推荐
- MPC86XADS、MPC8xx 参考板,基于 MPC862SR MPU PowerQUICC MPC8xx 处理器
- 使用 Analog Integrations Corporation 的 AIC15 的参考设计
- IB-LMS700K-ITO,为高端嵌入式系统的快速设计、开发和集成定义开放标准
- 使用 Microchip Technology 的 MIC45116-1YMP 的参考设计
- AD5340 并行接口、单电压输出、12 位 DAC 的典型应用
- EVAL-ADAU1446EBZ,用于评估 ADAU1446 SigmaDSP 的评估板
- 天气时钟-极限简化版,自带折叠支架
- AD9248BST-20EB,用于评估 AD9248BSTZ-20、20Msps、14 位、双 ADC 的评估套件
- 使用 L5970D/L5973D 12 VAC 输入 1W LED 驱动器的高强度应用电路
- SD迷你小立牌电视- 让创意不再停留--致谢小伙伴