ADC0832的使用

百度搜索ADC0832 Datasheet便可以免费获取该芯片的权威数据手册。
最重要的是查看它的时序及对应英文词组的意思。
ADC0832 Timing
CLK为时钟信号,需要外部输入,可直接与单片机引脚相连
Chip Select(CS):从Timing图中可以看出芯片工作期间要保持低电平
DATA IN(DI):
第一个时钟周期,输入高电平为启动信号
第二个时钟周期,设置输入方式(单端输入/差分输入)
第三个时钟周期,设置具体通道
第四个时钟周期,将DI拉高,使主机处于接收状态,准备接收
具体的通道设置如图:
Channel Setting
DATA OUT (DO):8位的采样数据先从高位到低位输出,然后最低位复用,在从倒数二位输出只最高位,共15位数据(bit7–>bit0–>bit7)
除此之外,在第1,2,3周期DI配置通道,DO位TRI-STATE,在4-19周期,DO输出数据,DI处于DONT CARE状态。因此在实际的应用中,这两个引脚可以连在单片机的一个网络标号下。
Proteus原理图:
原理图
仿真结果:
在这里插入图片描述
程序:IODEFINE.H MAIN.H DELAY.C ADC0832.C MAIN.C
1.IODEFINE.H

#ifndef _IODEF_H_
#define _IODEF_H_

#include<REG52.H>
#include <INTRINS.H>
#include <ABSACC.H>

#define uchar unsigned char
#define uint unsigned int

#define segA P1_4
#define segB P1_5					//用74HC139节省IO资源
#define LED P1_1
sbit P0_0 = P0^0;
sbit P0_1 = P0^1;
sbit P0_2 = P0^2;
sbit P0_3 = P0^3;
sbit P0_4 = P0^4;
sbit P0_5 = P0^5;
sbit P0_6 = P0^6;
sbit P0_7 = P0^7;

sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P1_4 = P1^4;
sbit P1_5 = P1^5;
sbit P1_6 = P1^6;
sbit P1_7 = P1^7;

sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit P2_4 = P2^4;
sbit P2_5 = P2^5;
sbit P2_6 = P2^6;
sbit P2_7 = P2^7;

sbit P3_0 = P3^0;
sbit P3_1 = P3^1;
sbit P3_2 = P3^2;
sbit P3_3 = P3^3;
sbit P3_4 = P3^4;
sbit P3_5 = P3^5;
sbit P3_6 = P3^6;
sbit P3_7 = P3^7;

#endif

2.MAIN.H

#ifndef _MAIN_H
#define _MAIN_H
/*--------------------------------------------*/

#include "iodefine.h"				//自定义内容

/*--------------------------------------------*/
#define DELAY
#define ADC0832

/*--------------------------------------------*/
#ifdef DELAY
#define DELAY_MS_US
void delay_ms(uint xms);
void delay_us(uint Xus);
#endif

/*--------------------------------------------*/
#ifdef ADC0832

void start_ADC0832(void);					//启动0832以及设置采样方式
uchar getADC0832_DO(void);					//返回采样电压值0-5v
void ADC_dataProcess(uchar);				//ADC0832采样数据处理,存放在ADC_data[4]中
void ADC_seg7display();						//及显示在数码管
#endif

/*--------------------------------------------*/
#endif

3.DELAY.C

#include"main.h"

#ifdef DELAY_MS_US
void delay_ms(uint xms)	
{
    uint loop;
    for (loop = 0; loop < xms; loop++)
    {
        /* 1ms_code 误差	+0.306315ms/2000ms */
        uchar i, j;
        _nop_();
		i = 2;
		j = 195;
		do
		{
			while (--j);
		} while (--i);
    }
}
/*--------------------------*/
void delay_us(uint Xus)
{
  uint i,j;
  for(i=0;i<8;i++){
     for(j=0;j<Xus;j++){
         _nop_();
     }
  }
}
#endif

4.ADC0832.C

#include "main.h"
#ifdef ADC0832

extern uchar code SEG7_yin[];
static uint ADC_data[4] = {0};		//存放采样数据的各个位,便于数码管显示
#define	CS_LOW  P1_7 		//ADCS
#define CLK P3_4			//ADCLK
#define DI_DO P1_6			//DIO
#define led P1_1

