1-2 非阻塞延时实现LED闪烁功能(累计定时中断次数)--多路软件定时器的功能实现

单路

#include 
#include "delay.h"

#define LED_SHINE_TIME 1000//1s

unsigned int g_u16_timer_cnt;//在定时器的基础上进行计数
unsigned char g_u8_time_flag;//时间到的标志
unsigned char g_u8_timer_soft_enable;//定时器的软件开关

sbit LED0=P1^0;
sbit LED1=P1^1;

void Timer0Init(void);		//1毫秒@12.000MHz

void main()
{
	g_u16_timer_cnt=LED_SHINE_TIME;
	g_u8_timer_soft_enable=1;
	g_u8_time_flag=0;
	
	Timer0Init();
	
	while(1)
	{
		if(g_u8_time_flag==1)
		{
			g_u8_time_flag=0;
			LED0=~LED0;
			g_u16_timer_cnt=LED_SHINE_TIME;
		}
	}
}

//中断服务函数
void timer0_isr() interrupt 1
{
	TR0=0;//关定时器
	if(g_u8_timer_soft_enable)
	{
		g_u16_timer_cnt--;
		if(!g_u16_timer_cnt)
		{
			g_u8_time_flag=1;//代表软件的定时时间到
		}
	}
	
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	
	TR0=1;//开定时器
}

//定时器的初始化
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	ET0=1;
	EA=1;
	TR0 = 1;		//定时器0开始计时
}

多路

#include 
#include "delay.h"

#define LED1_SHINE_TIME 1000//1s
#define LED2_SHINE_TIME 2000//2s

unsigned int g_u16_timer1_cnt;//在定时器的基础上进行计数
unsigned char g_u8_time1_flag;//时间到的标志
unsigned char g_u8_timer1_soft_enable;//定时器的软件开关

unsigned int g_u16_timer2_cnt;//在定时器的基础上进行计数
unsigned char g_u8_time2_flag;//时间到的标志
unsigned char g_u8_timer2_soft_enable;//定时器的软件开关

sbit LED1=P1^0;
sbit LED2=P1^1;

void Timer0Init(void);		//1毫秒@12.000MHz

void main()
{
	g_u16_timer1_cnt=LED1_SHINE_TIME;
	g_u8_timer1_soft_enable=1;
	g_u8_time1_flag=0;
	
	g_u16_timer2_cnt=LED2_SHINE_TIME;
	g_u8_timer2_soft_enable=1;
	g_u8_time2_flag=0;
	
	Timer0Init();
	
	while(1)
	{
		//LED1
		if(g_u8_time1_flag==1)
		{
			g_u8_time1_flag=0;
			LED1=~LED1;
			g_u16_timer1_cnt=LED1_SHINE_TIME;
		}
		//LED2
		if(g_u8_time2_flag==1)
		{
			g_u8_time2_flag=0;
			LED2=~LED2;
			g_u16_timer2_cnt=LED2_SHINE_TIME;
		}
	}
}

//中断服务函数
void timer0_isr() interrupt 1
{
	TR0=0;//关定时器
	//LED1
	if(g_u8_timer1_soft_enable)
	{
		g_u16_timer1_cnt--;
		if(!g_u16_timer1_cnt)
		{
			g_u8_time1_flag=1;//代表软件的定时时间到
		}
	}
	//LED2
	if(g_u8_timer2_soft_enable)
	{
		g_u16_timer2_cnt--;
		if(!g_u16_timer2_cnt)
		{
			g_u8_time2_flag=1;//代表软件的定时时间到
		}
	}
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	
	TR0=1;//开定时器
}

//定时器的初始化
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	ET0=1;
	EA=1;
	TR0 = 1;		//定时器0开始计时
}

省略软件开关标志,优化代码,节省空间

#include 
#include "delay.h"

#define LED1_SHINE_TIME 1000//1s
#define LED2_SHINE_TIME 2000//2s

unsigned int g_u16_timer1_cnt;//在定时器的基础上进行计数
unsigned char g_u8_time1_flag;//时间到的标志
//unsigned char g_u8_timer1_soft_enable;//定时器的软件开关

unsigned int g_u16_timer2_cnt;//在定时器的基础上进行计数
unsigned char g_u8_time2_flag;//时间到的标志
//unsigned char g_u8_timer2_soft_enable;//定时器的软件开关

sbit LED1=P1^0;
sbit LED2=P1^1;

void Timer0Init(void);		//1毫秒@12.000MHz

void main()
{
	g_u16_timer1_cnt=LED1_SHINE_TIME;
	//g_u8_timer1_soft_enable=1;
	g_u8_time1_flag=0;
	
	g_u16_timer2_cnt=LED2_SHINE_TIME;
	//g_u8_timer2_soft_enable=1;
	g_u8_time2_flag=0;
	
	Timer0Init();
	
	while(1)
	{
		//LED1
		if(g_u8_time1_flag==1)
		{
			g_u8_time1_flag=0;
			LED1=~LED1;
			g_u16_timer1_cnt=LED1_SHINE_TIME;
		}
		//LED2
		if(g_u8_time2_flag==1)
		{
			g_u8_time2_flag=0;
			LED2=~LED2;
			g_u16_timer2_cnt=LED2_SHINE_TIME;
		}
	}
}

//中断服务函数
void timer0_isr() interrupt 1
{
	TR0=0;//关定时器
	//LED1
	if(g_u16_timer1_cnt)
	{
		g_u16_timer1_cnt--;
		if(!g_u16_timer1_cnt)
		{
			g_u8_time1_flag=1;//代表软件的定时时间到
		}
	}
	//LED2
	if(g_u16_timer2_cnt)
	{
		g_u16_timer2_cnt--;
		if(!g_u16_timer2_cnt)
		{
			g_u8_time2_flag=1;//代表软件的定时时间到
		}
	}
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	
	TR0=1;//开定时器
}

//定时器的初始化
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	ET0=1;
	EA=1;
	TR0 = 1;		//定时器0开始计时
}

硬件定时器不够的时候可以用这种软件定时器的方法,如果不需要哪个软件计时器,设成0即可

这里用的定时计数器,所以定时时间比较准确

你可能感兴趣的:(单片机充电记录,单片机,嵌入式硬件)