0
原理图如下,我是个菜鸟,我写了几天的程序,没有现象,想求助各位高手帮帮忙,写个正确的程序,元件仅仅为一个单片机89C5 1、一个多通道模拟开关CD4051、两个op07;单片机使用89C51,其内部定时器T0为积分电路提供精确的时间定时,计数器T1用来记录反向积分时间,INT0用来检测比较器电平变化。所需测量的模拟输入信号和零点参考电压以及基准电压接到多路选择开关的输入端,通过单片机中的程序控制,轮流选择接入各路输入信号,通过积分电路分别和固定电压进行定时或定值积分积分电路的输出信号作为比较器的输入信号与比较电压进行比较,当比较器输出翻转信号时,CPU计数器停止计数,从而获得零点参考电压的计数值,对这个数据进行处理计算后,完成A/D转换。
#include
#define uchar unsigned char
#define uint unsigned int
void display();
unsigned long fre,time;
unsigned int counter,counter1;
unsigned char code table[]={ // 8位共阴数码管0-9和A-F数据代码
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
};
***it a=P1^0;
***it b=P1^1;
***it c=P1^2;
***it d=P1^3;
// ***it e=P1^7;
unsigned char code take[]={ // 8位共阴数码管选那个数码管
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
};
unsigned char bt[8];
void delay(uint x)
{
while(--x);
}
void time0()
{ a=1;
b=0;
c=0;
TMOD=0X51;
//TH0=0X3c;
// TL0=0Xb0;
// TH1=0;
// TL1=0;
TR0=1;
delay(65535) ;
TR0=0;
TR1=1;
EA=1;
ET1=1;
ET0=1;
IT0=0;
}
void t1() interrupt 3
{
a=1;
b=0;
c=0;
TH1=0;
TL1=0;
TR1=1;
counter1++;
INT0=0;
}
void t0() interrupt 1
{
a=0;
b=0;
c=0;
TH0=0X3c;
TL0=0Xb0;
counter++;
// if(counter>20)
// counter=0;
if(counter==20)
{
counter=0;
// TR0=0;
TR1=0;
time=counter1*65536+TH1*256+TL1;
fre= 2.5/time;
counter1=0;
TH1=0;
TL1=0;
// TR0=0;
TR1=1;
}
}
void main()
{
d=0;
// e=0;
INT0=1;
time0();
while(1)
{
display();
}
}
void display()
{
unsigned char i;
bt[3]=fre/10000000;bt[2]=fre/1000000%10;
bt[1]=fre/100000%10;bt[0]=fre/10000%10;
bt[7]=fre/1000%10;bt[6]=fre/100%10;
bt[5]=fre/10%10;bt[4]=fre%10;
for(i=0;i<8;i++)
{
P2=take; //那个数码管显示
P0=~table[bt]; //显示数据
delay(50);
P0=0x00; //清零
}
}
|
|