51两个定时器一个用于计数一个用于精确延时的问题,用proteus仿真好像没进入中断
代码如下/**********************START**********************************/#include<reg51.h>/...
代码如下
/**********************START**********************************/
#include <reg51.h>
//参数宏定义
#define COUNTMAX 50 //计数50次
#define CYCLES0 20 //定时器0循环20圈为1s
#define CYCLES1 5 //定时器1循环5次
#define TURNLEFT P2 = 0X02
#define TURNRIGHT P2 = 0X01
#define STOP P2 = 0X00
unsigned char FLG_TIMER0 = 0;
unsigned char FLG_TIMER1 = 0;
unsigned int LOAD;
/* Timer0 定时1s */
/* Timer1 计数5次 */
void Timer0Init(void) //50毫秒@12.000MHz
{
// AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Timer0Reload(void)
{
ET0 = 0;
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
TF0 = 0; //清除TF0标志
ET0 = 1;
TR0 = 1; //定时器0开始计时
}
void Timer1Init(void) //50毫秒@12.000MHz
{
LOAD = 65535 - CYCLES1;
// AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x50; //设置定时器模式(计数模式)
TL1 = LOAD; //设置定时初值
TH1 = LOAD >>8; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
}
#ifdef RELOAD
void Timer1Reload(void)
{
ET1 = 0;
TL1 = LOAD; //设置定时初值
TH1 = LOAD >>8; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
}
#endif
/* Timer1 计数5次后 LED点亮 */
int main()
{
Timer1Init();
while(1);
return 0;
}
void timer0ISR() interrupt 1
{
Timer0Reload();
FLG_TIMER0 ++;
}
/*timer1计数5次后,执行timer1中断,timer0用于精确延时,时长为1s*/
void timer1ISR() interrupt 3
{
STOP;
Timer0Init();
while(FLG_TIMER0 == CYCLES0)
FLG_TIMER0 = 0;
TURNLEFT;
Timer0Init();
while(FLG_TIMER0 == CYCLES0)
FLG_TIMER0 = 0;
TURNRIGHT;
Timer0Init();
while(FLG_TIMER0 ==CYCLES0)
Timer1Init();
}
/* ************************************END**********************************/ 展开
/**********************START**********************************/
#include <reg51.h>
//参数宏定义
#define COUNTMAX 50 //计数50次
#define CYCLES0 20 //定时器0循环20圈为1s
#define CYCLES1 5 //定时器1循环5次
#define TURNLEFT P2 = 0X02
#define TURNRIGHT P2 = 0X01
#define STOP P2 = 0X00
unsigned char FLG_TIMER0 = 0;
unsigned char FLG_TIMER1 = 0;
unsigned int LOAD;
/* Timer0 定时1s */
/* Timer1 计数5次 */
void Timer0Init(void) //50毫秒@12.000MHz
{
// AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Timer0Reload(void)
{
ET0 = 0;
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
TF0 = 0; //清除TF0标志
ET0 = 1;
TR0 = 1; //定时器0开始计时
}
void Timer1Init(void) //50毫秒@12.000MHz
{
LOAD = 65535 - CYCLES1;
// AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x50; //设置定时器模式(计数模式)
TL1 = LOAD; //设置定时初值
TH1 = LOAD >>8; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
}
#ifdef RELOAD
void Timer1Reload(void)
{
ET1 = 0;
TL1 = LOAD; //设置定时初值
TH1 = LOAD >>8; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
}
#endif
/* Timer1 计数5次后 LED点亮 */
int main()
{
Timer1Init();
while(1);
return 0;
}
void timer0ISR() interrupt 1
{
Timer0Reload();
FLG_TIMER0 ++;
}
/*timer1计数5次后,执行timer1中断,timer0用于精确延时,时长为1s*/
void timer1ISR() interrupt 3
{
STOP;
Timer0Init();
while(FLG_TIMER0 == CYCLES0)
FLG_TIMER0 = 0;
TURNLEFT;
Timer0Init();
while(FLG_TIMER0 == CYCLES0)
FLG_TIMER0 = 0;
TURNRIGHT;
Timer0Init();
while(FLG_TIMER0 ==CYCLES0)
Timer1Init();
}
/* ************************************END**********************************/ 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询