ADC0809是采样分辨率为8位的、以逐次逼近原理进行模-数转换的器件,其内部有一个8通道多路开关,它能够依据地址码锁存译码后的信号,选通8路模拟输入信号的任意一路,而且方便拓展,能够实现多路信号的同时采集。可实现模拟电压信号到数字电压信号的转换,这里所用的ADC芯片型号为ADC0809CCN,28引脚双列直插式封装,低功耗,具有转换启停控制端,使用温度范围为-40℃~+80℃。
图1 ADC0809内部结构
表1 地址信号与通道对应关系
这里我仅用到两个通道,显示用的LCD1602,很简单,不说废话直接上代码。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P2
sbit START=P3^5;
sbit OE=P3^3;
sbit CLOCK=P3^7;
sbit EOC=P3^4;
sbit add_a=P3^0;
sbit add_b=P3^1;
sbit add_c=P3^2;
sbit RS=P0^7;
sbit E=P0^5;
sbit RW=P0^6;
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void check_busy(void)//检查忙函数
{
uchar dt;
do
{
dt=0xff;
E=0;
RS=0;
RW=1;
E=1;
dt=out;
}while(dt&0x80);
E=0;
}
void write_com(uchar com)//写指令函数
{
check_busy();
E=0;
RS=0;
RW=0;
out=com;
E=1;
_nop_();
E=0;
delay(1);
}
void write_data(uchar dat)//写数字函数
{
check_busy();
E=0;
RS=1;
RW=0;
out=dat;
E=1;
_nop_();
E=0;
delay(1);
}
void lcd_init(void)//LCD初始化函数
{
write_com(0x38);
write_com(0x0C);
write_com(0x06);
write_com(0x01);
delay(1);
}
void Timer0_INT() interrupt 1
{
CLOCK=!CLOCK;
}
void main()
{
uint addata2=0;
uint addata1=0;
uint addata3,addata4;
uchar temp;
lcd_init();
TMOD=0x02;
TL0=0xff;
TH0=0xff;
IE=0x82;
TR0=1;
//beep=0;
delay(1);
while(1)
{
delay(8);
add_a=0;//采集第一路信号
add_b=0;
add_c=0;
START=0;
START=1;
delay(8);
START=0;
while(EOC==0)
OE=1;
delay(8);
temp=P1;
OE=0;
addata3=temp*19.61;
if(addata1<=addata3)
{
addata1=addata3;
}
else
{
addata1=addata1;
}
write_com(0x82);
write_data('F');
write_data('O');
write_data('R');
write_data('C');
write_data('E');
write_data('=');
write_data('0'+addata1/1000);
write_data('0'+addata1/100%10);
write_data('.');
write_data('0'+addata1/10%10);
write_data('0'+addata1%10);
write_data('N');
delay(10);
add_a=1;//采集第二路信号
add_b=0;
add_c=0;
START=0;
START=1;
delay(8);
START=0;
while(EOC==0)
OE=1;
delay(8);
temp=P1;
OE=0;
addata4=temp*3.93;
if (addata2<=addata4)
{
addata2=addata4;
}
else
{
addata2=addata2;
}
write_com(0xC0);
write_data('T');
write_data('O');
write_data('R');
write_data('Q');
write_data('U');
write_data('E');
write_data('=');
write_data('0'+addata2/1000);
write_data('.');
write_data('0'+addata2/100%10);
write_data('0'+addata2/10%10);
write_data('0'+addata2%10);
write_data('N');
write_data('*');
write_data('m');
delay(100);
}
}