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

📄 de.c

📁 本工程是PC透過RS232傳資料進開發版
💻 C
字号:
/**********************************************************************
/* 文件名称: de.C																			
/* 文件标识: none
/* 适用器件: C8051F120 
/* 摘 要:本文件是按S1,S3,DA0输出(1V);按S2,S4,DA1有1.7V输出.每间隔1S,AIN0,AIN1通过串口分别显示输入电压.
/* ;AIN0的电压由DA0提供,AIN1的电压由DA1提供;使用外部22.1184MHz晶振. 
/* 当前版本:1.0
/* 作 者:李国涛
/* 完成日期:2007年12月4日
/***********************************************************************/

/**********************************************************************/
//INCLUDE引用外部头文件	
#include <c8051f120_VarantReg.h> 
#include <ABSACC.H>		
#include "da-i.c"
#include <string.h> 
#include <stdio.h> 
/**********************************************************************/

/**********************************************************************
// 常量及全局变量定义
************************************************************************/
long result[2];
long mopt[2];
unsigned long voltage;
uchar key;           //key 是执行keyscan读取的值 
long temp;           //为ADC转换后的值
uchar temp1;         //temp是执行KeySPI1的结果
uchar send_flag;
uchar temp0;         //temp是执行KeySPI的结果;
uchar rs232_send_size;
uchar dat[20];
uchar dac_value[4];
uchar channel0_flag;
uchar channel1_flag;
/*	TIMER0 INI 	*/
bit time_1ms_flag;
bit time_10ms_flag;
bit time_50ms_flag;
bit time_100ms_flag;
bit time_500ms_flag;
bit time_1s_flag;
bit time_60s_flag;
uchar time_1ms;
uchar time_10ms;
uchar time_50ms;
uchar time_100ms;
uchar time_500ms;	
uchar time_1s;
uchar time_60s;
/**********************************************************************
* 函数名称:delay();
*
* 函数功能描述:是一个延时程序;
*              
* 输入参数:x1
*
* 返回数据:none;
***********************************************************************/
void delay(int x1)
{
  unsigned int y1;
  for (y1=1;y1<x1;y1++);
}

/*********************************************************************
* 函数名称:getkey();
*
* 函数功能描述:按键的扫描判断与取值  
*          
* 输入参数:none;
*
* 返回数据:none;
*
* 注    意:none;      
**********************************************************************/

unsigned char getkey(void)
{
  uchar h;	                      //行扫描值
  uchar l;          	          //列扫描值
  SFRPAGE=0x0f ;
  P5=0xF0;	                      //P5.0~P5.3	发全0.准备读列的状态
 if((P5&0xF0)!=0xF0)              //如果P5.4~P5.7不全为1,可能有键按下
 {
   delay(100);	
   delay(100);			         //延时去抖动

   if((P5&0xF0) != 0xF0)         //重读高4位,如果还是不全为1,有按键按下
   {
     h=0xFE;	                 //P5.0置0,开始行扫描
 while((h&0x10)!=0xF0)	         //判断是否为最后一行,若不是继续扫描=F0的时候表示没有到最后一行;
    {					          //如果为F0,那么还没有到最后一行;如果不为F0那么就已经到最后一行;
       P5=h;
       delay(100);			 
       SFRPAGE=0x0f; 
      if((P5&0xF0) != 0xF0)	     //如果P5.4~P5.7不全为1,可能有键按下
        {
          l=((P5&0xF0)|0x0F);	 //保留P5口高四位.低四位变为1,作为列值
		  delay(100);
          return ((~h)+(~l));	 //按键值=行扫描值+列扫描值	                   
		 
        }
      else				        //如果该行无键按下,行扫描值左移.扫描下一行
        
	      h=(h<<1)|0x01;        //这样做保证每一次就只有一位为"0"
	    
    }
   }
 }
  return 0;                    //无键按下,返回0
} 

/**********************************************************************
* 函数名称:keyup();
*
* 函数功能描述:按键的释放;
*          
* 输入参数:none;
*
* 返回数据:none;
*
* 注    意:none;
**********************************************************************/

uchar keyup(void)
{
	unsigned char val=0xff;
	val=getkey();
     if(val != 0)
     {
	  while(1)
	  {
		if(val!=getkey())break;
	  }
     }
	return val;
} 

/*********************************************************************
* DAC0_Init :
*
* 1V=0X06AAH ;1.7V =0X0B54H ; 电压值 ;
*
* Return Value : None
*
* Parameters   : None
*
* Configure DAC0 to update on write to
*
* REF0CN
*********************************************************************/

void DAC0_Init(void)
{									    
   SFRPAGE = DAC0_PAGE;				   //DAC_PAGE包含DAC0的初始化/. 
   DAC0L=dac_value[0];
   DAC0H=dac_value[1];					       
}

/********************************************************************
* DAC1_Init :
*
* Return Value : None
*
* Parameters   : None
*
* Configure DAC1 to update on write to
********************************************************************/

void DAC1_Init(void)
{
  SFRPAGE = DAC1_PAGE; 	
  DAC1L=dac_value[2];	     
  DAC1H=dac_value[3]; 				 				                          
}

