单路
#include <reg51.h>
#include "delay.h"#define LED_SHINE_TIME 1000//1sunsigned 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.000MHzvoid 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开始计时
}
多路
#include <reg51.h>
#include "delay.h"#define LED1_SHINE_TIME 1000//1s
#define LED2_SHINE_TIME 2000//2sunsigned 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.000MHzvoid 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){//LED1if(g_u8_time1_flag==1){g_u8_time1_flag=0;LED1=~LED1;g_u16_timer1_cnt=LED1_SHINE_TIME;}//LED2if(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;//关定时器//LED1if(g_u8_timer1_soft_enable){g_u16_timer1_cnt--;if(!g_u16_timer1_cnt){g_u8_time1_flag=1;//代表软件的定时时间到}}//LED2if(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开始计时
}
省略软件开关标志,优化代码,节省空间
#include <reg51.h>
#include "delay.h"#define LED1_SHINE_TIME 1000//1s
#define LED2_SHINE_TIME 2000//2sunsigned 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.000MHzvoid 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){//LED1if(g_u8_time1_flag==1){g_u8_time1_flag=0;LED1=~LED1;g_u16_timer1_cnt=LED1_SHINE_TIME;}//LED2if(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;//关定时器//LED1if(g_u16_timer1_cnt){g_u16_timer1_cnt--;if(!g_u16_timer1_cnt){g_u8_time1_flag=1;//代表软件的定时时间到}}//LED2if(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即可
这里用的定时计数器,所以定时时间比较准确