1.ADC0804简介
工作电压:+5V,即VCC=+5V。
模拟转换电压范围:0~+5V,即0≤Vin≤+5V。
分辨率:8位,即分辨率为1/(2^8)=1/256,转换值介于0~255之间。
转换时间:100us(fCK=640KHz时)。
转换误差:±1LSB。
参考电压:2.5V,即Vref/2=2.5V。
Vin(+)、Vin(-):两个模拟信号输入端,可以接收单极性、双极性和差模输入信号。
DB0-DB7:具有三态特性数字信号输出端,输出结果为八位二进制结果。
CLKIN:时钟信号输入端。
CLKR:内部时钟发生器的外接电阻端,与CLK端配合可由芯片自身产生时钟脉冲,其频率计算方式是:fck=1/(1.1RC)。
CS:片选信号输入端,低电平有效。
WR:写信号输入端,低电平启动AD转换。
RD:读信号输入端,低电平输出端有效。
INTR:转换完毕中断提供端,AD转换结束后,低电平表示本次转换已完成。
VREF/2:参考电平输入,决定量化单位。
VCC:芯片电源5V输入。
AGND:模拟电源地线。
DGND:数字电源地线。
2.程序代码
delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
//延时1us
void Delay_1us(void);
//延时xus
void Delay_xus(unsigned int x);
#endif
delay.c
#include "delay.h"
#include <intrins.h>
void Delay_1us(void)
{
_nop_();
}
void Delay_xus(unsigned int x)
{
unsigned int i,j;
for(i=x;i>0;i--)
Delay_1us();
}
adc.h
#ifndef __ADC_H__
#define __ADC_H__
#include <reg51.h>
#include "delay.h"
#define ADC0804_Port P1
sbit ADC0804_CS = P3^5;//ADC_CS低电平有效
sbit ADC0804_WR = P3^6;//ADC_WR低电平有效
sbit ADC0804_RD = P3^7;//ADC_RD低电平有效
unsigned char ADC0804_Read(void);//ADC0804读取数据0-255
unsigned int ADC0804_Convert(void);//将0-255转换为0-5V
#endif
adc.c
unsigned char ADC0804_Read(void)
{
unsigned char dat;
ADC0804_Port = 0xff;
ADC0804_CS = 1;
ADC0804_WR = 1;
ADC0804_CS = 0;
ADC0804_WR = 0;
//Delay_xus(100);
ADC0804_CS = 1;
ADC0804_WR = 1;
//Delay_xus(500);
ADC0804_CS = 0;
ADC0804_RD = 0;
//Delay_xus(50);
dat = ADC0804_Port;
ADC0804_RD = 1;
ADC0804_CS = 1;
return dat;
}
unsigned int ADC0804_Convert(void)
{
unsigned char n;
unsigned int sum = 0;
unsigned int temp;
for(n = 0;n < 3;n++)
{
sum = sum + ADC0804_Read();
Seg_dis(temp);
}
temp = sum / 3;
//temp = temp * 19.60784; //5/255=0.01960784313
return temp;
}
seg.h
#ifndef __SEG_H__
#define __SEG_H__
#include "delay.h"
void Seg_dis(unsigned int dat);
#endif
seg.c
#include <reg51.h>
#include "seg.h"
#include "delay.h"
#define Duan_Port P0
#define Wei_Port P2
sbit wei1=P2^0;
sbit wei2=P2^1;
sbit wei3=P2^2;
sbit wei4=P2^3;
unsigned char code Seg_Duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0xf1};//显示0~F的值
void Seg_dis(unsigned int dat)
{
wei1 = 0;//选通高位数码管(左边第1位)
Duan_Port = Seg_Duan[dat/1000%10];//赋段码
Delay_xus(50);
wei1 = 1;
Duan_Port = 0xff;//关闭消影
wei2 = 0;
Duan_Port = Seg_Duan[dat/100%10];
Delay_xus(50);
wei2 = 1;
Duan_Port = 0xff;
wei3 = 0;
Duan_Port = Seg_Duan[dat/10%10];
Delay_xus(50);
wei3 = 1;
Duan_Port = 0xff;
wei4 = 0;
Duan_Port = Seg_Duan[dat%10];
Delay_xus(50);
wei4 = 1;
Duan_Port = 0xff;
}
main.c
#include <reg51.h>
#include "seg.h"
#include "delay.h"
#include "adc.h"
int main(void)
{
unsigned int Vo;
while(1)
{
Vo = ADC0804_Convert();
Seg_dis(Vo);
}
}
3.仿真电路