发表于:2011/9/2 9:41:18
#0楼
请问一下各位高手,T2定时器一直都开不了,是怎么回事?
# include <at89x52.h>
sbit V1=P3^0;
sbit V2=P3^1;
sbit V3=P3^2;
////////////////////////////////////////////////////////////////////////////////////
//函数名: Wait_Ms()
//功 能: 延时,单位大概是 1ms
//输 入: 延时值 i 单位为mS
//输 出: 无
///////////////////////////////////////////////////////////////////////////////////
void Wait_MS (unsigned char i)
{
int j;
for(i;i<0;i--)
{
for(j=0;j<178;j++);
}
}
/
////////////////////////////////////////////////////////////////////////////////////
//函数名: timer 0()
//功 能: 定时器中断0,X轴方向速度
//输 入: 无
//输 出: 无
////////////////////////////////////////////////////////////////////////////////////
void timer0(void) interrupt 1 //T0中断
{ TR1=0;
TR2=0;
V1=!V1;
}
////////////////////////////////////////////////////////////////////////////////////
//函数名: timer 1()
//功 能: 定时器中断1,y轴方向速度
//输 入: 无
//输 出: 无
////////////////////////////////////////////////////////////////////////////////////
void timer1(void) interrupt 3//T1中断
{ TR0=0;
TR2=0;
V2=!V2;
}
////////////////////////////////////////////////////////////////////////////////////
//函数名: timer 2()
//功 能: 定时器中断2,z轴方向速度
//输 入: 无
//输 出: 无
////////////////////////////////////////////////////////////////////////////////////
void timer2(void) interrupt 5 //T2中断
{ TR0=0;
TR1=0;
TF2=0; // T2定时器发生溢出中断时,需要用户软件清除溢出标记,而51的其他定时器是自动清除的
V3=!V3;
}
////////////////////////////////////////////////////////////////////////////////////
//函数名: Scan_key()
//功 能: 按键扫描
//输 入: 无
//输 出: 无
////////////////////////////////////////////////////////////////////////////////////
unsigned char Scan_key()
{
unsigned char i,k;
i = P1 & 0x1c; //hllibs
if(i == 0x1c)
{
k = 0; //无按键按下
}
else
{
//Wait_MS(10); //延时去抖
switch(i)
{
case 0x18:k=1;break;
case 0x14:k=2;break;
case 0x0c:k=3;break;
}
}
return k;
}
////////////////////////////////////////////////////////////////////////////////////
//函数名: main()
//功 能: 主程序的入口,一维移动速度为0-150mm/S可调
//输 入: 无
//输 出: 无
////////////////////////////////////////////////////////////////////////////////////
void main()
{
int key_val=0;
EA=0;
TMOD=0x22; //T0定时器工作方式2,T1定时器工作方式2,8位自动重载
TH0= 0x8D; //4kHz频率,125uS中断一次 ,256-125uS*11.0592M/12=141=0x8D
TL0= 0x8D;
TH1= 0x8D;
TL1= 0x8D;
TH2= 0xFF;
TL2= 0xD8;
RCAP2H=0xFF; //4kHz频率,125uS中断一次,65536-125uS*11.0592M/12=65421=0xFF8D
RCAP2L=0xD8;
T2CON=0x00; //T2定时器工作方式 为16位定时器自动重载
EA=1;
ET0=1;
ET1=1;
ET2=1;
V1=0;
V2=0;
V3=0;
//unsigned int hz_shu=4KHZ
//T0_cnt=0;
//T1_cnt=0;
//T2_cnt=0;
Wait_MS(200);
//T0_over_num=get_T_over_num(hz_shu);
//T1_over_num=get_T_over_num(hz_shu);
//T2_over_num=get_T_over_num(hz_shu);
while(1)
{
key_val = Scan_key(); //扫描按键
if(key_val != 0)
Wait_MS(10);
if(key_val != 0)
{
switch(key_val)
{
case 1:TR0=1;break; //开启定时器T0
case 2:TR1=1;break; //开启定时器T1
case 3:TR2=1;break; //开启定时器T2
}
}
else
{
TR0=0; //无产生脉冲按键按下时,关闭所有定时器
TR1=0;
TR2=0;
}
}
}
# include <at89x52.h>
sbit V1=P3^0;
sbit V2=P3^1;
sbit V3=P3^2;
////////////////////////////////////////////////////////////////////////////////////
//函数名: Wait_Ms()
//功 能: 延时,单位大概是 1ms
//输 入: 延时值 i 单位为mS
//输 出: 无
///////////////////////////////////////////////////////////////////////////////////
void Wait_MS (unsigned char i)
{
int j;
for(i;i<0;i--)
{
for(j=0;j<178;j++);
}
}
/
////////////////////////////////////////////////////////////////////////////////////
//函数名: timer 0()
//功 能: 定时器中断0,X轴方向速度
//输 入: 无
//输 出: 无
////////////////////////////////////////////////////////////////////////////////////
void timer0(void) interrupt 1 //T0中断
{ TR1=0;
TR2=0;
V1=!V1;
}
////////////////////////////////////////////////////////////////////////////////////
//函数名: timer 1()
//功 能: 定时器中断1,y轴方向速度
//输 入: 无
//输 出: 无
////////////////////////////////////////////////////////////////////////////////////
void timer1(void) interrupt 3//T1中断
{ TR0=0;
TR2=0;
V2=!V2;
}
////////////////////////////////////////////////////////////////////////////////////
//函数名: timer 2()
//功 能: 定时器中断2,z轴方向速度
//输 入: 无
//输 出: 无
////////////////////////////////////////////////////////////////////////////////////
void timer2(void) interrupt 5 //T2中断
{ TR0=0;
TR1=0;
TF2=0; // T2定时器发生溢出中断时,需要用户软件清除溢出标记,而51的其他定时器是自动清除的
V3=!V3;
}
////////////////////////////////////////////////////////////////////////////////////
//函数名: Scan_key()
//功 能: 按键扫描
//输 入: 无
//输 出: 无
////////////////////////////////////////////////////////////////////////////////////
unsigned char Scan_key()
{
unsigned char i,k;
i = P1 & 0x1c; //hllibs
if(i == 0x1c)
{
k = 0; //无按键按下
}
else
{
//Wait_MS(10); //延时去抖
switch(i)
{
case 0x18:k=1;break;
case 0x14:k=2;break;
case 0x0c:k=3;break;
}
}
return k;
}
////////////////////////////////////////////////////////////////////////////////////
//函数名: main()
//功 能: 主程序的入口,一维移动速度为0-150mm/S可调
//输 入: 无
//输 出: 无
////////////////////////////////////////////////////////////////////////////////////
void main()
{
int key_val=0;
EA=0;
TMOD=0x22; //T0定时器工作方式2,T1定时器工作方式2,8位自动重载
TH0= 0x8D; //4kHz频率,125uS中断一次 ,256-125uS*11.0592M/12=141=0x8D
TL0= 0x8D;
TH1= 0x8D;
TL1= 0x8D;
TH2= 0xFF;
TL2= 0xD8;
RCAP2H=0xFF; //4kHz频率,125uS中断一次,65536-125uS*11.0592M/12=65421=0xFF8D
RCAP2L=0xD8;
T2CON=0x00; //T2定时器工作方式 为16位定时器自动重载
EA=1;
ET0=1;
ET1=1;
ET2=1;
V1=0;
V2=0;
V3=0;
//unsigned int hz_shu=4KHZ
//T0_cnt=0;
//T1_cnt=0;
//T2_cnt=0;
Wait_MS(200);
//T0_over_num=get_T_over_num(hz_shu);
//T1_over_num=get_T_over_num(hz_shu);
//T2_over_num=get_T_over_num(hz_shu);
while(1)
{
key_val = Scan_key(); //扫描按键
if(key_val != 0)
Wait_MS(10);
if(key_val != 0)
{
switch(key_val)
{
case 1:TR0=1;break; //开启定时器T0
case 2:TR1=1;break; //开启定时器T1
case 3:TR2=1;break; //开启定时器T2
}
}
else
{
TR0=0; //无产生脉冲按键按下时,关闭所有定时器
TR1=0;
TR2=0;
}
}
}