#include<reg51h>
#include <intrinsh>
#define uint unsigned int
#define uchar unsigned char
sbit adrd=P3^7; //IO口定义
sbit adwr=P3^6;
sbit diola=P2^5;
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char j,k,adval;
void delay(unsigned char i) //延时程序
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管编码
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void display(uchar bai_c,uchar sh_c,uchar g_c) //显示程序
{
P0=table[bai_c]; //显示百位
dula=1;
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
dula=0;
P0=table[sh_c]; //显示十位
dula=1;
dula=0;
wela=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
P0=table[g_c]; //显示个位
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(5);
}
void main() // 主程序
{
uchar a,A1,A2,A2t,A3;
while(1)
{
wela=1;
P0=0; //选通ADCS
adwr=0; //AD写入(随便写个什么都行,主要是为了启动AD转换)
_nop_();
adwr=1;
P0=0xff; //关闭ADCS
delay(10);
wela=0; //关闭有AD片选信号锁存器的锁存端以防止在 *** 作数码管时使AD的片选发生变化
for(a=20;a>0;a--) //需要注意的是ADC0804在写和读之间的时间间隔要足够长否则无法读出数据
{ //这里把显示部分放这里的原因也是为了增加写读之间的时间间隔
display(A1,A2,A3);
} //送去显示各位。
wela=1; //重新打开有AD片选信号锁存器的锁存端
P1=0xff; //读取P1口之前先给其写全1
P0=0; //选通ADCS
adrd=0; //AD读使能
adval=P1; //AD数据读取赋给P1口
adrd=1;
P0=0xff; //关闭ADCS
adwr=0;
P1=adval; //同时把AD的值送八个发光二极显示
A1=adval/100; //分出百,十,和个位
A2t=adval%100;
A2=A2t/10;
A3=A2t%10;
};
}
您好,很高兴为您解答。ADC0809的三种传送方式分别为定时传送方式,查询方式以及中断方式。对于一种A/D转换器来说,转换时间作为一项技术指标是已知的和固定的。例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。
#include "reg51h"
#define data_point P0
sbit EOC=P2^0;
sbit ADDA=P2^1;
sbit ADDB=P2^2;
sbit ADDC=P2^3;
sbit OE=P2^5;
sbit START=P2^6;
sbit CLK=P2^7;
sbit ALE=P2^6;
unsigned char disp[3]={0,0,0};
char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char t0count=0;
unsigned int temp;
double sum;
unsigned char val_Integer; //整数
unsigned int val_Decimal; //小数
sbit k1 = P1^0;
sbit k2 = P1^1;
sbit k3 = P1^2;
sbit k4 = P1^3;
void delay(unsigned char ms)
{
unsigned char i;
while(ms--)
for(i=0;i<125;i++);
}
void display()
{
disp[0]=disp[0]&0x7f;
P3= disp[0];
k1 = 1;
delay(2);
k1 = 0;
P3= disp[1];
k2 = 1;
delay(2);
k2 = 0;
P3= disp[2];
k3 = 1;
delay(2);
k3 = 0;
P3= disp[3];
k4 = 1;
delay(2);
k4 = 0;
}
unsigned char ADC0808()
{
unsigned char d;
ADDC=0;
ADDB=0;
ADDA=0;
TR1=1;
ALE=1;ALE=0;
START=1;START=0;
while(EOC==0);
OE=1;
d=data_point;
OE=0;
TR1=1;
return d;
}
void covert(unsigned char x)
{
sum=x00201378;
val_Integer=(unsigned char)sum;
val_Decimal=(unsigned int)((sum-val_Integer)1000);
disp[3]=dispcode[val_Decimal%10];
disp[2]=dispcode[val_Decimal/10%10];
disp[1]=dispcode[val_Decimal/100];
disp[0]=dispcode[val_Integer];
}
void main()
{
TMOD=0x21;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=256-2;
ET0=1;
ET1=1;
EA=1;
TR0=1;
OE=0;
START=0;
EOC=1;
while(1)
{
display();
}
}
void time0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
t0count++;
if(t0count==100)
{
t0count=0;
covert(ADC0808());
}
}
void time1() interrupt 3
{
CLK=~CLK;
}
我曾经做过一个测量压力传感器0-5V,并转换成对应的0-30MPar的压力显示。而且已经做成实物。你可以参考下面的。是我自己设计的。
一、 概述:
此电路主要是利用0—5伏的压力传感器检测气体的压力并送显,采用四位数码管,显示其压力值,传感器的0—5伏对应加气机加气压力的0—30Mpa,送到汉显的显示值就是加气机气体的压力值,压力值精确小数点后一位,在实际加气中,按照国家规程规定,其加气压力不得高于20Mpa,所以,此电中用在实际中,可直观显示其加气压力,最低压力显示000 Mpa,最高显示299Mpa。
此玩法电路结构简单,数码显示可精确到小数点后一位。
软件部分采用C语言编写
二、电路结构如下:
三、芯片简介:
1、ADC0809(模数转换)
(1)ADC0809引脚图
(2)主要特征
1)8路8位A/D转换器,即分辨率8位。
2)具有转换起停控制端。
3)转换时间为100μs
4)单个+5V电源供电
5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
6)工作温度范围为-40~+85摄氏度
7)低功耗,约15mW。
(3)内部结构
ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图13.22所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近
(4)外部特性(引脚功能)
ADC0809芯片有28条引脚,采用双列直插式封装,如上图所示。
下面说明各引脚功能。
IN0~IN7:8路模拟量输入端。
2-1~2-8:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路
ALE:地址锁存允许信号,输入,高电平有效。
START: A/D转换启动信号,输入,高电平有效。
EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。
REF(+)、REF(-):基准电压。
Vcc:电源,单一+5V。
GND:地。
ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。
ad0809是根据逐位逼近的方法产生数据的。。
我们以参考电压为0-5V为例。0809八位255的转换精度每一位的电压值为(5-0)/255≈00196V
设输入电压为X则:
X-2700196>=0则AD7=1否则AD7=0。
X-2600196>=0则AD6=1否则AD6=0。
………………
…………………
…………………
X-2000196>=0则AD0=1否则AD0=0。
若参考电压越小,精度就会越高,但测量范围就变得窄了,比如:0-1V为参考电压, 则每一位的电压值就是:(1-0)/255≈00039V精度是提高了,但测量范围小了。所以,在实际设计中,应根据实际做出合理的设计,在提高测量范围的同时,也要提高精度。
2、74LS74(两分频,为ADC0809提供工作频率)
(1)引脚图
(2)逻辑图
四、 硬件件电路设计
(1)硬件电路图
(2)连接要点
ADC0809的CLK时钟输入信号线的频率直接由单片机的ALE口输出,因ADC内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ。在正常工作时,AT89C51的ALE端输出为地址锁存允许信号,当单片机上电正常工作后,ALE引脚不断输出正脉冲信号。当单片机访问外部存储器时,ALE输出信号的负跳沿用于单片机发出的低8位地址经外部锁存器的锁存控制信号。即使不访问外部锁存器,ALE端仍有正脉冲信号输出,此频率为时钟振荡频率fosc的1/6。
因此单片机的时钟振荡频率采用6MHZ,经ALE输出为1MHZ,在经外围74LS74两分频后得到500KHZ,把此信号连接到ADC的clock端,提供ADC工作时所需的频率。
(3)工作原理:
如上图所示,RV1的可变电阻用是外围0—5的输入信号(压力传感器的输入信号),此信号进入ADC的INT0通道进行模数转换(如图ADDA、ADDB、ADDC通道选择全部接地,只对通道0进行转换),转换的值通过D0-D7送给单片机,在内部进行转换计算后驱动三位数码管显示(共阳),数码管的位选段采用三个PNP型三极管驱动(9012)驱动,系统工作电源,经外围的12直流电压,经7805稳压输出+5V的电压,提供给各IC供电。
五、软件程序
软件程序采用C语言编写,总的不是很复杂,本人已实际通过测试,并自做了PCB板,实际运行可靠,实际硬件焊接时,需在ADC的0通道输入端加接两个电容(10uf/50v,104),对输入信号进行尖锋滤波与抗干扰,以保证进入ADC的信号采集信号的稳定性。
程序如下:
//程序功能:压力传感器测量
//程序设计:黄庭剑
//编写时间:2009年7月25日
//完成时间:2009年8月1日
//CPU说明:采用AT89C51,晶振:6MHZ,
//程序说明:通过压力传感器采集的压力值(0—5V),对应于加气机气体压力的0—30Mpa,通过数码管显示输出。输出范围:000Mpa—
299Mpa
#include <reg51h>
#define uchar unsigned char
#define uint unsigned int
sfr p0=0x80;
sfr p1=0x90;
sfr p2=0xa0;
sfr p3=0xb0;
sbit st=p2^7;
sbit oe=p2^5;
sbit eoc=p2^6;
sbit p0_7=p0^7;
sbit p3_0=p3^0;
sbit p3_1=p3^1;
sbit p3_2=p3^2;
sbit ge=p2^0;
sbit shi=p2^1;
sbit bai=p2^2; //定义
uint a_data1,a_data2,a_data3,temp;
uchar getdata;
uchar codetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段选
void delaynms(uint x);//nms延时程序
void zh_display();//先转换后显示程序
void adcst_0809();//adc启动程序
void main()
{
while(1)
{
adcst_0809();//调adc启动程序
zh_display();//调显示程序
}
}
//adc启动程序
void adcst_0809()
{ uchar i;
for(i=0;i<1;i++)
{ p3_0=0;
p3_1=0;
p3_2=0;
oe=0;
st=0;
st=1;
st=0;
delaynms(1);
while(!eoc);
oe=1;
getdata=p1;
oe=0;
}
}
void delaynms(uint x)
{ uchar i;
while(x-->0)
{ for(i=0;i<115;i++)
{;}
}
}
//数据处理并送显程序
void zh_display()
{ uchar a;
temp=getdata151;
temp=temp/128;
a_data1=temp/100;
a_data2=temp%100/10; //数据处理
a_data3=temp%10;
for(a=0;a<10;a++)
{
bai=0;
shi=1;
ge=1;
p0=codetab[a_data1]; //点亮百位
delaynms(1);
p0=0x00;
bai=1;
shi=0;
ge=1;
p0=codetab[a_data2];//点亮十位
p0_7=0;//点亮第二位的小数点
delaynms(1);
p0=0x00;
bai=1;
shi=1;
ge=0;
p0=codetab[a_data3];//点亮个位
delaynms(1);
}
}
以上就是关于利用单片机与DAC0809设计简易电压表,能够测量和显示0—5V电压,设计电路和程序。全部的内容,包括:利用单片机与DAC0809设计简易电压表,能够测量和显示0—5V电压,设计电路和程序。、DAC0809地址获取的方式有哪些、单片机程序 急求流程图 ;1、0809的片选信号CS0809接CS0。 ;2、电位器的输出信号AN0接0809的ADIN0。 ;3、EO等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)