概述
百度搜索ADC0832 Datasheet便可以免费获取该芯片的权威数据手册。
最重要的是查看它的时序及对应英文词组的意思。
CLK为时钟信号,需要外部输入,可直接与单片机引脚相连
Chip Select(CS):从Timing图中可以看出芯片工作期间要保持低电平
DATA IN(DI):
第一个时钟周期,输入高电平为启动信号
第二个时钟周期,设置输入方式(单端输入/差分输入)
第三个时钟周期,设置具体通道
第四个时钟周期,将DI拉高,使主机处于接收状态,准备接收
具体的通道设置如图:
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的使用的全部内容,希望文章能够帮你解决ADC0832的使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复