利用霍尔元件测转速源程序
源程序如下:
#include
#define T0HIGH 0x3C //*计数器0初值高字节值
#define T0LOW 0xB0 //*计数器0初值低字节值
sbit P3_5=P3^5; //*定义位变量
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_3=P3^3;
sbit P3_7=P3^7;
void count(void); //*计算转速函数
void display(void); //*数码管显示函数
void disp_init (void); //*初始化函数
unsigned char i,number;
unsigned int n,len[4], sum=0;
char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; //*共阳极数码管真值表
void main(void)
{
disp_init(); //*初始化
while (1) //*计脉冲个数
{ while (!P3_3){}
if(P3_3) { //*高电平计一个数 sum++;
while(P3_3){} //*高电平等待
}
} //*如果溢出转中断函数执行 }
void count(void)
{
n=sum*20; //*计算转速
if(n>6000&&n
len[0]=0;
len[1]=0;
len[2]=0;
len[3]=0;
}
len[0]=n/1000; //*计算千位数
len[1]=n%1000/100; //*计算百位数
len[2]=n%1000%100/10; //计算十位数
len[3]=n%10; //*计算个位数
}
void display(void)
{
for (i=0;i
P1=number;
}
void disp_init (void)
{
for(i=0;i
{ //*检查数码管是否正常工作 P3_0=0;
P3_1=1;
P3_5=1;
P3_7=1;
P1=0x82;
P3_0=1;
P3_1=0;
P3_5=1;
P3_7=1;
P1=0x82;
P3_0=1;
P3_1=1;
P3_5=0;
P3_7=1;
P1=0x82;
P3_0=1;
P3_1=1;
P3_5=1;
P3_7=0;
P1=0x82;
}
TMOD=0x1; //*初始化定时器 TCON=0x00;
TH0=T0HIGH;
TL0=T0LOW;
IE=0x82;
TR0=1;
}
void system_tick(void) interrupt 1 /*定时器中断函数 */ {
static unsigned char second_cnt=20;
TR0=0;
TH0=T0HIGH;
TL0=T0LOW;
second_cnt--;
if(!second_cnt)
{ /*一秒钟到送出显示*/ count( );
P3_7=0; /*显示个位数*/ P3_5=1;
P3_1=1;
P3_0=1;
number=table[len[3]];
display();
P3_7=1;
P3_5=0;
P3_1=1;
P3_0=1;
P3_7=1;
P3_5=1;
P3_1=0;
P3_0=1;
number=table[len[1]];
display( );
P3_7=1;
P3_5=1;
P3_1=1;
P3_0=0;
number=table[len[0]];
display( );
second_cnt=20;
sum=0;
TR0=1;
}
TR0=1;
}
//*显示十位数 //*显示百位数 //*显示千位数 //*重新计数