/*******************************************************************
* 函数名称:ADC0_Init
*
* 函数功能描述:ADC0 采样初始化,输入通道AIN0.0 
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
*
*******************************************************************/

void ADC0_Init(void)
{  
   char SFRPAGE_SAVE = SFRPAGE;           // Save Current SFR page
   SFRPAGE = ADC0_PAGE;
   ADC0CF |= 0x88;                        //ADC转换时钟= 2.45MHz 
   EIE2   |= 0x02;                        // 关闭ADC中断
   SFRPAGE = SFRPAGE_SAVE;                // Restore SFR page
}

/***************************************************************
* 函数名称:ADC0_enable
*
* 函数功能描述:ADC0开关,1:打开;0:关闭
*              
* 输入参数:1:打开;0:关闭
*
* 返回数据:none;
*
* 注意:    none;
***************************************************************/

void ADC0_enable(unsigned char flag)
{
	char data SFRPAGE_SAVE = SFRPAGE;       // Save Current SFR page

	if(flag)
	 {
		AD0EN = 1;                          // 打开ADC
    	EA    = 1;                          // 开启全局中断
 	 }
	else
	 {
		AD0EN = 0;                          // 关闭ADC
	 }

	SFRPAGE   = SFRPAGE_SAVE;               // Restore SFR page
}

/****************************************************************
* 函数名称:ADC0_Conver
*
* 函数功能描述:读取AD数据
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
******************************************************************/

void ADC0_Conver (void)
{
   unsigned char i=0;                       // ADC mux 通道 (0-1)	
   char data SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page   
   SFRPAGE = ADC0_PAGE;	                    // set SFR page F
   for (i=0;i<2;i++)
     {
		AMX0SL = i;					        // 设置mux到通道
		delay(1000);
   		AD0INT  = 0;                        // 清除ADC转换完成标志
   		AD0BUSY = 1;
   		while (!AD0INT);
   		temp    = ADC0H;
   		temp    = temp*256 + ADC0L;
   		result[i] = temp;                   // 读ADC值
     }
   SFRPAGE = SFRPAGE_SAVE;                  // Restore SFR page
}
 
/*******************************************************************
* 函数名称:Uart0_Enable;
*
* 函数功能描述:Uart0初始化;
*              
* 输入参数:,打开输入1;关闭输入0;
*
* 返回数据:none;
*
* 注意:    none;
********************************************************************/

void Uart0_Enable( Flag)
{
	char data SFRPAGE_SAVE = SFRPAGE;     // Save Current SFR page
	SFRPAGE   = UART0_PAGE;
	if(Flag)
	 {
	   TR1=1;                             // 打开串口Uart0
	 }
	else
	 {
        TR1=0;                            // 关闭串口Uart0
	 }
	SFRPAGE = SFRPAGE_SAVE;               // Restore SFR page
}

/*******************************************************************
* TIMER0  
*
*定时器0;
********************************************************************/

void timer0() interrupt 1
{ 

  TH0=0xfa;
  TL0=0x00;                             //1ms的初始值
  time_1ms_flag=1;
  time_10ms++;
 if(time_10ms == 10)
  {
     time_50ms++;
	 time_10ms=0;
	 time_10ms_flag=1;
  }
 if(time_50ms == 5)	                    //设置50ms扫描一次键盘
  {
     time_100ms++;
     time_50ms = 0;
     time_50ms_flag = 1;	  
     key=keyup();	                    //按键扫描
   if( key!= 0 )                        //判断是否有按键按下      
    {
      send_flag = 1;
    }
  } 	  
 if(time_100ms == 2)
   {time_500ms++;time_100ms=0;time_100ms_flag=1;}
 if(time_500ms == 5)
   {time_1s++;time_500ms=0;time_500ms_flag=1;}
 if(time_1s == 2)
   {time_60s++;time_1s=0;time_1s_flag=1;}
 if(time_60s == 60)
   {time_60s=0;time_60s_flag=1;}                 
}

/*******************************************************************
* 函数名称:value_change
*
* 函数功能描述:ADC转换后的电压变换处理。
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:none;
********************************************************************/

