adc0_temp_pro.c.lst

来自「c8051单片机源程序」· LST 代码 · 共 205 行

LST
205
字号
C51 COMPILER V6.14  ADC0_TEMP_PRO_C                                                        01/03/2006 13:57:42 PAGE 1   


C51 COMPILER V6.14, COMPILATION OF MODULE ADC0_TEMP_PRO_C
OBJECT MODULE PLACED IN ADC0_TEMP_PRO.c.OBJ
COMPILER INVOKED BY: C:\Cygnal\IDEfiles\C51\BIN\C51.exe ADC0_TEMP_PRO.c.c DB OE

stmt level    source

   1          //内部温度传感器调试程序//
   2          //利用过采样实现16位精度//
   3          //ADC0_TEMP_PRO.c
   4          #include <C8051F040.h>
   5          #include <absacc.h>
   6          #define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage
   7          #define STACK_LEN 128
   8          //采样128次,再将128个数据总和除以8
   9          //处理后的数据相当于16个原始数据之和,在数值表现形式上为16bit
  10          typedef unsigned int uint;
  11          typedef unsigned char uchar;
  12          typedef unsigned long ulong;
  13          sfr16 RCAP2=0xca;
  14          sfr16 RCAP3=0xca;
  15          sfr16 RCAP4=0xca;
  16          sfr16 TMR4=0xcc;
  17          sfr16 TMR3=0xcc;
  18          sfr16 TMR2=0xcc;
  19          sfr16 PCA0CP0=0xfb;
  20          sfr16 PCA0CP1=0xfd;
  21          sfr16 PCA0CP2=0xe9;
  22          sfr16 PCA0CP3=0xeb;
  23          sfr16 PCA0CP4=0xed;
  24          sfr16 PCA0CP5=0xe1;
  25          sfr16 ADC0VAL=0xbe;
  26          sfr16 ADC0GT=0xc4;
  27          sfr16 ADC0LT=0xc6;
  28          sfr16 DPTR=0x82;
  29          uchar temppage;
  30          bit isnewdata;
  31          bit canread;
  32          uint kk;
  33          
  34          float temp;
  35          xdata uchar stack_index;
  36          xdata ulong total;
  37          xdata int t[15000],t12[4000];//存放温度检测数据,为20个数据
  38          xdata uint ad16[20],ad12[20];
  39          xdata uint mystack[STACK_LEN];//过采样数据数组
  40          void adc0_mux(uchar type,uchar source);
  41          void adc0_source(uchar source);
  42          void p3anolog_ini(uchar port);
  43          void HVDA_ini(uchar gaind);
  44          void adc0_ini();
  45          void delay1ms(uint time);
  46          void config();
  47          void adc0_mux(uchar type,uchar source){//type 配置测量方式为差动还是单端输入
  48   1      //source 为ADC0通道选择(共有9个通道)
  49   1      	SFRPAGE=0x00;
  50   1      	AMX0CF=type;
  51   1      	AMX0SL=source;
  52   1      }
  53          void adc0_source(uchar source){//ADC0通道选择,为adc0_mux()的简化函数
  54   1      	SFRPAGE=0x00;
  55   1      	AMX0SL=source;
C51 COMPILER V6.14  ADC0_TEMP_PRO_C                                                        01/03/2006 13:57:42 PAGE 2   

  56   1      }
  57          void p3anolog_ini(uchar port){//配置p3口模拟输入管脚
  58   1      	SFRPAGE=0x00;
  59   1      	AMX0PRT=port;
  60   1      	SFRPAGE=0x0f;
  61   1      	P3MDIN&=~port;//将相应管脚配置成模拟输入口
  62   1      }
  63          void HVDA_ini(uchar gaind){//高压差动放大器配置
  64   1      	SFRPAGE=0x00;
  65   1      	HVA0CN=gaind;
  66   1      }
  67          void adc0_ini(){
  68   1      	SFRPAGE=0x00;
  69   1      	ADC0CF=0x80;//ADC0时钟为系统时钟17分频,PGA增益为1
  70   1      	ADC0CN=0x80;
  71   1      	/*AD0EN=1,ADC0模块使能
  72   1      	AD0TM=0,ADC0为连续跟踪模式
  73   1      	AD0CM1:AD0CM0=00b,为AD0BUSY启动方式
  74   1      	AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位*/
  75   1      	REF0CN&=0x0f;//AD0VRS=0,ADC0参考电压为VREFA
  76   1      	REF0CN|=0x07;//TEMPE=1,内部温度传感器工作
  77   1      	/*BIASE=1,偏移产生器工作
  78   1      	REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与VREF0(C8051F040的16管脚相连,并最
             -好并联一个4.7uF和0.1uF的旁路电容以电平滤波*/
  79   1      	adc0_source(9);//选择第9通道,即选择温度信号为AD转换
  80   1      //	EIE2 |= 0x02;        //开ADC0中断
  81   1      }
  82          void delay1ms(uint time){//延迟1ms
  83   1      	uint i;
  84   1      	uint j;
  85   1      	for (i=0;i<time;i++){
  86   2      		for(j=0;j<300;j++);
  87   2      	}
  88   1      }	
  89          void config(){
  90   1      //看门狗禁止
  91   1      	WDTCN = 0x07;	
  92   1          WDTCN = 0xDE;   
  93   1         	WDTCN = 0xAD;
  94   1      	SFRPAGE = 0x0F;
  95   1      //交叉开关使能,但没有进行外围设备配置
  96   1      	XBR0 = 0x00;	
  97   1      	XBR1 = 0x00;	
  98   1      	XBR2 = 0x40;
  99   1       	XBR3 = 0x00;   
 100   1      //管脚输出配置,P0口为开漏输出,其中P0.6接上拉电阻,P0为数字输入口
 101   1       	SFRPAGE = 0x0F;
 102   1       	P0MDOUT = 0x00; 
 103   1       	P1MDIN = 0xFF;  
 104   1      //晶振配置,采用内部晶振8分频
 105   1      	SFRPAGE = 0x0F;
 106   1       	CLKSEL = 0x00;  
 107   1      	OSCXCN = 0x00;	
 108   1      	OSCICN = 0x84;	
 109   1      }
 110          void main(){
 111   1      	uchar i;
 112   1      	uchar dataindex;
 113   1      	config();
 114   1      	adc0_ini();//ADC0初始化
 115   1      	ADC0START;//ADC0启动
 116   1      	EA=0;
C51 COMPILER V6.14  ADC0_TEMP_PRO_C                                                        01/03/2006 13:57:42 PAGE 3   

 117   1      	i=0;
 118   1      	stack_index=0;
 119   1      	canread=0;
 120   1      	dataindex=0;
 121   1      	while(1){
 122   2      		SFRPAGE=0x00;
 123   2      		if(AD0INT){
 124   3      		 XWORD<0x1020>=0X022;
*** WARNING C275 IN LINE 124 OF ADC0_TEMP_PRO.C.C: expression with possibly no effect
 125   3      				AD0INT=0;
 126   3      				isnewdata=1;
 127   3      				if(stack_index>=STACK_LEN){
 128   4      				/*STACK_LEN需小于等于256,否则stack_index要定义成uint型数据*/
 129   4      				stack_index=0;
 130   4      				canread=1;
 131   4      				}
 132   3      				mystack[stack_index]=ADC0VAL;
 133   3      		        
 134   3      				stack_index++;
 135   3      				ADC0START;
 136   3      		}
 137   2      		if(isnewdata&&canread){//由该位查询ADC0转化值是否更新
 138   3      			for(i=0,total=0L;i<STACK_LEN;i++)/*注意若i定义为char型,则进入死循环,因为条件判断恒真*/
 139   3      					total+=mystack[i];
 140   3      			total/=8L;//此时total的值即为16bit精度采样值
 141   3      			temp=(float)total/65536.0;
 142   3      			temp*=2.43;
 143   3      			temp-=0.776;
 144   3      			temp/=0.00286;//将测量值转化成真实温度值
 145   3      			isnewdata=0;
 146   3      			t[dataindex]=temp;//将温度检测值存入长度为20的数组中
 147   3      			ad16[dataindex]=(uint)total;
 148   3      			ad12[dataindex]=mystack[stack_index];
 149   3      			total=mystack[stack_index];/*12bit测量温度,以便与16bit过采样比较*/
 150   3      			temp=(float)total/4096.0;
 151   3      			temp*=2.43;
 152   3      			temp-=0.776;
 153   3      			temp/=0.00286;
 154   3      			t12[dataindex]=temp;
 155   3      			dataindex++;
 156   3      			if(dataindex>19)
 157   3      				dataindex=0;//在此设断点,观察程序运行结果
 158   3      			
 159   3      		}
 160   2      	}
 161   1      }
 162          void ADC0_ISR() interrupt 15{//ADC0中断,此程序中采用查询法,暂不用中断
 163   1      	SFRPAGE=0x00;
 164   1      	AD0INT=0;
 165   1      	isnewdata=1;
 166   1      	if(stack_index>=STACK_LEN){
 167   2      	//STACK_LEN需小于等于256,否则stack_index要定义成uint型数据
 168   2      		stack_index=0;
 169   2      		canread=1;
 170   2      	}
 171   1      	mystack[stack_index]=ADC0VAL;
 172   1      	stack_index++;
 173   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    735    ----
C51 COMPILER V6.14  ADC0_TEMP_PRO_C                                                        01/03/2006 13:57:42 PAGE 4   

   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =  38341    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  1 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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