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

📄 add.c

📁 这是c8051F005的AD转换程序
💻 C
字号:
//************************************************************

// AD采样程序


// (1)使用C8051F005芯片

// (2)外部晶振11.0592MHZ ,使用内部2.4V基准电压

// (2)单端输入方式,两通道输入ANIO、ANI1,向ADBUSY置1启动AD转换

// (3)对采样10次在求平均值以减小误差

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

#include <c8051f000.h>               

#include <stdio.h>

 
                                                                                                                                                                                          

sfr16 ADC0     = 0xbe;                 

sfr16 ADC0GT   = 0xc4;                 

sfr16 ADC0LT   = 0xc6; 

#define SYSCLK       18432000            //系统时钟 频率   

void ADC0_Init (void);                      //AD转换初始化设置函数

void ADC0_ISR (void);                      //AD转换中断函数

void delay (int t);                           //延时程序

void SYSCLK_Init (void);                    //系统时钟函数

void WDT_CLOSE(void);                    //关闭看门狗

int result; value1,value2;              //数据存储

char  flag;            //标志

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

//关闭看们狗

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

void WDT_CLOSE(void)

{  EA=0;

   WDTCN = 0xde;                       

   WDTCN = 0xad;                     

   EA=1;

 }

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

//系统时钟设置

//晶振振荡方式,F>6.7mhz

//选用外部时钟

//允许时钟复位

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

void SYSCLK_Init (void)

{  int i;

                              

   OSCXCN = 0x67;                     

   for (i=0; i < 256; i++)  ;           

   while (!(OSCXCN & 0x80)) ;         //等待外部准备      

   OSCICN = 0x88;                      

                                      

 }



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

//AD初始化设置

//AIN0 独立输入

//使用内部参考电压, PGA= 2,使用4系统时钟

//转换数据右对齐

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

void ADC0_Init (void)

{

   ADC0CN = 0x40;                   //右对齐           

   REF0CN = 0x03;                   //使用内部参考电压              

                                       

   

   AMX0CF = 0x00;    

           

   ADC0CF = 0x20;                   // 4系统时钟     PGA  1       



   EIE2  |= 0x02;                     // 中断开            

}

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

//AD转换程序

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

void ADC0_ISR (void) 

{    



   ADCINT = 0;                       //清除中断标准位
   
   EIE2  = 0x02;                       //允许ADC0转换结束中断

   ADBUSY =1;                        //开始AD转换
   
   while(ADCINT == 0)

   delay (10);                           //延时等待AD转换稳定

   

   result = ADC0;                       //数据转存

   
   flag = 1;

  }

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

//延时子程序

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

void delay (int t)

{ int i,j;

     for (i=0;i<t;i++)

           for(j=0;j<10;j++) ;

}

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

//MAIN

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

void main (void)       

  { int i=0;

    float voltage1=0 , voltage2=0;

    WDT_CLOSE();                       //关闭看门狗

    SYSCLK_Init ( );                      //系统时钟设置

    

    ADC0_Init ();                         //AD初始化 

   

	ADCEN = 1;                          //AD转换允许打开

   EA = 1;                          

    flag = 0;

    while (1)                                //循环

       {                        
 
         for(i=0;i++;i<9)         

		   {

		      AMX0SL = 0x00;                   //AIN0 独立输入

              ADC0_ISR () ;                    // AIN0 AD转换开始
          
		     while (flag == 1)

                 { flag = 0;

                   
                  value1 += result;        

                   }
		  	   
               }

           EIE2 = 0x00;                         //ADC0转换结束中断禁止 

           for(i=0;i++;i<9)         

		   {

		      AMX0SL = 0x01;                   //AIN1 独立输入

              ADC0_ISR () ;                    // AIN1 AD转换开始
          
		     while (flag == 1)

                 { flag = 0;

                   
                  value2 += result;        

                   }
				   
               }

           EIE2  =  0x00;                         //ADC0转换结束中断禁止

           while(i==9)                //测量10次的值求平均值

                   { i=0;

                     voltage1=(float)value1/10;

                     value1=0;

					 voltage2=(float)value2/10;

                    }
       
         }

}

⌨️ 快捷键说明

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