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

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

相关推荐
li星野1 分钟前
打工人日报#20251215
单片机·嵌入式硬件
清风6666663 分钟前
基于单片机的压力机润滑油泵与主电机控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
飞来客isdn8 分钟前
GD32F407ZGT6在FreeRTOS下串口中断接收异常情况及解决方法
单片机·mcu·freertos·信息与通信
枫叶机关录10 分钟前
有刷直流电机与无刷直流电机——结构、原理与控制
嵌入式硬件·机器人·直流电机
点灯小铭30 分钟前
基于51单片机的频率可调多波形函数发生器设计与实现
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
俊俊谢1 小时前
华大HC32F460配置JTAG调试引脚为普通GPIO(PB03、PA15等)
嵌入式硬件·嵌入式·arm·嵌入式软件·hc32f460
芯联智造1 小时前
【stm32简单外设篇】- 高灵敏麦克风传感器模块 KY-037
c语言·stm32·单片机·嵌入式硬件
三佛科技-134163842121 小时前
点焊机方案开发,点焊机MCU控制方案设计
单片机·嵌入式硬件·智能家居·pcb工艺
brave and determined2 小时前
传感器学习(day06):PM2.5传感器技术全解析
嵌入式硬件·嵌入式开发·嵌入式应用·嵌入式设计·pm2.5·微量振荡天平·beta射线法
鸿喵小仙女3 小时前
HC32 SWDT看门狗
单片机·嵌入式硬件·hc32