第七集 定时器
在本集中,冲哥给我们讲解的单片机的重要部件之一:定时器。那什么是定时器,能干什么?翻阅数据手册:
Ai8051U 系列单片机内部设置了 6 个 24 位定时器/计数器(8 位预分频+16 位计数)。6 个 16 位定时器 T0、T1、T2、T3、T4 和 T11 都具有计数方式和定时方式两种工作方式。
定时器/计数器 0 有 4 种工作模式:模式 0(16 位自动重装载模式),模式 1(16 位不可重装载模式),模式 2(8 位自动重装模式),模式 3(不可屏蔽中断的 16 位自动重装载模式)。 定时器/计数器 1 除模式 3 外,其他工作模式与定时器/计数器 0 相同。T1 在模式 3 时无效,停止计数。 定时器 T2 的工作模式固定为 16 位自动重装载模式。T2 可以当定时器使用,也可以当串口的波特率发生器和可编程时钟输出。 定时器 3、定时器 4、定时器 11 与定时器 T2 一样,它们的工作模式固定为 16 位自动重装载模式。T3/T4可以当定时器使用,也可以当串口的波特率发生器和可编程时钟输出。 定时器 11 的工作模式固定为 16位自动重装载模式。T11 可以当定时器使用,也可编程时钟输出。
在实际项目中,STC-ISP工具给我们提供了一个便捷工具,帮助我们快速计算定时数据:
①:在下载软件中选择“定时器计算器”功能页,进定时器代码生成界面
②:设置系统工作频率(单位:MHz)
③:设置定时时间长度(单位:毫秒/微秒)
④:选择目标定时器,并设置定时器工作模式
⑤:选择是否需要使能定时器中断
⑥:手动生成 C 代码或者 ASM 代码,复制范例
最后,通过3个小任务给出了具体应用实例:
- // 任务1:
- if (P32 == 0) // 判断P32按钮是否按下
- {
- Delay20ms(); // 延时20ms消抖
- if (P32 == 0)
- {
- printf("按键按下次数\xfd:%d 次\r\n", (int)count);
- count++;
-
- while (P32 == 0)
- ; // 等待P32松开
- }
- }
-
- // 任务2:灯按一下点亮三秒后熄灭。
- if (P32 == 0) // 判断P32按钮是否按下
- {
- Delay20ms(); // 延时20ms消抖
- if (P32 == 0)
- {
- printf("按键按下次数\xfd:%d 次\r\n", (int)count);
- count++;
- P00 = 0;
- Timer0_Init();
- while (P32 == 0)
- ; // 等待P32松开
- }
- }
-
- // 任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2表示红和蓝灯),再按一下报警按钮,红蓝灯停止。
- if (P32 == 0) // 判断P32按钮是否按下
- {
- Delay20ms(); // 延时20ms消抖
- if (P32 == 0)
- {
- Run_State = !Run_State; // 运行状态取反
-
- if (Run_State == 1) // 运行
- {
- Timer0_Init();
- }
- else
- {
- TR0 = 0; // 关闭定时器
- P00 = 1;
- P01 = 1;
- }
- while (P32 == 0)
- ; // 等待P32松开
- }
- }
复制代码
|