zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

51单片机定时器的配置与使用

配置单片机 定时器 51 使用
2023-09-11 14:21:43 时间

定时器

定时器介绍:

51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成

定时器作用:
(1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
(2)替代长时间的Delay,提高CPU的运行效率和处理速度

(…)

定时器0初始化

在这里插入图片描述

定时器1初始化

在这里插入图片描述

中断源

在这里插入图片描述

#include "reg52.h"

typedef unsigned int u_int;
sbit LED1 = P2^1;
sbit LED0 = P2^0;

void Timer0Init()			//12MHz
{
	TMOD |= 0x01;		//0000 0001,低四位用于T0,GATE=0;C/T=0;M1M0=01:16位定时/计数器,与运算为了不让其它位受影响
	TH0 = 0xFC;			//给定时器赋初值,分为两个寄存器,一个配置高位,一个配置低位,单位是1us
					   //这里定时1ms,1ms=1000us,初值=65535-1000+1=64536,转为十六进制是0xFC18;
	TL0 = 0x18;
	ET0 = 1;		//打开定时器0中断允许
	EA = 1;			//打开中断总开关
	TR0 = 1;		//控制寄存器TCON的TR0,置1时定时器开启工作,置0时停止工作
}

//当定时器满时,会跳到中断处理函数
void Timer0interrupt() interrupt 1
{
	u_int mount;
	static u_int i;			//设定一个全局变量
	TH0 = 0xFC;				//当计时满溢出后,这两个标志位会清零,这时要给其重新上初始值
	TL0 = 0x18;
	i++;
	if(i == 1000)			//如果计时满1秒
	{
		i = 0;
		LED1 = ~LED1;			//LED灯亮灭
		
		//D2亮10次后点亮D1
		if(LED1 == 0)
		{
			mount++;
			if(mount == 10)
			{
				mount = 0;
				LED0 =~ LED0;
			}
		}
		
	}
}
int main()
{
	Timer0Init();
	while(1)
	{
	}
}

注意:定时器的的中断处理函数不一定要放到main.c文件中,也可以放到其他的文件,处理函数要用到变量可以在对应文件中声明,如果该变量要在main函数中改变的,如PWM控制的compare比较值,可以在main.c文件的开头声明该变量,用extern关键字

extern unsigned char compare