www.pudn.com > ADC0832led.rar > ADC0832.C


 
 
#include"reg51.h" 
#include"intrins.h" 
 
#define uchar unsigned char 
#define uint  unsigned int 
 
#define disdata  P0        //显示数据段码输出口 
 
#define channel_0  0x02   //单通道0输入选择 
#define channel_1  0x03   //单通道1输入选择 
 
sbit ADC_CS = P3^4;        //片选端 
sbit ADC_CLK= P1^0;        //时钟端 
sbit ADC_DI = P1^1;        //数据输入输出复用 
sbit ADC_DO = P1^1;        //DI和DO端都接在P1.1 
 
sbit  ACC0=ACC^0;          //通道与输入方式控制字 
sbit  ACC1=ACC^1;          //通道与输入方式控制字 
sbit  DISX=P0^7;           //LED小数点 
 
uchar code disply[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};  
 
                     // 0    1    2    3    4    5    6    7    8    9   关闭 
 
uchar code dis_scan[3]={0x7f,0xbf,0xdf}; //列扫描控制字 
 
uint data dis[4]={0x00,0x00,0x00,0x00}; //定义3个显示数据单元和一个数据存储单元  
 
/********************************************************************/ 
/*                                                                  */ 
/* 延时函数                                                         */ 
/*                                                                  */ 
/********************************************************************/ 
 
delay(int ms) 
{                            
    int i; 
    while(ms--) 
    { 
      for(i = 0; i< 250; i++) 
      { 
       _nop_(); 
       _nop_(); 
       _nop_(); 
       _nop_(); 
      } 
    } 
} 
 
/********************************************************************/ 
/*                                                                  */ 
/*  启动ADC转换                                                     */ 
/*                                                                  */ 
/********************************************************************/ 
 
ADC_start()  
{ 
    ADC_CS=1;         //一个转换周期开始 
    _nop_();  
    ADC_CLK=0;       
    _nop_(); 
    ADC_CS=0;         //CS置0,片选有效 
    _nop_(); 
    ADC_DI=1;         //DI置1,起始位 
    _nop_(); 
    ADC_CLK=1;        //第一个脉冲 
    _nop_(); 
    ADC_DI=0;         //在负跳变之前加一个DI反转操作 
    _nop_(); 
    ADC_CLK=0;       
    _nop_();       
} 
  
/********************************************************************/ 
/*                                                                  */ 
/*AD转换函数                                                        */ 
/*选择输入通道,输入信号的模式《单端输入,或差分输入》              */ 
/*                                                                  */ 
/********************************************************************/ 
            
ADC_read(uchar mode) 
{ 
    uchar i; 
    ADC_start();      //启动转换开始 
    ACC=mode; 
    ADC_DI=ACC1;      //输出控制位1,DI=1,单通道输入,DI=0,差分输入。 
    ADC_CLK=1;        //第二个脉冲 
    _nop_(); 
    ADC_DI=0; 
    ADC_CLK=0; 
    _nop_(); 
    ADC_DI=ACC0;      //输出控制位0,DI=0,通道0输入,DI=1,通道1输入。 
    ADC_CLK=1;        //第三个脉冲 
    _nop_(); 
    ADC_DI=1; 
    ADC_CLK=0;        //输入模式和通道号已经选择完。 
 
    ADC_CLK=1;        //第四个脉冲 
    ACC=0;                  
     
    for(i=8;i>0;i--)  //读取8位数据 
  {                       
    ADC_CLK=0;        //脉冲下降沿 
    
    ACC=ACC<<1; 
    ACC0=ADC_DO;      //读取DO端数据 
    _nop_(); 
    _nop_();                 
    ADC_CLK=1;                    
  } 
    ADC_CS=1;         //CS=1,片选无效。 
    return(ACC); 
} 
 
/********************************************************************/ 
/*                                                                  */ 
/* 数据处理与显示函数                                               */ 
/* 将采集到的数据进行16进制转换为10进制的处理,然后送显示。         */ 
/*                                                                  */ 
/********************************************************************/ 
 
show_value(uchar ad_data) 
 
{ 
    uchar  k;  
  
    dis[2]=ad_data/51;   //AD值转换为3为BCD码,最大为5.00V。 
    dis[3]=ad_data%51;   //余数暂存 
    dis[3]=dis[3]*10;    //计算小数第一位 
    dis[1]=dis[3]/51; 
    dis[3]=dis[3]%51; 
    dis[3]=dis[3]*10;    //计算小数第二位 
    dis[0]=dis[3]/51;                                                                             // 
      
    for(k=0;k<3;k++) 
     { 
       disdata=disply[dis[k]]; 
       if(k==2){DISX=0;} 
       P2=dis_scan[k]; 
       delay(1); 
       P2=0xff; 
     }           
}  
       
/********************************************************************/ 
/*                                                                  */ 
/*  主函数                                                          */ 
/*                                                                  */ 
/********************************************************************/ 
main() 
{  
    uchar i,j; 
    while(1) 
    { 
      i=ADC_read(channel_0); 
      for(j=0;j<20;j++)       
      { 
        show_value(i); 
      }      
    } 
} 
  
/********************************************************************/  
/*                                                                  */ 
/*将i=ADC_read(channel_0)改为i=ADC_read(channel_1)即可使用JP6输入   */ 
/*                                                                  */ 
/********************************************************************/