⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad例2.txt

📁 STC12系列单片机AD转换源码函数,可以直接掉用,支持最新STC单片机.
💻 TXT
字号:
 //--------------------------------------------------------------------
void AD_init(uchar AD_port_sel ) //ADC初始化,参数是你选择的ADC端口
{
 ADC_CONTR|=0x80;  //开ADC电源

 switch(AD_port_sel) //选择作为ADC的端口
 {
  case 0:
  P1M0=0x01;//设置输出Z态
  P1M1=0x00;
  ADC_CONTR&=0xf8;

  break;
  
  case 1:
  P1M0=0x02;
  P1M1=0x00;
  ADC_CONTR&=0xf8;
  ADC_CONTR|=0x01;
  break;

  case 2:
  P1M0=0x04;
  P1M1=0x00;
  ADC_CONTR&=0xf8;
  ADC_CONTR|=0x02;
  break;

  case 3:
  P1M0=0x08;
  P1M1=0x10;
  ADC_CONTR&=0xf8;
  ADC_CONTR|=0x03;
  break;

  case 4:
  P1M0=0x10;
  P1M1=0x00;
  ADC_CONTR&=0xf8;
  ADC_CONTR|=0x03;
  break;

  case 5:
  P1M0=0x20;
  P1M1=0x00;
  ADC_CONTR&=0xf8;
  ADC_CONTR|=0x05;
  break;

  case 6:
  P1M0=0x40;
  P1M1=0x00;
  ADC_CONTR&=0xf8;
  ADC_CONTR|=0x06;
  break;

  case 7:
  P1M0=0x80;
  P1M1=0x80;
  ADC_CONTR&=0xf8;
  ADC_CONTR|=0x07;
  break;
 }
 ADC_CONTR=0xe7;
}
//--------------------------------------------------------------------
uint GET_AD_Result()//启动AD转换并返回转换值
{
 uchar temp;
 uint data_temp;
 data_temp=0;
 ADC_DATA=0;
 ADC_LOW2=0;
 ADC_CONTR|=0x08;
re: temp=0x10;
 temp&=ADC_CONTR;
 if(temp==0)
  goto re;
 ADC_CONTR&=0xe7;
 data_temp=ADC_DATA;
 data_temp<<=2;
 data_temp+=ADC_LOW2;
 return data_temp;
}
//--------------------------------------------------------------------

使用的例子:

void main()//应用例子

{

uint xdata record[128];

uchar k; 

AD_init(7);//选择P1.7口做ADC,当然此口现为Z态

for(k=0;k<128;k++)
   {
    record[k]=GET_AD_Result();启动ADC并保存结果
   
   }

while(1);

}





/*************************************/
/*=================================================================
                        ADC_TURNON(uchar speed,chanl)
                     启动ADC并转换ADC得出转换值  
==================================================================*/
 uchar ADC_TURNON(uchar speed,chanl)
 {
   uint x,y,z;
    uchar i;
   EA=0;
   //整理SPEED
   speed&=0x03;
   speed=speed<<5;
   //整理通道chanl
   chanl&=0x07;
    //ADC_POWER开
    ADC_CONTR=0x80;
    delay_us(100);
    //加入转换速度SPEED1/SPEED0
    ADC_CONTR|=speed;
   //加入通道CHS2/CHS1/CHS0
   ADC_CONTR|=chanl;
   //启动转换
   ADC_CONTR|=0x08;
   delay_us(5);
   //查结束标志位
   while((ADC_CONTR&&0x10)==0)  
   //复位ADC_FLAG
   ADC_CONTR&=0xef;
   //
    x=ADC_DATA;
    x=x*256;
    x=x>>6;
    y=ADC_LOW2&0x03;
    z=x+y;
    i=z/4;
    return(i);
  
 } 
/**********************************************/
/***************** A/D转换********************/
void Ad_Change()

float AD_Result_Temp = 0;
unsigned long AD_1=0;
 uchar k;

ADC_CONTR = ADC_CONTR|0x80;  //1000,0000打开A/D转换电源
P1M0 = 0x08;                      //0000,1000用于A/D转换的P1.3口,先设为开漏
P1M1 = 0x08;                      //0000,1000P1.3先设为开漏。断开内部上拉电阻
delay(20);                         //20

ADC_CONTR = ADC_CONTR&0xE0; //1110,0000 清ADC_FLAG,ADC_START位和低3位
ADC_CONTR = ADC_CONTR|0x03; //设置当前通道号P1.3

delay(1);                      //延时使输入电压达到稳定
ADC_DATA = 0;                    //清A/D转换结果寄存器
ADC_LOW2 = 0;

     ADC_CONTR = ADC_CONTR|0x08; //0000,1000ADCS = 1,启动转换

     do { ; }     
     while((ADC_CONTR & 0x10)==0);    //0001,0000等待A/D转换结束


ADC_CONTR = ADC_CONTR&0xE7; //1110,0111清ADC_FLAG位,停止A/D转换

AD_1 = ((AD_1|ADC_DATA)<<2)|(ADC_LOW2&0x03);    //保存返回AD转换的 结果
AD_Result_Temp = 5*AD_1*1000/1024;
AD_1=AD_Result_Temp;
AD_channel_result[3] = AD_1/1000;        // 转换成可显示的字符,从最高位到最低位
AD_channel_result[2] = (AD_1%1000)/100;
AD_channel_result[1] = (AD_1%100)/10;
AD_channel_result[0] = AD_1%10;

dis_data[0]=AD_channel_result[0];
dis_data[1]=AD_channel_result[1];
dis_data[2]=AD_channel_result[2];
dis_data[3]=AD_channel_result[3]; 
 
  for(k=0;k<4;k++)
    {
    P2=0xff;
    P2=dis_code[dis_data[k]];
    P1=col_con[k];
    delay(15);            //调试数码管更新时间
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -