• 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口,一般需要加排阻。
    每个人都会有一段异常艰难的时光 。 生活的压力 , 工作的失意 , 学业的压力。 爱的惶惶不可终日。 挺过来的 ,人生就会豁然开朗。 挺不过来的 ,时间也会教你 ,怎么与它们握手言和 ,所以不必害怕的。 ——杨绛
  • 相关阅读:
    postgresql创建表
    PG查询数据库大小
    unicode字符集范围
    删除mysql数据中的空格和换行符
    无法生成模型:“System.Data.StrongTypingException: 表“TableDetails”中列“IsPrimaryKey”的值为 DBNull
    ubuntu 16.04 64位 coreseek
    linux wps 缺失字体问题解决
    误删除/var/lib/dpkg解决办法
    Microsoft Office CVE-2017-8570
    mariadb ==> 开机自启动
  • 原文地址:https://www.cnblogs.com/zhai1997/p/9065856.html
Copyright © 2020-2023  润新知