学习17-51单片机定时器实验的方法和技巧
一 主要涉及到的知识点:
1.1 定时器的介绍:
①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡
周期)。
②状态周期:2 个振荡周期为 1 个状态周期,用 S 表示。振荡周期又称 S 周
期或时钟周期。
③机器周期:1 个机器周期含 6 个状态周期,12 个振荡周期。
④指令周期:完成 1 条指令所占用的全部时间,它以机器周期为单位。
例如:外接晶振为 12MHz 时,51 单片机相关周期的具体值为:
振荡周期=1/12us;
状态周期=1/6us;
机器周期=1us;
指令周期=1~4us;
1.2 单片机定时/计数器结构:
上图中的 T0 和 T1 引脚对应的是单片机 P3.4 和 P3.5 管脚。51 单片机定时/
计数器的工作由两个特殊功能寄存器控制。TMOD 是定时/计数器的工作方式寄存
器,确定工作方式和功能;TCON 是控制寄存器,控制 T0、T1 的启动和停止及
设置溢出标志。
1.2.1 工作方式寄存器 TMOD:
GATE 是门控位, GATE=0 时,用于控制定时器的启动是否受外部中断源信号 的影响。只要
用软件使 TCON 中的 TR0 或 TR1 为 1,就可以启动定时/计数器工作;
GATA=1 时,要用软件使 TR0 或 TR1 为 1,同时外部中断引脚 INT0/1 也为高电平
时,才
能启动定时/计数器工作。即此时定时器的启动条件,加上了 INT0/1 引脚
为高电平这一条件。
C/T :定时/计数模式选择位。C/T =0 为定时模式;C/T =1 为计数模式。
M1M0:工作方式设置位。定时/计数器有四种工作方式。
1.3 定时器配置:
TMOD定时器的工作方式选择, 为什么是TMOD 或等于 TMOD, 原因是,如果直接等于,相当于写死了,所以这里需要或等于.
TH0和TL0是定时器初始值赋值的高四位和低四位, 这里是怎么得到的这个16机制的, 好比你的单片机51晶振是12赫兹的,换算后是FC18,这是1ms的换算, 这里怎么换算就不赘述了,可以使用小工具换算.
EA 是打开总定时器, ET0和TR0分别是中断允许,以及打开定时器.
二 代码分析:
1. 定义定时器中断初始化函数,里边就是开启定时器以及一些其他的设置,这里上表已经详细解释了.
2. 这里主要分析一下使LED1闪烁的函数代码,这里要注意变量哪里一定要,定义静态变量,还有判断是否等于1000后进入语句里,一定要将i=0;不然下一次会在原来的基础上进行++; 那样永远进入不了if判断这里要注意下. 其他的代码注释很详细的说明了.
三 源代码:
//51单片机定时器实验
#include "reg52.h"
sbit LED1 = P2^0;
typedef unsigned char u8;
typedef unsigned int u16;
//函数的定义—————————–
//定时器的初始化函数定义
void time0_init(void)
{
TMOD |= 0X01; //选择为定时器0模式,工作方式1
TH0 = 0XFC; //给定时器赋初值,定时1ms
TL0 = 0X66;
ET0 = 1; //打开定时器0中断允许
EA = 1; //打开总中断
TR0 = 1; //打开定时器
}
//通过定时器中断实现LED1的闪烁
void time0() interrupt 1
{
static u16 i = 0; //定义静态变量,下次循环保留上次值
TH0 = 0XFC; //给定时器赋初值,定时1ms
TL0 = 0X66;
i++; //每次进来i++;
if(i == 1000) //判断i==1000 ,也就是1秒进入判断为真
{
i= 0; //将i赋值为零,原因是如果这次i==1000后出去后,因为i为静态变量会保留上次的值,因此这里要赋值0
LED1 = !LED1;
}
}
//主函数
int main()
{
time0_init(); //通过外部中断进行计时
while(1)
{
}
}
作者:ZL1392010