//单片机数字电感测试仪
//作者:吴汉清 ntwhq@tom.com
#include <reg51.h>
unsigned char j,n,t,DispBuf[3];
unsigned int L;
unsigned char code
BitTab[3]={0xdf,0xef,0xf7};//位驱动码
unsigned char code
DispTab[11]={0x41,0xcf,0x52,0x46,0xcc,0x64,0x60,0x4f,0x40,0x44,0xff};//字形码
sbit P1_2=P1^2;
sbit P3_6=P3^6;
main() //主程序
{ TMOD=0x11;//定时器T0、T1均工作于定时方式1
TH1=0xec;
TL1=0x78;//T1定时时间为5ms
IE=0X88; //开中断
TR1=1; //开定时器T1
for(;;) //无限循环,定时中断返回点
;
}
Timer1() interrupt 3//定时中断服务程序
{ TH1=0xec;
TL1=0x78;
t=BitTab[j];//取位值
P1=P1|0x38;//P1.3-P1.5送1
P1=P1&t; //P1.3-P1.5输出取出的位值
t=DispBuf[j];//取出待显示的数
t=DispTab[t];//取字形码
P3=t; //字型码由P3输出显示
j++; //j作为数码管的计数器,取值0-2,显示程序通过它确认显示哪个数码管
if(j==3)
j=0;
n++;
if(n==50)//每过50个中断测一次电感量
{
n=0;
TH0=0;
TL0=0;
P1_2=0;//测试开始
TR0=1; //开定时器T0
for(;P3_6==0;)//判断电阻上的电压上升到参考电压否
;
TR0=0;//电压达到参考电压,关定时器T0
P1_2=1;
L=TL0|(TH0<<8);//取定时器T0中的数值
L=L-3;
if(L>=200)
{
DispBuf[2]=10;
DispBuf[1]=10;
DispBuf[0]=1; //超量程,百位数显示1,个位、十位不显示(灭)
}
else //不超量程,取各位数值
{
DispBuf[2]=L%10;//取个位数
L=L/10;
DispBuf[1]=L%10;//取十位数
DispBuf[0]=L/10;//取百位数
}
}
}