• STC单片机17——adc 8032


    /*********************************包含头文件********************************/
    #include
    #include
    /*********************************端口定义**********************************/
    sbit CS   = P3^5;
    sbit Clk = P3^3;
    sbit DATI = P3^4;
    sbit DATO = P3^4;
    sbit  P20=P2^0 ;
    /*******************************定义全局变量********************************/
    unsigned char dat = 0x00;      //AD值
    unsigned char count = 0x00;      //定时器计数
    unsigned char CH;       //通道变量
    unsigned char dis[] = {0x00, 0x00, 0x00};       //显示数值
    /*******************************共阳LED段码表*******************************/
    unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//零到九
    unsigned char code tablewe[]={0xfd,0xfb,0xf7,0xef,0xdf,0xfe};
    /****************************************************************************
    函数功能:AD转换子程序
    入口参数:CH
    出口参数:dat
    ****************************************************************************/
    unsigned char adc0832(unsigned char CH)
    {
        unsigned char i,test,adval;
         adval = 0x00;
         test = 0x00;
         Clk = 0;       //初始化
         DATI = 1;
        _nop_();
        CS = 0;
        _nop_();
        Clk = 1;
       _nop_();
       if ( CH == 0x00 )      //通道选择
       {
           Clk = 0;
           DATI = 1;      //通道0的第一位
           _nop_();
          Clk = 1;
            _nop_();
            Clk = 0;
          DATI = 0;      //通道0的第二位
          _nop_();
          Clk = 1;
          _nop_();
        }
        else
        {
           Clk = 0;
          DATI = 1;      //通道1的第一位
           _nop_();
           Clk = 1;
           _nop_();
          Clk = 0;
          DATI = 1;      //通道1的第二位
        _nop_();
         Clk = 1;
         _nop_();
        }
          Clk = 0;
          DATI = 1;
        for( i = 0;i < 8;i++ )      //读取前8位的值
        {
           _nop_();
           adval <<= 1;
           Clk = 1;
           _nop_();
           Clk = 0;
           if (DATO)
              adval |= 0x01;
          else
              adval |= 0x00;
        }
          for (i = 0; i < 8; i++)      //读取后8位的值
          {
               test >>= 1;
               if (DATO)
                  test |= 0x80;
               else
                  test |= 0x00;
              _nop_();
              Clk = 1;
              _nop_();
              Clk = 0;
          }
          if (adval == test)      //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
            dat = test;
           _nop_();
           CS = 1;        //释放ADC0832
           DATO = 1;
           Clk = 1;
          return dat;
    }
    /****************************************************************************
    函数功能:延时子程序
    入口参数:
    出口参数:
    ****************************************************************************/
    void delay(void)
    {
        int k;
        for(k=10;k<500;k++);
    }
    /****************************************************************************
    函数功能:将0-255级换算成0.00-5.00的电压数值
    入口参数:i
    出口参数:
    ****************************************************************************/
    void convdata(unsigned char i)
    {    
        dis[0] = i/51;       //个位
        dis[1] = (i%51)*10/51*2;      //小数点后第一位
        dis[2] = ((i%51)*10%51)*10/51*2;     //小数点后第二位
    }
    /****************************************************************************
    函数功能:数码管显示子程序
    入口参数:
    出口参数:
    ****************************************************************************/
    void display(void)
    {      
        P2=0xff;
        P0=tab[dis[0]] & 0x7f;      //显示个位和小数点
        delay();
        P2=0xfd;
        
        P2=0xff;
        P0=tab[dis[1]];       //显示小数点后第一位
        delay();
        P2=0xfb;
        
        P2=0xff;
        P0=tab[dis[2]];       //显示小数点后第二位
        delay();
        P2=0xf7;

        P2=0xff;
        P0=0xff;       //显示小数点后第二位
        delay();
        P2=0xfe;    
    }
    /****************************************************************************
    函数功能:主程序
    入口参数:
    出口参数:
    ****************************************************************************/
    void main(void)
    {
        P2=0xff;       //端口初始化
        P0=0xff;      
        delay();
        CH = 0x00;       //在这里选择通道 0x00或0x01
        TMOD = 0x01;       //设置中断
        TH0=(65536-50000)/256;//定时器1初值定时50ms
        TL0=(65536-50000)%256;
       IE = 0x82;
       TR0 = 1;
        while(1)       //主循环          
        {  dat = adc0832(CH);
          convdata(dat);      //数据转换
           display();      //显示数值
        }
     }
     /****************************************************************************
    函数功能:定时器中断延时程序 这一段的作用时隔一段时间抽样一次 否侧显示的最后一位会不稳定
    入口参数:
    出口参数:
    ****************************************************************************/
    void timer0(void) interrupt 1
    {
        TMOD = 0x01;
        TH0=(65536-50000)/256;//定时器1初值定时50ms
        TL0=(65536-50000)%256;
        IE = 0x82;
        TR0 = 1;
        count++;
        if (count == 0x01)
        {
           count = 0x00;
           dat = adc0832(CH);
        }
    }    

    完整资料打包(含仿真): 

    STC51单片机17-adc8032资源-单片机文档类资源-CSDN下载

  • 相关阅读:
    弘辽科技:拼多多商品转化率低有什么影响?多少正常?
    在启智平台上安装anconda(启智平台中新建调试任务,选的基础镜像中有conda的,就无需安装)
    深度学习(pytorch)——神经网络完整模型训练套路及其注意事项
    数学建模整理-层次分析法
    飞书应用配置+蓝鲸流水线+jump server
    获取了文心一言的内测及与其ChatGPT、GPT-4 对比结果
    深度学习在蛋白质结构预测的新突破:AlphaFold、RoseTTAFold与ESMFold
    HHDBCS监控功能
    思想总结
    Redis server启动后会做哪些操作?
  • 原文地址:https://blog.csdn.net/fengyuzhe13/article/details/127781972