基于51单片机的电压采集(ADC0804)

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.仿真电路
在这里插入图片描述

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值