最近很懒,要完成的几个实物,一直没动手。今天又多了一项,ICL7135制作的高精度电压表。程序完成,仿真也正常了,就等实物制作了。
关于ICL7135制作的电压表,网上资料不少,但内容都差不多,不懂处仍然不懂。7135测电压有2种方法,一种是并口输出,接线繁多。另一种是利用BUSY信号得到电压,这方法简单,接线只用了一条。

基本原理如下:
ICL7135是以双积分方式进行A/D转换的电路。每个转换周期分为三个阶段
[1].自动调零阶段 [2].被测电压积分阶段 [3].对基准电压进行反积分阶段
以输入电压Vx为例,其积分器输出端(ICL7135的4脚)的波形如图1所示。“busy”输出端(ICL7135的21脚)高电平的宽度等于积分和反积分时间之和。ICL7135内部规定积分时间固定为10001个时钟脉冲时间,反积分时间与被测电压的大小成比例。如果利用单片机内部的计数器对ICL7135的时钟脉冲计数,利用“busy”作为计数器门控信号,控制计数器只能在busy为高电平时计数,将这段busy高电平时间内计数器的内容减去10001,其余数便等于被测电压的数值。

注:U2的CLOCK端接125K方波信号
//2012 02 26 E:\DPJ_C\ICL7135\7135LED.C
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
};
uint V;
sbit P0_7=P0^7;
void delay(uint ms)
{
uchar i;
while(ms--)
for(i=0;i<123;i++);
}
void display()
{
uchar temp=0xfe,a[5],i;
a[0]=V/10000;
a[1]=V%10000/1000;
a[2]=V%1000/100;
a[3]=V%100/10;
a[4]=V%10;
for(i=0;i<5;i++)
{
P0=tab[a[i]];
if(i==0)
P0_7=0x01; //最高位显示小数点
P1=temp;
delay(1);
P1=0xff;
temp=_crol_(temp,1);
}
}
void main()
{
TMOD=0X0d;//00001101
TL0=0;
TH0=0;
ET0=1;
EX0=1;
IT0=1;
EA=1;
TR0=1;
while(1)
display();
}
void ADC_7135() interrupt 0
{
V=TH0;
V<<=8;
V+=TL0;
V-=10001;
TL0=0;
TH0=0;
}

多页设计,加了一个用7135的BCD输出的信号加到数码管显示,小2个字。