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

📄 c8051f350.c

📁 C8051F350控制器
💻 C
字号:
/************************************************************************************
*  Copyright (c) 2007,Hangzhou Fenghe Shiyou Electronics Co.,Ltd
*            All rights reserved.
* name: MAIN.C
* applicable component:  C8051F350
* author:                caixinlin
* edition:               C
* amend data:            2007年8月18日
* complete data:         2007年月日
* 程序运行效果: 浅侧向调试,屏蔽深侧向 模拟电阻率0.2 1.0 2.0 5.0 10 20 50 100 200 1000,无穷大 
                           都控制在3.536-3.746
				 深侧向调试,屏蔽深侧向 模拟电阻率0.2 1.0 2.0 5.0 10 20 50 100 200 1000,无穷大 
                           都控制在3.487-3.556
                 输入波动太大,希望平滑上升或下降。控制速度比较慢
				 解决:电阻率将为50时,电流值超过5V的情况
*************************************************************************************/
	#include "C8051F350.h"
	#include "STDIO.h"
	#include "math.h"
	#include "string.h"

    /*全局常量定义*/
	#define     uchar         unsigned char                                     
	#define     uint          unsigned int
	#define     ul            unsigned long 
	#define     a             8                    
	#define     N             8
//	#define     k             89                   
//	#define     k_lld         89                
//	#define     k_lls         126                  
   	#define     c             300
   	#define     b             300	
	#define     e_h_area      2440               
	#define     e_l_area      6                
	#define     i_h_area      2440                 
	#define     i_l_area      6                  

    ul          data          ADC[4];       	
    ul          data          ADt[4]; 
    ul      	data    	  DATA_lld;   	
    ul      	data   	      DATA_lld_out; 	
	uchar     	data    	  X;  
	ul      	data          DATA_lls;  
    ul      	data   	      DATA_lls_out;   	 
    uint        data          ABSA;
    uint        data          ABSB;
	
    bit         lab_d;    // lld 阈值 
    bit         lab_s;    // lls 阈值
    bit         XXD;      // lld dac current control (1:2.0mA 0:0.25mA)
    bit         XXS;      // lls dac current control (1:2.0mA 0:0.25mA)

	void        DelayMs(uint n);		 
	void        SYSCLK_Init (void);   	
	void        PORT_Init (void);     	// I/O端口初始化
	void        ADC0_Init (void);     	// ADC0初始化
	void        DAC_Init (void);      	// DAC初始化
	void        ADC0_Conver (void);   	
	void        DAC0_Out_mV(uint v);  	
	void        DAC1_Out_mV(uint v);  	
    void        t0_ini();                 
    void        t0_rst();


void DelayMs(uint n)     //delay
   {uint i;
	for(; n > 0; n--)
	{for(i = 400; i > 0; i--);}
    }

void SysClk_Init(void)   // 配置系统时钟
   {OSCICN = 0x82;       // enable intosc   SYSCLK=12.25MHZ
    CLKSEL = 0x00;       // select intosc as sysclk source    
    }

void System_Init (void)  // 配置系统时钟
  { VDM0CN = 0x81;       // enable VDD monitor   
    RSTSRC = 0x02;       // enable VDD monitor reset sources  
	ADC0CN = 0x00;       // 单极性 PGA=1
   }

 void PORT_Init (void)
  { P0MDIN  = 0x00;		 // P0 全部设置为模拟输入P0MDIN= 0xF3;//P0.2 P0.3设置模拟输入
    P1MDIN  = 0x03;		 // P1.6 P1.7设置模拟输入  P1.0 P1.1设置数字输入 
    P0MDOUT = 0x00;		 // P0.4设置输出
    P1MDOUT = 0xC0;		 // P1.6,P1.7设置为推挽方式(输出)P1MDOUT = 0x30;//P1.4 P1.5设置输出
    P0SKIP  = 0x0C;		 // P0全部跳过      P0SKIP= 0x0C;//跳过P0.2 P0.3
    P1SKIP  = 0XC0;		 // P1.6 P1.7跳过
    XBR0    = 0x00;		 // UART TX0, RX0 连到端口引脚 P0.4 和 P0.5
    XBR1    = 0x00;		 // T0连到端口引脚
   }

