下面是电路图和仿真图:


完整的工程文件及hex文件下#include<reg51.h>
#define uint unsigned int 
#define uchar unsigned char
sbit cs=P1^0;
sbit clk=P1^3;
sbit sdi=P1^4;
sbit sdo=P1^5;
sbit bit7=B^7;
sbit freq_out=P3^7;
bit cy;
uint adval,volt,froq;
uchar temp;
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,
 0x92,0x82,0xf8,0x80,0x90};
void delayms(uint ms)
{
uchar j;
while(ms--)
 {
for(j=0;j<120;j++);
}
}
void delay()
{
uint i=5;
while(i--);
}
void readADC(int ch)
{
uchar i;
clk=0;
cs=1;
delay();
cs=0;//CS=0开始转换
B=ch;
for(i=8;i>0;i--)
 {
 cy=sdo;
 sdi=bit7;
 clk=1;
 B=B<<1;
 clk=0;
 temp=temp<<1;
 if(cy==1)
 temp++;
 }
 adval=temp;
adval=adval<<4;
for(i=4;i>0;i--)
 {
 cy=sdo;
 temp=temp<<1;
 if(cy==1)
 temp++;
 clk=1;
 clk=0;
 }
 cs=1;//十二位读数完毕,结束转换。
 adval +=temp;
 volt=adval;
 froq=adval;
 }
void resultvolt()
 {
 volt=volt*5000.0/4334;//转换成电压显示
 }
void resultfroq()
 {
 froq=1000000.0/froq*2/2.0;//转换频率数值
 }
void displayvolt(uint dat)
 {
 P2=0x10;
 P0=tab[dat/1000]&0x7f;
 delayms(1);
 P0=0xff;
 P2=0x20;
 P0=tab[dat%1000/100];
 delayms(1);
 P0=0xff;
 P2=0x40;
 P0=tab[dat%100/10];
 delayms(1);
 P0=0xff;
 P2=0x80;
 P0=tab[dat%10];
 delayms(1);
 P0=0xff;
 }
void displayfroq(uint dat)
 {
 P2=0x01;
 P0=tab[dat/1000]&0x7f;
 delayms(1);
 P0=0xff;
 P2=0x02;
 P0=tab[dat%1000/100];
 delayms(1);
 P0=0xff;
 P2=0x04;
 P0=tab[dat%100/10];
 delayms(1);
 P0=0xff;
 P2=0x08;
 P0=tab[dat%10];
 delayms(1);
 P0=0xff;
 }
void t0_int() interrupt 1
 {
 TH0=-froq/256;
 TL0=-froq%256;
 }
void t0_init(void)
 {
 TMOD=0x01;
 ET0=1;
 TR0=1;
 EA=1;
 }
void main()
{ 
 t0_init();
 P2=0xff;
 P0=0xff;
 while(1)
 {
 readADC(0);
 delayms(1);
 resultvolt();
 resultfroq();
 displayfroq(froq);
 displayvolt(volt);
 }
}