uchar value_change()
{  	
       int i;
  if(channel0_flag==1)
    {	 
	   DAC0_Init(); 	         
       DAC1_Init(); 
	   delay(300);  
	   {	
	     ADC0_Conver(); 
	     i=0;
	    {	  
		   EA=0;
		   voltage=result[0];  //读取值。
		   EA=1;
	       voltage=2450*voltage;
	       voltage=voltage>>12;
	       voltage=voltage/100;
		   mopt[0]=voltage;
		   EA=0;
		}
	   ADC0_Conver(); 
	     i=0;
	    {	  
		   EA=0;
		   voltage=result[0];  //读取值。
		   EA=1;
	       voltage=2450*voltage;
	       voltage=voltage>>12;
	       voltage=voltage/100;
		   mopt[0]=voltage; 
		   EA=0;
		}
	ADC0_Conver(); 
	     i=0;
	    {	  
		   EA=0;
		   voltage=result[0];  //读取值。
		   EA=1;
	       voltage=2450*voltage;
	       voltage=voltage>>12;
	       voltage=voltage/100;
		   mopt[0]=voltage;  
		   EA=0;
		}
       }
	   delay(300);
	   channel0_flag=0;
	}
	 if(channel1_flag==1)
	  {	  DAC0_Init(); 	         
         DAC1_Init(); 
		 delay(300); 	
	   ADC0_Conver(); 
	   i=1;
	    {	  
		   EA=0;
		   voltage=result[i];  //读取值。
		   EA=1;
	       voltage=2450*voltage;
	       voltage=voltage>>12;
	       voltage=voltage/100;
		   mopt[i]=voltage;
		   EA=0;
		}
	   ADC0_Conver(); 
	   i=1;
	    {	  
		   EA=0;
		   voltage=result[i];  //读取值。
		   EA=1;
	       voltage=2450*voltage;
	       voltage=voltage>>12;
	       voltage=voltage/100;
		   mopt[i]=voltage;
		   EA=0;
		}
		ADC0_Conver(); 
	   i=1;
	    {	  
		   EA=0;
		   voltage=result[i];  //读取值。
		   EA=1;
	       voltage=2450*voltage;
	       voltage=voltage>>12;
	       voltage=voltage/100;
		   mopt[i]=voltage;
		   EA=0;
		}
       
	   channel1_flag=0;
	  }
	   strcpy(dat,"AIN1="); 
       dat[5]=(uchar)(mopt[0]/10)+0x30;
  	   dat[6]='.';
 	   dat[7]=(uchar)(mopt[0] % 10)+0x30;
	   dat[8]='V'; 
	   dat[9]=','; 				  //AIN1=x.xV, AIN2=x.xV
       dat[10]='A'; 
	   dat[11]='I'; 
	   dat[12]='N'; 
	   dat[13]='2'; 
	   dat[14]='=';  
	   dat[15]=(uchar)(mopt[1]/10)+0x30;
	   dat[16]='.';
       dat[17]=(uchar)(mopt[1] % 10)+0x30;
	   dat[18]='V';
	   delay(500);
	   return 1;	  					
}

/*******************************************************************
* 函数名称:send_232;
*
* 函数功能描述:向232发送字符到SBUF0;
********************************************************************/

void send_232(send_232_end,uchar send_232_code[])  
{	
  if(rs232_send_size<send_232_end)
	{
	  SBUF0=send_232_code[rs232_send_size];
	  rs232_send_size++;
    }
}

/*******************************************************************
* 函数名称:serial_0();
*
* 函数功能描述:UART0采用定时中断的方式通过串0口发送字符,
*              
* 输入参数:none
*
* 返回数据:none;
********************************************************************/

void serial_0(void) interrupt 4
{	                 
  if ( TI0 )                
    {										
	  send_232(sizeof(dat),&dat);  
	  TI0=0;
	}
  if ( RI0 )                   
   {
	  RI0=0;
   }		  
}
  
/*******************************************************************
*主循环程序
*
********************************************************************/

main()
{ 
  uchar i=0;
  uchar dat[20]; 
  DAC0L=0;
  DAC0H=0;
  DAC1L=0;
  DAC1H=0;
  memset(dat,0,sizeof(dat));
  Init_Device(); 
  Uart0_Enable(1); 
  ADC0_Init();
  ADC0_enable(1);
  while(1)
   { 
     if(send_flag== 1)          
      { 
	 switch(key)
	   {
		case 0x11: 		
		dac_value[0]=0xaa;
		dac_value[1]=0x06;
		dac_value[2]=0;
		dac_value[3]=0; 
		channel0_flag=1;
		break;
		case 0x21: 		
		dac_value[0]=0x54;
		dac_value[1]=0x0b;
		dac_value[2]=0;
		dac_value[3]=0;
		channel0_flag=1;
		break;		
		case 0x41: 		        
		dac_value[0]=0;
		dac_value[1]=0;
		dac_value[2]=0xaa;
		dac_value[3]=0x06;
		channel1_flag=1;
		break;
		case 0x81: 	         
		dac_value[0]=0;
		dac_value[1]=0;
		dac_value[2]=0x54;
		dac_value[3]=0x0b;
		channel1_flag=1;
		break;
		default: 		
		DAC0L=0;
		DAC0H=0;
		DAC1L=0;
		DAC1H=0;
		break;
 	   }  			 
	   	 send_flag= 0;		 
	  } 
		   EA=1;
	       value_change(); 
		   delay(500); 
	 if(time_1s_flag==1)
	   {
		   rs232_send_size=0;
		   SFRPAGE=UART0_PAGE;
		   delay(100);
		   TI0=1;
		   time_1s_flag=0;
	   }	   
    if(time_1ms_flag==1)
	  {	 
	      P3_5=~P3_5;
          P2_4=~P2_4;
          P2_5=~P2_5;
          P2_6=~P2_6;
		 time_1ms_flag=0;
	  }
   
	}	     
}

/*******************************************************************/
// 文件结束
/*******************************************************************/

⌨️ 快捷键说明

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