zoukankan      html  css  js  c++  java
  • ADC0832

    #include <reg51.h>
    #include "ADC0832.c"
    code uchar seven_seg[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//共阳数码管0--9(0时为有效断)
    uchar cp, j; 
    uint dat_ad;
    void timer0_isr(void);              //声明中断服务函数
    void timer0_init(void);          //声明中断初始化函数
    
    void main(void)                     /**************************主函数**************************/
    {
        timer0_init();                 //中断初始化函数
        adc0832_init();                 //adc0832初始化函数
        while(1);                     //表示一个死循环,循环一直运行下去
    }
    /***********************中断服务函数************************/
    void timer0_isr(void) interrupt 1
    {
        TH0 = 0xf8;
        TL0 = 0x2f;
        cp++;
        if(cp > 250)               //0.5秒·
        {
            cp = 0;
            dat_ad = adc0832_cho();//0.5秒让ADC0832转换一次
            dat_ad = dat_ad * 1.96;//模拟信号转化为数字信号
        }              
        P0 = 0xff;
        switch(j)
        {
            case 0: P0 = seven_seg[dat_ad  % 10]; P2 = ~0x01;break;               //  模拟信号
            case 1: P0 = seven_seg[dat_ad  % 100/10]; P2 = ~0x02;break;//
            case 2: P0 = seven_seg[dat_ad / 100]& 0x7f; P2 = ~0x04;break;//
            case 3: P0 = seven_seg[adc0832_cho()% 10]; P2 = ~0x08; break;   //、   数字信号
            case 4: P0 = seven_seg[adc0832_cho()% 100 / 10]; P2 = ~0x10;break;//
            case 5: P0 = seven_seg[adc0832_cho() / 100]; P2 = ~0x20; break;//
        }
        j++;
        if(j >= 6)
        j = 0;                                 //共显示六位
    }
    /***********************中断初始化函数**********************/
    void timer0_init(void)
    {
        TMOD = 0x01;     //中断方式1    
        TH0 = 0xf8;
    
        TL0 = 0x2f;        //对机器脉冲计数,2000个计满溢出引发中断
        EA = 1;            //开总中断
        ET0 = 1;        //开T0中断
        TR0 = 1;        //启动定时器T0
    }
    
    
    
    
    
    
    
    
    
    /****************************************************************************************/
    /*************************************ADC0832的驱动程序***********************************/
    /*ADC0832模数转换将连续变化的模拟信号转换为离散的数字信号V = 5 / 256 = 0.01953v = 19.53mv*/
    /****************************************************************************************/
    #include <intrins.h>
    #define nop _nop_()
    #define uchar unsigned char      //宏定义用uchar 代替 unsigned char
    #define uint unsigned int      //宏定义用uint 代替 unsigned int
    sbit CS = P3^0;
    sbit CLK = P3^1;
    sbit DIDO = P3^2;
    
    
    void adc0832_init(void)          /*****ADC0832初始化函数*****/
    {
        CS = 1;                      //adc0832未工作时,CS端为高电平,此时芯片禁用
        nop;                      //对于延时很短的,要求在us级的,采用“_nop_”函数      
        CLK = 1;                  
        CS = 0;
    }                   
    
    uchar adc0832_cho(void)         //包含11个CLK下降沿      /**对转换CHO通道的模拟信号**/
    {
        uchar i, dat;
        adc0832_init();
        DIDO = 1; CLK = 0; nop; CLK = 1; nop; //SCLK第一个下降沿来到时,DI = 1启动ADC0832
        DIDO = 1; CLK = 0; nop; CLK = 1; nop; //SCLK第二个下降沿 
        DIDO = 0; CLK = 0; nop; CLK = 1; nop; //SCLK第三个下降沿,发送1,0选择通道cho
        DIDO = 1;                             //释放总线
        for(i = 0; i < 8; i++)                  //第四个下降沿到第11个下降沿
        {
            CLK = 0;                           //clk处于下降沿,每一个下降沿DO端输入下一个
            nop;                              //对于延时很短的,要求在us级的,采用“_nop_”函数      
            if(DIDO) dat |= 0x01;              // dat = dat | 0x01,dat和0x01做“或”的运算,意思是最低位置1,其它位保持不变。
            CLK = 1; nop;                      //clk处于上升沿
            dat <<= 1;                          //数据左移
        }
        return (dat);
        CS = 1;                                  //adc0832停止工作
    }
                                                               ADC0832应用
    (1)adc0832的作用
        ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。
    adc0832能将连续变化的模拟信号转化为离散的数字信号,以便于数字系统进行处理储存控制和显示。
    (2)对ADC0832的认识
        ADC0832 是美国生产的一种8 位分辨率、双通道A/D转换芯片。由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。学习并使用ADC0832 可使我们了解A/D转换器的原理,有助于我们单片机技术水平的提高。ADC0832将三位的0~5V的模拟信号转化为数字信号,通过单片机显示在数码管上。
    (3)adc0832工作原理
        当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示起始信号。在第2、3个脉冲下沉之前DI端应输入2 位数据用于选择通道功能。当此2 位数据为"1""0"时,只对CH0 进行单通道转换。当2位数据为"1""1"时,只对CH1进行单通道转换。当2 位数据为"0""0"时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当2 位数据为"0""1"时,将CH0作为负输入端IN-,CH1 作为正输入端IN+进行输入。到第三个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出DC0832封装以及各端子 完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATA0。随后输出8位数据,到19个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。
    (4)器件作用
        adc0832:将连续变化的模拟信号转化为离散的数字信号,以便于数字系统进行处理储存控制和显示。
        7404反相器:增大电流
        pothg这是微调电阻,中心抽头位置改变,整个电阻的阻值是没变的。只是,中心抽头和上端间的电阻最小,和下端间的电阻最大,在这里产生的是0~5V的模拟信号
        Respack_8:驱动,电流不够,加排阻增加电流,排阻一般有九个脚,一个脚接VCC,其他脚接单片机I/o口,比如说P0口,一般需要加排阻。
    每个人都会有一段异常艰难的时光 。 生活的压力 , 工作的失意 , 学业的压力。 爱的惶惶不可终日。 挺过来的 ,人生就会豁然开朗。 挺不过来的 ,时间也会教你 ,怎么与它们握手言和 ,所以不必害怕的。 ——杨绛
  • 相关阅读:
    phpcms后台进入地址(包含No permission resources错误)
    phpmyadmin上传大sql文件办法
    ubuntu彻底卸载mysql
    Hdoj 2602.Bone Collector 题解
    一篇看懂词向量
    Hdoj 1905.Pseudoprime numbers 题解
    The Python Challenge 谜题全解(持续更新)
    Hdoj 2289.Cup 题解
    Hdoj 2899.Strange fuction 题解
    Hdoj 2199.Can you solve this equation? 题解
  • 原文地址:https://www.cnblogs.com/zhai1997/p/9065856.html
Copyright © 2011-2022 走看看