//库文件#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int //宏定义无符号整型
/********************************************************************
I/O定义
*********************************************************************/
sbit LED=P1^0; //定义单片机P1口的第1位 (即P1.0)为指示端
7 / 23
word sbit DOUT=P2^0; //定义单片机P2口的第1位 (即P2.0)为传感器的输入端
/********************************************************************
延时函数
*********************************************************************/
void delay()//延时程序
{
uchar m,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
/********************************************************************
主函数
8 / 23
word *********************************************************************/
void main()
{
while(1) //无限循环
{
LED=1; //熄灭P1.0口灯
if(DOUT==0)//当浓度高于设定值时 ,执行条件函数
{
delay();//延时抗干扰
if(DOUT==0)//确定 浓度高于设定值时 ,执行条件函数
{
LED=0; //点亮P1.0口灯
}
9 / 23
word }
}
}
/********************************************************************
结束
*********************************************************************/
【测试程序】
*********************************************************************/
#include //头文件#define uchar unsigned char //宏定义无符号字符型
#define uint unsigned int //宏定义无符号整型
code uchar
seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟
10 / 23
word uchar wei[4]={0XEf,0XDf,0XBf,0X7f}; //位的控制端 //位控制码
sbit ST=P3^0; //A/D启动转换信号
sbit OE=P3^1; //数据输出允许信号
sbit EOC=P3^2; //A/D转换结束信号
sbit CLK=P3^3; //时钟脉冲
uint z,x,c,v,AD0809, date;//定义数据类型
/******************************************************************
延时函数
******************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i11 / 23word {
for(j=13;j>0;j--);
{ ;
}
}
}
/**********************************************************************
数码管动态扫描
*********************************************************************/
void xianshi() //显示函数
{
uint z,x,c,v;
z=date/1000; //求千位
12 / 23
word x=date%1000/100; //求百位
c=date%100/10; //求十位
v=date%10; //求个位
P2=0XFF;
P0=seg7code[z]&0x7f;
P2=wei[0];
delay(80);
P2=0XFF;
P0=seg7code[x];
P2=wei[1];
delay(80);
P2=0XFF;
P0=seg7code[c];
/ 23
13 word P2=wei[2];
delay(80);
P2=0XFF;
P0=seg7code[v];
P2=wei[3];
delay(80);
P2=0XFF;
}
/*************************************************************************
CLK振荡信号
**************************************************************************/
void timer0( ) interrupt 1 //定时器0工作方式1
{
14 / 23
word TH0=(65536-2)/256; //重装计数初值
TL0=(65536-2)%256; //重装计数初值
CLK=!CLK; //取反
}
/*************************************************************************
主函数
**************************************************************************/
void main()
{
TMOD=0X01; //定时器中断0
CLK=0; //脉冲信号初始值为0
TH0=(65536-2)/256; //定时时间高八位初值
TL0=(65536-2)%256; //定时时间低八位初值
15 / 23
word EA=1; //开CPU中断
ET0=1; //开T/C0中断
TR0=1;
while(1) //无限循环
{
ST=0;//使采集信号为低
ST=1;//开始数据转换
ST=0;//停止数据转换
while(!EOC);//等待数据转换完毕
OE=1;//允许数据输出信号
AD0809=P1; //读取数据
OE=0;//关闭数据输出允许信号
if(AD0809>=251)//电压显示不能超过5V
16 / 23
word AD0809=250;
date=AD0809*20;//数码管显示的数据值,其中20为采集数据的毫安值
xianshi();//数码管显示函数
}
}
【ADC0809资料】
ADC0809中文资料
1.主要特性 1)8路8位A/D转换器,即分辨率8位。 2)具有转换起停控制端。 3)转换时间为100μs 4)单个+5V电源供电 5)模拟输入电压X围0~+5V,不需零点和满刻度校准。 6)工作温度X围为-40~+85摄氏度 7)低功耗,约15mW。
2.内部结构 ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图13.22所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近 ADC0809内部结构框图 寄存器、三态输出锁存器等其它一些电路组成。因此,ADC0809可处理8路模拟量输入,且有三态输出能力,既可与各种微处理器相连,也可单独工作。输入输出与TTL兼容。
3.外部特性(引脚功能) ADC0809芯片有2引脚,采用双列直插式封装,
17 / 23
word 下面说明各引脚功能。 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:时钟脉冲输入端。要求时钟频率不高于0KHZ。
REF(+)、REF(-):基准电压。
Vcc:电源,单一+5V。
GND:地。
ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作
18 / 23
word
中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。【图片展示】
19 / 23
word
20 / 23
word
21 / 23
word
22 / 23
word
23 / 23