1.ADC0804簡介
工作電壓:+5V,即VCC=+5V。
模擬轉(zhuǎn)換電壓范圍:0~+5V,即0≤Vin≤+5V。
分辨率:8位,即分辨率為1/(2^8)=1/256,轉(zhuǎn)換值介于0~255之間。
轉(zhuǎn)換時間:100us(fCK=640KHz時)。
轉(zhuǎn)換誤差:±1LSB。
參考電壓:2.5V,即Vref/2=2.5V。
Vin(+)、Vin(-):兩個模擬信號輸入端,可以接收單極性、雙極性和差模輸入信號。
DB0-DB7:具有三態(tài)特性數(shù)字信號輸出端,輸出結(jié)果為八位二進(jìn)制結(jié)果。
CLKIN:時鐘信號輸入端。
CLKR:內(nèi)部時鐘發(fā)生器的外接電阻端,與CLK端配合可由芯片自身產(chǎn)生時鐘脈沖,其頻率計算方式是:fck=1/(1.1RC)。
CS:片選信號輸入端,低電平有效。
WR:寫信號輸入端,低電平啟動AD轉(zhuǎn)換。
RD:讀信號輸入端,低電平輸出端有效。
INTR:轉(zhuǎn)換完畢中斷提供端,AD轉(zhuǎn)換結(jié)束后,低電平表示本次轉(zhuǎn)換已完成。
VREF/2:參考電平輸入,決定量化單位。
VCC:芯片電源5V輸入。
AGND:模擬電源地線。
DGND:數(shù)字電源地線。
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讀取數(shù)據(jù)0-255
unsigned int ADC0804_Convert(void);//將0-255轉(zhuǎn)換為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;//選通高位數(shù)碼管(左邊第1位)
Duan_Port = Seg_Duan[dat/1000%10];//賦段碼
Delay_xus(50);
wei1 = 1;
Duan_Port = 0xff;//關(guān)閉消影
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文章來源:http://www.zghlxwxcb.cn/news/detail-405368.html
#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.仿真電路文章來源地址http://www.zghlxwxcb.cn/news/detail-405368.html
到了這里,關(guān)于基于51單片機(jī)的電壓采集(ADC0804)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!