#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit k3=P3^2; //脉冲采集端口
uint N=0;
uint i,Z;
uchar count=0;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
bit flag_1s=0;
uint C_50ms;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管
void delay(uint t) //延时函数
{
uint a;
for(;t>0;t--)
for(a=123;a>0;a--);
}
void Init_INT0() //外部中断0初始化
{
IT0=1; //0为电平触发,1为下降沿触发
EX0=1; //开外部中断0
EA=1; //开启总中断
}
void int0() interrupt 0 //外部中断0中断函数
{
TMOD|=0x01;//设置T0位工作方式1——作为16位定时器
TH0=0X3C;//装入初值
TL0=0XB0;
ET0=1;//打开定时器0的中断
TR0=1;//打开定时器0
EA=1; //开启总中断0
++count;
if(count==2) //两次外部脉冲,电机转一圈。
{
Z++;//转圈+1
count=0;//初始计数值
}
}
void Timer0() interrupt 1 //定时器0中断函数
{
TH0=0X3C;//装入初值
TL0=0XB0;
/*TR0=1;//打开定时器0
ET0=1;//打开定时器0的中断 */
if(++C_50ms>19)
{
TR0=0;//关闭定时器0中断
EX0=0;//关闭外部中断0
C_50ms=0;//定时1s之后C_50ms清零
N=60*Z;//计算转速
flag_1s=1;//1s标志位置1
Z=0;//初始化圈数
/*TH0=0X3C;//装入初值
TL0=0XB0; */
EX0=1;//打开外部中断0,开始计数。
}
}
void digdisplay() //数码管显示函数
{
uchar qian,bai,shi,ge,a;
qian=N/1000;
bai=N%1000/100;
shi=N%100/10;
ge=N%10;
for(a=3;a>=0;a--)
{
switch(a) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;
P0=table[qian];
delay(5); break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0;
P0=table[bai];
delay(5); break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0;
P0=table[shi];
delay(5); break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0;
P0=table[ge];
delay(5); break;//显示第3位
}
}
}
void main() //主函数
{
Init_INT0();
P0=0x00;
while(1)
{
if(flag_1s==1)
{
flag_1s=0;//1s标志位清零
digdisplay();
}
}
} |