void start_ADC0832()
{
	CS_LOW = 1;
	CLK = 0;
	delay_us(2);			//未上电//第零个周期
	CS_LOW = 0;

	CLK = 0;
	DI_DO = 1;				//START//第一个周期
	delay_us(2);
	CLK = 1;
	delay_us(2);

	CLK = 0;
	DI_DO = 0;				//DIF差分输入方式//第二个周期
	delay_us(2);
	CLK = 1;
	delay_us(2);

	CLK = 0;
	DI_DO = 0;				//CH0 +  CH1 - //第三个周期
	delay_us(2);
	CLK = 1;
	delay_us(2);

	CLK = 0;
	DI_DO = 1;
	delay_us(2);			//MUX SETTING TIME

}
uchar getADC0832_DO(void)	//返回采样电压值
{
	uchar i,dat = 0,redat = 0;
	for ( i = 0; i < 8; i++)
	{
		CLK = 1;
		delay_us(2);
		CLK = 0;
		delay_us(2);
		dat  = (dat << 1)|(uchar)DI_DO;
	}
	for ( i = 0; i < 8; i++)
	{
		redat = redat | ((uchar)DI_DO << i);
		CLK = 1;
		delay_us(2);
		CLK = 0;
		delay_us(2);
	}
	CS_LOW = 1;						//使能端禁止
	
	return (dat == redat)? dat : 0;	//校验正确则输出	
		
}

void ADC_dataProcess(uchar beforeDat)
{
	uint afterDat,qian,bai,shi,ge;
	
	afterDat = (double)beforeDat / 51 * 1000;
	qian = 	afterDat / 1000;
	bai =  (afterDat % 1000) / 100;
	shi = (afterDat % 100) / 10;
	ge =  afterDat % 10;
	ADC_data[0] = qian;
	ADC_data[1] = bai;
	ADC_data[2] = shi;
	ADC_data[3] = ge; 

}

void ADC_seg7display()
{
	P0 = 0;
	P0 = SEG7_yin[ADC_data[0]]+0x80;
	//P0 = SEG7_yin[0];
	segB = 0;
	segA = 0;
	delay_us(100);

	P0 = 0;
	P0 = SEG7_yin[ADC_data[1]];
	//P0 = SEG7_yin[1];
	segB = 0;
	segA = 1;
	delay_us(100);
	
	P0 = 0;
	P0 = SEG7_yin[ADC_data[2]];
	//P0 = SEG7_yin[2]; 
	segB = 1;
	segA = 0;
	delay_us(100);
	
	P0 = 0;
	P0 = SEG7_yin[ADC_data[3]];
	//P0 = SEG7_yin[3];
	segB = 1;
	segA = 1;
	delay_us(100);
}

#endif

5.主函数(main.c)

#include "main.h"
uchar code SEG7_yin[]= {
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
void main(){

	start_ADC0832();
	ADC_dataProcess(getADC0832_DO());
	   while(1){
		ADC_seg7display();
		}
}

^^Crystal

ADC0832是一种8位模数转换器,可用于将模拟信号转换为数字信号。它具有8个通道,可以选择单通道或多通道操作。 在使用ADC0832进行设计时,首先需要将模拟信号输入到芯片的输入引脚上。ADC0832可以在0至5V的范围内测量模拟输入信号。然后,通过SPI接口或并行数据总线,将转换后的数字信号发送给微控制器或其他数字电路进行处理。 为了使用ADC0832进行转换,首先需要设置控制寄存器。通过控制寄存器,我们可以选择转换时钟源、输入通道、测量精度和转换模式等。然后,启动转换,并等待转换完成。一旦完成转换,我们可以从数据寄存器中读取转换结果。 在设计中,我们需要注意一些重要的方面。首先是参考电压的选择。ADC0832具有内部参考电压源,但也可以使用外部参考电压源。选择合适的参考电压源可以提高转换的精确度。 另一个方面是时钟源的选择。ADC0832可以使用外部时钟或内部时钟。外部时钟可以提供更准确的时钟信号,而内部时钟可以减少外部器件的数量。 此外,在设计中还需要考虑信号调理。在输入模拟信号之前,我们可能需要使用放大器、滤波器或其他电路对信号进行调整,以确保输入信号在ADC的测量范围内,并获得所需的精度。 综上所述,ADC0832是一种非常有用的模数转换器,可用于将模拟信号转换为数字信号,并进一步进行处理。通过正确设置控制寄存器、选择适当的参考电压和时钟源,以及进行必要的信号调理,可以实现准确和可靠的信号转换。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

___Crystal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值