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

单路

cpp 复制代码
#include <reg51.h>
#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开始计时
}

多路

cpp 复制代码
#include <reg51.h>
#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开始计时
}

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

cpp 复制代码
#include <reg51.h>
#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即可

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

相关推荐
保安大队王队长11 小时前
51单片机知识
单片机·嵌入式硬件·51单片机
一条破秋裤11 小时前
20_串口通信基础与USART流程
stm32·单片机
一条破秋裤12 小时前
22_串口HEX与文本数据包收发
stm32·嵌入式硬件
sunoo-22912 小时前
51单片机学习Day2:数码管动态扫描、定时器与中断系统深度总
单片机·嵌入式硬件·学习·51单片机
sweetone12 小时前
索尼MHC-V7700组合音响一修一改
经验分享·嵌入式硬件·音视频
小娄~~13 小时前
LVGL,STM32U575RIT6+指纹模块
stm32·单片机·嵌入式硬件
Brilliantwxx13 小时前
【STM32】 HAL库深度入门:从设计思想到 USART 全模式实战
stm32·单片机·嵌入式硬件
恒锐丰科技林技术员13 小时前
EG1192S:高耐压零功耗使能降压 DC‑DC 芯片,拓宽工业电源设计边界
经验分享·嵌入式硬件·硬件工程
深圳市恒锐丰科技杨生14 小时前
EG1192L 零功耗使能集成上管非同步降压 DC‑DC|屹晶 EGmicro
嵌入式硬件·硬件工程
JNX_SEMI14 小时前
HTD8239 5.5V~36V宽压H桥驱动:适配12V/24V主流电机供电系统
单片机·嵌入式硬件