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即可

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

相关推荐
安庆平.Я2 小时前
STM32——定时器
stm32·单片机·嵌入式硬件·定时器
ACP广源盛139246256732 小时前
(ACP广源盛)GSV2231---DisplayPort 1.4 MST 到 HDMI 2.0/DP/Type-C 转换器(带嵌入式 MCU)
c语言·开发语言·单片机·嵌入式硬件·音视频·mst
电鱼智能的电小鱼3 小时前
基于电鱼 ARM 边缘网关的智慧工地数据可靠传输方案——断点续传 + 4G/5G冗余通信,保障数据完整上传
arm开发·人工智能·嵌入式硬件·深度学习·5g·机器学习
范纹杉想快点毕业3 小时前
12个月嵌入式进阶计划ZYNQ 系列芯片嵌入式与硬件系统知识学习全计划(基于国内视频资源)
c语言·arm开发·单片机·嵌入式硬件·学习·fpga开发·音视频
NEU-UUN4 小时前
1.2.STM32简介——全程手敲板书
stm32·单片机·嵌入式硬件
三佛科技-134163842124 小时前
全自动削皮机方案,果蔬去皮机/削皮机MCU控制方案开发设计
单片机·嵌入式硬件
应用市场4 小时前
基于STM32的多模态智能门锁系统设计与实现
stm32·单片机·嵌入式硬件
xiaohai@Linux5 小时前
STM32在LVGL上实现移植FatFs文件系统(保姆级详细教程)
stm32·单片机·嵌入式硬件·lvgl·fatfs
Jerry丶Li5 小时前
二十二、STM32的ADC(二)(ADC单通道)
stm32·单片机·嵌入式硬件
飞睿科技5 小时前
超越蓝牙与Wi-Fi,UWB技术如何解锁手机下一波创新浪潮?
嵌入式硬件·物联网·智能手机·uwb