/*
毫秒级延时函数
*/
void DelayXms(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=124;j>0;j--);
}
延时函数:独占性的延时函数,其在运行时,整个系统都将处于停止等待的状态。
软件延时器:由于不利于多任务并行,因此需要改造该延时函数,使其具有多任务并行能力,它在启动时,不能因为自己对时间的需求而导致系统及系统中其它任务都眼巴巴的等着它。
阻塞延时实现LED闪烁
#include <reg51.h>
#include "delay.h"
sbit LED=P1^0;
void main()
{
while(1)
{
LED=0;
delay_xms(500);
LED=1;
delay_xms(500);
}
}
不好完成多个LED不同频率的闪烁
非阻塞延时实现LED闪烁
#include <reg51.h>
#include "delay.h"
sbit LED=P1^0;
#define LED_DELAY_TIME 5000
unsigned int u16_led_cnt;
unsigned char u8_led_delay_flag;
void main()
{
u16_led_cnt=LED_DELAY_TIME;
while(1)
{
if(u16_led_cnt)
{
u16_led_cnt--;
if(!u16_led_cnt)//计时时间到
{
u8_led_delay_flag=1;
}
}
if(u8_led_delay_flag==1)
{
u8_led_delay_flag=0;
u16_led_cnt=LED_DELAY_TIME;
LED=~LED;
}
}
}
多个LED灯不同频率闪烁(并行多任务)
#include <reg51.h>
#include "delay.h"
sbit LED0=P1^0;
sbit LED1=P1^1;
#define LED0_DELAY_TIME 5000
#define LED1_DELAY_TIME 2000
unsigned int u16_led0_cnt;
unsigned char u8_led0_delay_flag;
unsigned int u16_led1_cnt;
unsigned char u8_led1_delay_flag;
void main()
{
u16_led0_cnt=LED0_DELAY_TIME;
u16_led1_cnt=LED1_DELAY_TIME;
while(1)
{
//LED0
if(u16_led0_cnt)
{
u16_led0_cnt--;
if(!u16_led0_cnt)//计时时间到
{
u8_led0_delay_flag=1;
}
}
if(u8_led0_delay_flag==1)
{
u8_led0_delay_flag=0;
u16_led0_cnt=LED0_DELAY_TIME;
LED0=~LED0;
}
//LED1
if(u16_led1_cnt)
{
u16_led1_cnt--;
if(!u16_led1_cnt)//计时时间到
{
u8_led1_delay_flag=1;
}
}
if(u8_led1_delay_flag==1)
{
u8_led1_delay_flag=0;
u16_led1_cnt=LED1_DELAY_TIME;
LED1=~LED1;
}
}
}
但是这种方式会随着任务的增多时间变得不均匀,要想时间更加均匀要借助定时器。