//-----------------------------------------------------------------------------
// ADC0_Init extVREF Unipolar AIN0.0-AIN0.3
//-----------------------------------------------------------------------------
// This function initializes the ADC to measure across AIN0.0 and AIN0.3
// on the Target Board (Differential measurements, Unipolar codes)
 void ADC0_Init (void)
 { //EA=0;              
   ADC0MD |= 0x81;      // 全内部校准(偏移、斜率)
   while (!AD0CALC);    // 等待校准完成
   DelayMs(2);
   REF0CN |= 0x03;      // (enable internal vref) 内部振荡器偏压,内部基准偏压 被使能  |:位或
                        // 内部振荡器偏压使能位由内部振荡器使能位决定
   ADC0CN = 0x00;       // 单极性 PGA=1
   ADC0CF = 0x00;       // interrupts upon SINC3 filter output and uses internal VREF  ADC0CF:ADC0配置寄存器
                        // SINC3滤波器  使能内部电压基准(2.5V)
   ADC0CLK= 4;          // MDCLK = SYSCLK / (ADC0CLK + 1)  MDCLK =2.4576MHZ
   ADC0MD = 0x80;       // 使能ADC0 ADC0=空闲模式  可以进行校准或转换
   ADC0MUX= 0x08;       // 选择AIN0作为ADC         
     
   ADC0DECL = 0X50;     // set slowest OWR
   ADC0DECH = 0X00;     // set slowest OWR
   ADC0STA = 0x00;      // 清ADC0状态寄存器
   EIE1 &= ~0x08;       // 禁止ADC0中断(查询采样时使用)
   // EA=1;
 }

 void DAC_Init(void)    // DAC初始化;
  { REF0CN = 0x03;      // 使用内部VREF发生器
	IDA0CN = 0xF3;      // 打开DAC0,设置模式 写IDA0触发DAC输出更新 满度输出电流2.0mA
    IDA1CN = 0xF3;      // 打开DAC1,设置模式,从VDD吸取的电流与IDA1输出字有关
   }
         
 void ADC0_Conver (void)
  { ul temp;
    uchar i,j,n; 
    ul  voltage;
    for(j=0;j<N;j++)         
     { for(i=0;i<4;i++)
       {n = i<<4;
        n &= 0xf0;
        ADC0MUX  = 0x08;
        ADC0MUX |= n;    // 选择AINx作为ADC
		DelayMs(8);
		AD0INT = 0;      // 清除ADC转换完成标志 
		ADC0MD = 0x82;   //  startup conversion
		while (!AD0INT); //  wait conversion end
		temp = ADC0H;
		temp = (temp<<8) + ADC0M;
		temp = (temp<<8) + ADC0L;
		voltage = temp* 2450.0/16777215;
	    ADC[i]  = voltage;
        ADC[i]  = (a-1)*ADC[i] +voltage;
		ADC[i]  = ADC[i]>>3;
		}
     }
 }


 void DAC0_Out_mV(uint v)  
  { float x;
    x = v / 2000.0 * 255; 
	v = x;
    if(XXS==1) IDA0CN = 0xF3;
    if(XXS==0) IDA0CN = 0xF0;
    IDA0 = v;
   }

 void DAC1_Out_mV(uint v)     
  { float x;
    x = v / 2000.0 * 255;
	v = x; 
    if(XXD==1) IDA1CN = 0xF3;
    if(XXD==0) IDA1CN = 0xF0;
    IDA1 = v;
   }

void main(void)
{   DATA_lld=0;
    DATA_lls=0;
	PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer  enable)
	SysClk_Init();   // 配置系统时钟 
	System_Init();   
	t0_ini();        
	PORT_Init();     

