zoukankan      html  css  js  c++  java
  • ADC0832的应用

      ADC0832是美国国家半导体公司生产的一种8位逐次比较型CMOS双通道A-D转换器,采用5V电源电压供电,模拟电压输入范围为0~5V,内部时钟250KHz时转换速度为32微秒。

    仿真图为:

    程序为:

    /********预处理***********/
    #include <reg51.h>
    #include "ADC0832.c"                 //调用ADC0832驱动程序
    code uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};        //声明包含0123456789的一个十六进制的数组
    uchar cp1,cp2;                   //声明变量cp1,cp2;
    uint dat_ad;                   //声明变量dat_dat
    //sbit P3_0 = P3^0;
    void timer0_isr(void);                                                               //声明中断服务函数
    void timer0_init(void);                                                              //声明中断初始化函数
    /***********主函数******************/
    void main(void)
    {
     timer0_init();
     adc0832_init();
     while(1);
    }
    /*********************T0中断服务函数**************************/
    void timer0_isr(void)interrupt 1
    {
     TH0 = 0xf8;
     TL0 = 0x2f;
     cp1++;
     if(cp1 >= 250)                                                              //0.5s
     {
      cp1 = 0;
      dat_ad = adc0832_ch0();                                   //0.5秒让ADC0832转换一次
      dat_ad = dat_ad * 1.96;                      //数据254对应模拟电压5V
     }          
     P0 = 0xff;                                                                        //仿真需要消隐
     switch(cp2)                     //模拟电压显示0~5V
     {
      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;       //个位显示和小数点显示
     }
     cp2++;
     if(cp2 >= 3)cp2 = 0;        
    }
    /*T0初始化函数*/
    void timer0_init(void)
    {
     TMOD = 0x01;                                        //中断方式1
     TH0 = 0xf8;
     TL0 = 0x2f;                                         //对机器脉冲计数,2000个计满溢出引发中断
     EA = 1;               //开总中断
     ET0 = 1;              //开T0中断
     TR0 = 1;              //启动定时器To
    }

    AD0832程序:/*ADC0832驱动程序*/
    /*ADC0832模数转换将连续变化的模拟信号转换为离散的数字信号V = 5 / 256 = 0.01953v = 19.53mv*/
    #include <intrins.h>     //调用intrins.h库
    #define nop _nop_()      //将 _nop_()宏定义为 nop    /** _nop_()是空指令,延时一个指令周期,在51单片机中,外部晶振是12M,那么延时时间为1、12M*12=1us;*/
    #define uchar unsigned char    //将unsigned char宏定义为ucahr
    #define uint unsigned int         //将unsigned int 宏定义为uint
    sbit CS = P3^0;       //片选使能,低电平使能
    sbit CLK = P3^1;      //时钟输入
    sbit DIDO = P3^2;      //数据信号输入
    /********对ACD0832初始化*************/
    void adc0832_init(void)
    {
     CS = 1;nop;
     CLK = 1;
     CS = 0;
    }
    /**********对转换CH0通道的模拟信号**************/
    uchar adc0832_ch0(void)         //包含11个clk下降沿
    {
     uchar i,dat;       //声明一个i,dat;
     adc0832_init();       //调用adc0832_init();
     DIDO = 1;CLK = 0;nop;CLK = 1;nop;  //sck第1个下降沿到来时,di启动DAC0832
     DIDO = 1;CLK = 0;nop;CLK = 1;nop;  //sck第2个下降沿
     DIDO = 0;CLK = 0;nop;CLK = 1;nop;  //sck第3个下降沿,发送1、0选择通道ch0
     DIDO = 1;                            //释放总线
     for(i = 0;i < 8;i++)     //sck第4个下降沿到第11个下降沿
     {
      CLK = 0;nop;
      if(DIDO)dat |= 0x01;
      CLK = 1;nop;
      dat = dat <<= 1;        //dat=(dat按位右移1位)
     }
     return(dat);       //返回dat
     CS = 1;
    }

    谢谢浏览,第一次接触到博客,有点小激动,哈哈!

  • 相关阅读:
    LOJ6274 数字
    test20200415 看门人 和 WC2010 重建计划
    TJOI2018 Party 和 HDU4352 XHXJ's LIS
    LOJ3228 Tree Depth
    AGC026D Histogram Coloring
    LOJ3277 星座 和 BZOJ2616 PERIODNI
    LOJ2331 某位歌姬的故事 和 CF1327F AND Segments
    AGC024F Simple Subsequence Problem
    LOJ3278 收获
    LOJ3282 治疗计划
  • 原文地址:https://www.cnblogs.com/ma1998/p/9022194.html
Copyright © 2011-2022 走看看