专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

单片机驱动ADC0832模数转换程序

作者:竹园电科技   来源:本站原创   点击数:  更新时间:2014年03月18日   【字体:

ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。
ADC0832具有以下特点:
8位分辨率;
双通道A/D转换;
输入输出电平与TTL/CMOS相兼容;
5V电源供电时输入电压在0~5V之间;
工作频率为250KHZ,转换时间为32μS;
一般功耗仅为15mW;
8P、14P—DIP(双列直插)、PICC多种封装;
商用级芯片温宽为0°C to +70°C?,工业级芯片温宽为40℃ to +85℃

      模数转换芯片是用来模拟信号转为数字信号以便电脑处理的,可以用来对传感器的数据进行收集分析。本来想买ADC0809的,它可以对8个模拟量进行采集,假如是一个脚用三个压力传感器,那就正好够用了。这个ADC0832是跟单片机开发板一个淘宝店买的,因为那个淘宝店没有ADC0809。网上搜了个ADC0832的转换函数,拼了个程序在开发板的四位数码管上显示转换过来的数据,要注意的是那个显示函数是调一次只显示四位数码管的一位的,所以不能转换显示转换显示这样,要转换,显示一次二次三次四次,转换,显示一次二次三次四次这样。ADC0832引脚及代码如下:(一晚没睡,等下准备回家过清明扫墓去。归去来兮!问西楼禁烟何处好?绿野晴天道。马穿杨柳嘶,人倚秋千笑,探莺花总教春醉倒。)


 


//头文件:
#include <reg51.h>
#include <intrins.h>
//变量定义:
unsigned char ly_dis[4];   //定义显示缓冲区
code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//表:共阳数码管 0-9
unsigned char l_posit=0; //显示位置
//引脚定义: 
sbit SMG_q = P3^4; //定义数码管阳级控制脚(千位)
sbit SMG_b = P3^5; //定义数码管阳级控制脚(百位)
sbit SMG_s = P3^7; //定义数码管阳级控制脚(十位)
sbit SMG_g = P3^6; //定义数码管阳级控制脚(个位)

sbit CS   = P0^5;
sbit Clk = P0^6;
sbit DATI = P0^4;
sbit DATO = P0^4;

unsigned char dat = 0x00;      //AD值
unsigned char count = 0x00;      //定时器计数
unsigned char CH;       //通道变量

//函数声明:
void display(void);//显示函数,显示缓冲区内容
void delay(void);
//unsigned char GetValue0832(bit Channel);
unsigned char adc0832(unsigned char CH);

//主函数,C语言的入口函数:
void main()
{
 unsigned int i=0;
 int ltemp;
 while(1)
 {
  if(i==100)
  {
   ltemp=adc0832(1);       //隔时取模数转换(0~255对应0.00-5.00的电压)
   ly_dis[0]=ltemp/100;    //显示百位值
   ltemp=ltemp%100;
   ly_dis[1]=ltemp/10; //显示 十位值
   ltemp=ltemp%10;
   ly_dis[2]=ltemp/1; //显示 个位值
   ly_dis[3]=0;  //显示小数点后一位0
  }
  i++;
  if(i==3000)
   i=0;
  display(); //调用显示调一次只显示一位轮流显示四位
  delay();    
 }
}

//显示函数,参数为显示内容
void display()
{
 P0=0XFF;   //
 switch(l_posit){
 case 0:  //选择千位数码管,关闭其它位
  SMG_q=0;
  SMG_b=1;
  SMG_s=1; 
  SMG_g=1;
  P0=table[ly_dis[0]]; //输出显示内容
  break;
 case 1:  //选择百位数码管,关闭其它位
  SMG_q=1;
  SMG_b=0;
  SMG_s=1; 
  SMG_g=1;
  P0=table[ly_dis[1]];
  break;
 case 2:  //选择十位数码管,关闭其它位
  SMG_q=1;
  SMG_b=1;
  SMG_s=0; 
  SMG_g=1;
  P0=table[ly_dis[2]]&0x7f;
  break;
 case 3:  //选择个位数码管,关闭其它位
  SMG_q=1;
  SMG_b=1;
  SMG_s=1; 
  SMG_g=0;
  P0=table[ly_dis[3]];
  break;
 }
 l_posit++;  //每调用一次将轮流显示一位
 if(l_posit>3)
  l_posit=0;
}

//延时子函数,短暂延时
void delay(void){ 
 unsigned char i=10;
 while(i--);
}

/****************************************************************************

函数功能: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;
}

关闭窗口

相关文章