一 主要涉及到的知识点:
1.1 定时器的介绍:
1.2 单片机定时/计数器结构:
![](https://img-blog.csdnimg.cn/direct/a89780d70a1e417393bc3af8abbbd5ca.png)
1.2.1 工作方式寄存器 TMOD:
![](https://img-blog.csdnimg.cn/direct/7cc6f6620bec4182b0001ae5a3d486cc.png)
![](https://img-blog.csdnimg.cn/direct/2752da88a3d743b09f52e8dd9b266942.png)
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)
{
}
}