adc0832.c

来自「STC51系列的源码」· C语言 代码 · 共 136 行

C
136
字号
/********************************************************************************/
/* filename : ADC0832.c                                                         */
/* created  : xillinx                                                           */
/* descript : 处理ADC0832相关的函数                                             */
/********************************************************************************/
#include "../CPU/CPU.h"
#include "../ADC0832/ADC0832.h"


/********************************************************************************/
/* function : ADC_set_clk()                                                     */
/* recension: xillinx                                                           */
/* descript : 设置或者清除ADC的CLK引脚                                          */
/********************************************************************************/
void ADC_set_clk(unsigned char clk)
{   if(clk)
    {  c51_U19_latch|=0x08;
    }
    else
    {  c51_U19_latch&=0xF7;
    }
    c51_hc138_cs_io2[0x0]=c51_U19_latch;
}

/********************************************************************************/
/* function : ADC_set_sel()                                                     */
/* recension: xillinx                                                           */
/* descript : 设置或者清除ADC的CS引脚                                           */
/********************************************************************************/
void ADC_set_sel(unsigned char sel)
{   if(sel)
    {  c51_U19_latch|=0x04;
    }
    else
    {  c51_U19_latch&=0xFB;
    }
    c51_hc138_cs_io2[0x0]=c51_U19_latch;
}

/********************************************************************************/
/* function : ADC_set_dat()                                                     */
/* recension: xillinx                                                           */
/* descript : 设置或者清除ADC的DATA引脚                                         */
/********************************************************************************/
void ADC_set_dat(unsigned char dat)
{   ADC_DA=dat;
}

/********************************************************************************/
/* function : ADC_set_dat()                                                     */
/* recension: xillinx                                                           */
/* descript : 设置或者清除ADC的DATA引脚                                         */
/********************************************************************************/
unsigned char ADC_get_dat(void)
{   return ADC_DA;
}

/********************************************************************************/
/* function : ADC_delay()                                                       */
/* recension: xillinx                                                           */
/* descript : 简单延时处理                                                      */
/********************************************************************************/
void ADC_delay(unsigned char time)
{   unsigned char i; 
    for(i=0;i<time;i++)
    {   ;
    }
}

/********************************************************************************/
/* function : ADC_read_1_channel()                                              */
/* recension: xillinx                                                           */
/* descript : 读取第一通道的数据                                                */
/********************************************************************************/
unsigned char ADC_read_channel(unsigned char channel)
{   unsigned char mdata=0x0;
    unsigned char i;
    ADC_set_sel(0x1);           //* CS=1,CK=0,禁止芯片工作,设置初始工作态;
    ADC_delay(0x2); 
    ADC_set_clk(0x0); 
    ADC_delay(0x2);
    
    ADC_set_sel(0x0);           //* 启动工作
    
    ADC_set_dat(0x1);           //* 第1个时钟,上升沿采样 START位, 此时DATA=1
    ADC_delay(0x2); 
    ADC_set_clk(0x1);           
    ADC_delay(0x2);
    ADC_set_clk(0x0);
    
    ADC_set_dat(0x1);           //* 第2个时钟,上升沿采样 通道/差分 选择(本设计选择通道,所以为1)
    ADC_delay(0x2); 
    ADC_set_clk(0x1);           
    ADC_delay(0x2);
    ADC_set_clk(0x0);
    
    if( channel==0x0)
    {   ADC_set_dat(0x0);       //* 第3个时钟,上升沿采样 通道编号 0 通道
    }
    else
    {   ADC_set_dat(0x1);       //* 通道编号 1 通道
    }
    ADC_delay(0x2); 
    ADC_set_clk(0x1);           
    ADC_delay(0x2);
    ADC_set_clk(0x0);
    
    ADC_set_dat(0x1);           //* 第4个时钟之前,需要把ADC_DA设置成为1,作为输入引脚用了,这个时钟周期是空闲的
    ADC_delay(0x2); 

    /****************************************************************************/
    /* 读取ADC数据 */
    /****************************************************************************/
    for(i=0x0;i<0x8;i++)
    {   mdata<<=0x1;
        ADC_set_clk(0x1);       //* 上升沿ADC不处理
        ADC_delay(0x2);
        ADC_set_clk(0x0);       //* 下降沿ADC输出数据
        ADC_delay(0x2);
        if(ADC_get_dat()) 
        {  mdata|=0x01;
        }
    }
    
    /****************************************************************************/
    /* 恢复初始化状态 */
    /****************************************************************************/
    ADC_delay(0x2);
    ADC_set_sel(0x1);           //* CS=1,CK=0,禁止芯片工作,设置初始工作态;
    ADC_delay(0x2); 
    ADC_set_clk(0x0); 
    ADC_delay(0x2);
    
    return mdata;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?