单路
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即可
这里用的定时计数器,所以定时时间比较准确