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

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

相关推荐
hsjiasb6 小时前
FreeRTOS学习(二十三)——消息缓冲区(Message Buffer)
stm32·单片机·嵌入式硬件·学习·freertos
我是海飞8 小时前
杰理JL703N SSD1306 OLED(128x64) 点阵屏移植说明
单片机·算法·嵌入式·音频·杰理
沸速存储10 小时前
CPU 和 GPU 核心差别在哪?为什么 AI 训练离不开 GPU
服务器·人工智能·科技·嵌入式硬件·电脑
wuyk55510 小时前
2.队列:先进先出的线性数据结构
c语言·数据结构·stm32·单片机
我不会JAVA!11 小时前
【无标题】
嵌入式硬件·h.264
芯岭技术郦11 小时前
OM6625A芯片 Timer 定时器计数模式使用说明
stm32·单片机·嵌入式硬件
Dr.kangder13 小时前
嵌入式面试总结(八)——大小端
嵌入式硬件·面试·职场和发展·架构·嵌入式
zlinear数据采集卡14 小时前
D223的SRAM硬件记录仪:外部触发与瞬态波形捕获方案
arm开发·嵌入式硬件·fpga开发·开源
zcmodeltech14 小时前
双碳沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的碳捕集-零碳园区-综合能源全场景联动方案
stm32·嵌入式硬件·能源·嵌入式实时数据库·多分类
LCG米15 小时前
STM32零基础入门教程:从环境搭建到实战项目(点亮LED + 串口打印 + 呼吸灯)
stm32·单片机·嵌入式硬件