我打开了一个定时器和一个外部中断,定时器没有用起来,不知道怎么回事。设置了优先级,定时器优先。请教一下。
时间:10-02
整理:3721RD
点击:
#include <REGX52.H>
#include <dulianjian_diceng.h>
#include <lcd1602_drive.h>
//--定义使用的IO口--//
sbit PWM1=P1^0;
sbit PWM2=P1^1;
//--定义全局变量--//
unsigned char timer0,timer1,timer2;
unsigned int i,j,k;
unsigned char anjian;
//定时器设定//
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0FC;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
PT0=1;
// PT0H=1;
IT1=1;//设置外部中断1为跳变沿触发方式
EX1=1;//打开外部中断1中断允许
// PX1H=0;
PX1=0;
}
void main (void)
{
/****************************数据初始化*********************/
i=100;
j=0;
k=0;
while(1)
{
InitTimer0();
/************************1602led显示设定******************************/
/* LCD_PRINT(1,5,1,(j/10000)%10);
LCD_PRINT(1,6,1,(j/1000)%10);
LCD_PRINT(1,7,1,(j/100)%10);
LCD_PRINT(1,8,1,(j/10)%10);
LCD_PRINT(1,9,1,j%10);
LCD_PRINTF(1,12,"rpm%d"); */
LCD_PRINT(1,5,1,(k/10000)%10);
LCD_PRINT(1,6,1,(k/1000)%10);
LCD_PRINT(1,7,1,(k/100)%10);
LCD_PRINT(1,8,1,(k/10)%10);
LCD_PRINT(1,9,1,k%10);
LCD_PRINTF(1,12,"rpm%d");
/************************1602led显示设定******************************/
/******************PWM的设定************************/
if(timer1>1000) //PWM周期为100*0.5ms
{
timer1=0;
}
if(timer1 < 0 ) //改变这个值可以改变直流电机的速度
{
PWM1=1;
}
else
{
PWM1=0;
}
if(timer2>1000) //PWM周期为100*0.5ms
{
timer2=0;
}
if(timer2 < i) //改变这个值可以改变直流电机的速度
{
PWM2=1;
}
else
{
PWM2=0;
}
/******************PWM的设定************************/
}
}
//定时器功能//
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x0FC;
TL0 = 0x18; //重新赋初值
EA=0;
timer0++;
timer1++;
timer2++;
anjian=dulianjian();
if(anjian!=0)
{i=10*anjian+100;}
if(timer0>1000)
{
timer0=0;
k=j/1000;
j=0;
}
EA=1;
}
void Intl_Routine(void) interrupt 2
{
j++;
}
程序如上
#include <dulianjian_diceng.h>
#include <lcd1602_drive.h>
//--定义使用的IO口--//
sbit PWM1=P1^0;
sbit PWM2=P1^1;
//--定义全局变量--//
unsigned char timer0,timer1,timer2;
unsigned int i,j,k;
unsigned char anjian;
//定时器设定//
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0FC;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
PT0=1;
// PT0H=1;
IT1=1;//设置外部中断1为跳变沿触发方式
EX1=1;//打开外部中断1中断允许
// PX1H=0;
PX1=0;
}
void main (void)
{
/****************************数据初始化*********************/
i=100;
j=0;
k=0;
while(1)
{
InitTimer0();
/************************1602led显示设定******************************/
/* LCD_PRINT(1,5,1,(j/10000)%10);
LCD_PRINT(1,6,1,(j/1000)%10);
LCD_PRINT(1,7,1,(j/100)%10);
LCD_PRINT(1,8,1,(j/10)%10);
LCD_PRINT(1,9,1,j%10);
LCD_PRINTF(1,12,"rpm%d"); */
LCD_PRINT(1,5,1,(k/10000)%10);
LCD_PRINT(1,6,1,(k/1000)%10);
LCD_PRINT(1,7,1,(k/100)%10);
LCD_PRINT(1,8,1,(k/10)%10);
LCD_PRINT(1,9,1,k%10);
LCD_PRINTF(1,12,"rpm%d");
/************************1602led显示设定******************************/
/******************PWM的设定************************/
if(timer1>1000) //PWM周期为100*0.5ms
{
timer1=0;
}
if(timer1 < 0 ) //改变这个值可以改变直流电机的速度
{
PWM1=1;
}
else
{
PWM1=0;
}
if(timer2>1000) //PWM周期为100*0.5ms
{
timer2=0;
}
if(timer2 < i) //改变这个值可以改变直流电机的速度
{
PWM2=1;
}
else
{
PWM2=0;
}
/******************PWM的设定************************/
}
}
//定时器功能//
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x0FC;
TL0 = 0x18; //重新赋初值
EA=0;
timer0++;
timer1++;
timer2++;
anjian=dulianjian();
if(anjian!=0)
{i=10*anjian+100;}
if(timer0>1000)
{
timer0=0;
k=j/1000;
j=0;
}
EA=1;
}
void Intl_Routine(void) interrupt 2
{
j++;
}
程序如上
我发现问题了,就是优先级有问题。
怎么设置定时器的执行优先级(物理优先级)?