给你个测转速的参考下
#include<at89x51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key=P3^0;
sbit f=P1^1;
uint cur_r;
uint cur_ms,cur_sec;//当前毫秒,秒
uint couter; //脉冲数量
uchar code design[10]={0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60};
//*******************************************************************
//***************initial*********************************************
void initial(void)
{ couter=cur_r=0;
TMOD=0x01;
TH0=0xb1;
TL0=0xe0;
EA=1;
EX0=0;
IT0=1;
}
//延时***************************************************************
//delay()************************************************************
void delay(uint i)
{ uint j;
for(;i>0;i--)
for(j=0;j<120;j++)
{;}
}
//外部中断***********************************************************
//caculate外部脉冲数量***********************************************
void intrp0(void) interrupt 0
{ couter++;
}
//定时器1中断********************************************************
//20ms中断***********************************************************
//编码器采用100PULSE/R的*********************************************
void intrp1(void) interrupt 1
{ TH0=0xb1;
TL0=0xe0;
if(cur_ms<50){cur_ms++;}
else
{ cur_ms=0;
cur_sec++;
if(cur_sec>=2)
{ EX0=0; //计算时禁止外部中断,停止计数
ET0=0;
TR0=0;
cur_r=couter*3/10; //当前转速
cur_ms=0;
cur_sec=0;
couter=0;
EX0=1; //重新开启脉冲计数
ET0=1;
TR0=1;
f=~f;
cur_sec=0;
}
}
}
//显示接口***********************************************************
//P0为数码管显示接口,P1为数码管控制接口*****************************
void display(uint x)
{ uint g_wei,s_wei,b_wei;//个位,十位,百位
if(x>=999){x=999;}//限制为999R/MIN
b_wei=x/100;
s_wei=(x-b_wei*100)/10;
g_wei=(x-b_wei*100-s_wei*10)%10;
//百位显示
P0=design[b_wei];
P2=0xfe;
delay(5);
//十位显示
P0=design[s_wei];
P2=0xfd;
delay(5);
//个位显示
P0=design[g_wei];
P2=0xfb;
delay(5);
}
//*******************************************************************
//main***************************************************************
void main()
{ initial();
while(1)
{ display(cur_r);
if(key){EX0=0;ET0=0;TR0=0;} //按下停止按钮
else {EX0=1;ET0=1,TR0=1;}
}
}
|