//	P1=0;
    DAC_Init();   
    EA=0;
    ADC0_Init();  
	TF0=0;
	EA=1;
    t0_rst();  
   
	DATA_lld_out=0;
	DATA_lls_out=0;
	DATA_lld=0;
	DATA_lls=0;
	XXD=1;
	XXS=1;

	DATA_lls=b;
    DAC0_Out_mV(DATA_lls); 
    DATA_lls_out=b;
	DATA_lld=c;
    DAC1_Out_mV(DATA_lld);
    DATA_lld_out=c;
    DelayMs(1);            // delay 1ms

 while(1)  
  {	
        uchar i;
        EA=0;
    	ADC0_Conver();    // ADC  conversion
		TF0=0;
		EA=0;
	    t0_rst();
		ADC0MD = 0x00;    // ADC处于禁止状态
		for(i=0;i<4;i++)  // 防止高温时,ADC输出不稳定值
        {if((ADC[i]<(ADt[i]-5))||(ADC[i]>(ADt[i]+5)))  
	      ADt[i]=ADC[i];}                              
	 
        DelayMs(1);      // 延时1ms 330us
//		P1=0xff;
//		if((P1&0x03)==0x03)
        t0_rst();

		// lld  control 
		if((ADt[0]<=30)&&(ADt[1]<=30))
		 DATA_lld=150;
	    else
	     { if(ADt[0]>ADt[1])     // ed>id   low resistance rate
		  {ABSA=abs(ADt[0]-1750);
 		   lab_d=0;
		   if(ABSA>=100)  DATA_lld=DATA_lld_out*1750/ADt[0];
		   }	        
	  

		   }

		 if(XXD==1)
          {if((XXD==1)&&(DATA_lld<=230))// 2.0MA--0.25MA 
		     {DATA_lld*=8; 		   
//  	      x = DATA_lld_out* 255/ 2000.0 ;
// 		      IDA1CN = 0xF0;
//		      IDA1 = x; 
    	      XXD=0;
             }
		   if((XXD==1)&&(DATA_lld>240))   
		   {XXD=1;
//  	  	h = DATA_lld_out* 255/ 2000.0 ; 
//			IDA1CN = 0xF3;
//		    IDA1 = h;
 		    }
			}
		 else
		  {if((XXD==0)&&(DATA_lld<=1840)) 
		     {
//		  	  y = DATA_lld_out* 255/ 2000.0 ;
//			  IDA1CN = 0xF0;
//		      IDA1 = y; 
			  XXD=0; 
			  }     
		   if((XXD==0)&&(DATA_lld>1920))        
		     {
			  DATA_lld/=8; 
//		      z = DATA_lld_out* 255/ 2000.0 ;
//			  IDA1CN = 0xF3;
//		      IDA1 = z; 
		      XXD=1;
		      }
			}

		if(lab_d==1)   X=4;
		if(lab_d==0)   X=4;
        if((DATA_lld<(DATA_lld_out-X))||(DATA_lld>(DATA_lld_out+X)))  
	       DATA_lld_out=DATA_lld;   
    	if(DATA_lld_out>2000) DATA_lld_out=2000;
		if(DATA_lld_out<0)    DATA_lld_out=0; 
        DAC1_Out_mV(DATA_lld_out);
        t0_rst();
		
		if((ADt[2]<=30)&&(ADt[3]<=30))
		 DATA_lls=200;
	    else 
		 {if(ADt[2]>ADt[3]) 	    
		 { ABSB=abs(ADt[2]-1750);
		   lab_s=0;
		   if(ABSB>=100) DATA_lls=DATA_lls_out*1750/ADt[2];
		   }		 
          if(ADt[2]<=ADt[3]) 
		  {ABSB=abs(ADt[3]-1750);
		   lab_s=1;
		   if(ABSB>=100) DATA_lls=DATA_lls_out*1750/ADt[3];
		   }}

		 if(XXS==1)
          {if((XXS==1)&&(DATA_lls<=230))// 2.0MA--0.25MA 
		     {DATA_lls*=8; 		   
//  	      x = DATA_lld_out* 255/ 2000.0 ;
// 		      IDA1CN = 0xF0;
//		      IDA1 = x; 
    	      XXS=0;
             }
		   if((XXS==1)&&(DATA_lls>240))   
		   {XXS=1;
//  	  	h = DATA_lld_out* 255/ 2000.0 ; 
//			IDA1CN = 0xF3;
//		    IDA1 = h;
 		    }
			}
		 else
		  {if((XXS==0)&&(DATA_lls<=1840)) 
		     {
//		  	  y = DATA_lld_out* 255/ 2000.0 ;
//			  IDA1CN = 0xF0;
//		      IDA1 = y; 
			  XXS=0; 
			  }     
		   if((XXS==0)&&(DATA_lls>1920))        // 0.25MA--2MA
		     {
			  DATA_lls/=8; 
//		      z = DATA_lld_out* 255/ 2000.0 ;
//			  IDA1CN = 0xF3;
//		      IDA1 = z; 
		      XXS=1;
		      }
			}

		if(lab_s==1)   X=4;
		if(lab_s==0)   X=4;		
        if((DATA_lls<(DATA_lls_out-X))||(DATA_lls>(DATA_lls_out+X)))  
	        DATA_lls_out=DATA_lls;

		if(DATA_lls_out>2000) DATA_lls_out=2000;
		if(DATA_lls_out<0) DATA_lls_out=0;
        DAC0_Out_mV(DATA_lls_out);
		 
         DelayMs(10);
//       t0_rst();
	 		 

		}
  }


void T0_ISR() interrupt 1      
  {	TF0=0;
	TH0=0XFA;
	TL0=0X00;
	RSTSRC=0X10;               
   }

void t0_rst()   
  { EA=0;
    TR0=0;
    TF0=0;
    TH0=0XFA;
	TL0=0X00;
	TR0=1;
	EA=1;
	}

void t0_ini()
  {TMOD=0x01;
   CKCON=0x02;
   TH0=0XFA;
   TL0=0X00;
   EA=1;
   TF0=0;
   ET0=1;
   TR0=1;
  }



⌨️ 快捷键说明

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