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

📄 system.#1

📁 该程序是基于c8051f的红外线发射率的测量程序
💻 #1
📖 第 1 页 / 共 2 页
字号:
{
	i2cstart();                            
	write1byte(W_CONTROLBYTE);             
	if(checkack()==1)                     
		return 1;                        
	write1byte(addr>>8); //写入高8位地址                     
	if(checkack()==1)
		return 1;  
    write1byte((unsigned char)addr); //写入低8位地址                     
	if(checkack()==1)
		return 1;  
	write1byte(dat);                  
	if(checkack()==1)
		return 1;
	i2cstop();                              
 	delayus(2000); 
	delayus(2000);
	delayus(2000);                       	
	return 0;               	
}
//***************************************************************************************************************************************************
//写入一字节到存储器芯片指定地址处
//***************************************************************************************************************************************************
unsigned char  read_byte(unsigned int addr)
{
	unsigned char temp;
	i2cstart();                             
	write1byte(W_CONTROLBYTE);             
	if(checkack()==1)                     
		return 1;                        
	write1byte(addr>>8); //写入高8位地址                     
	if(checkack()==1)
		return 1;  
    write1byte((unsigned char)addr); //写入低8位地址                     
	if(checkack()==1)
		return 1;  
	i2cstart();                             
	write1byte(R_CONTROLBYTE);            
	if(checkack()==1)
		return 1; 
	temp=read1byte();                  
	mnack();                             
	i2cstop();                             
	return temp;  	             	
}
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
//========================================	END	===============================================

//**********************************************************************************************************************************************
//给LCD发送一个字节
//**********************************************************************************************************************************************
void send_lcd_byte(unsigned char dat)
{
  STB=1;
  while(Busy==1);   //等待系统空闲
  delay4us();      //延时us
  delay4us();
  P2=dat;    
  STB=0;            //下降沿送入
  delay4us();
  STB=1 ;
} 

//***********************************************************************************************************************************************
//通过UART0发送一个字符
//************************************************************************************************************************************************
void uart0_send_byte(unsigned char dat)
{
  
}


//*****************************************************************************************************************************************************
//读取发射率
//****************************************************************************************************************************************************
unsigned int get_emissivity(void)
{
  return 0;
}

//****************************************************************************************************************************************************
//读取工作电压
//****************************************************************************************************************************************************
unsigned int get_voltige(void)
{
  return 0;
}

//***************************************************************************************************************************************************
//读取工作电流
//****************************************************************************************************************************************************
unsigned int get_current(void)
{
  return 0;
}

//===========================================================================================================
//timer0中断
//========================================================================================================
void timer0_ISR(void) interrupt 1
{
    //unsigned char i; 
    TL0=0x40;
	TH0=0xB0;//这样T0就在20ms内中断一次
    //第一个10ms时采集电压和发射率
	SFRPAGE=LEGACY_PAGE;
	AMX0SL=2; //发射率通道
	delay4us();
    AD0INT=0;
	AD0BUSY=1;//启动转换
	while(AD0INT==0);
	AD0INT=0;
    emissivity_AD=(ADC0H & 0x0F)*256+ADC0L;
      
	if(time==6)
	{
	  AMX0SL=1; //电压通道
	  delay4us();
      AD0INT=0;
	  AD0BUSY=1;//启动转换
	  while(AD0INT==0);
      voltage_AD=(ADC0H & 0x0F)*256+ADC0L;
	 }
	if(time==12)
	{
	  AMX0SL=0; //电流通道
	  delay4us();
      AD0INT=0;
	  AD0BUSY=1;//启动转换
	  while(AD0INT==0);
	  AD0INT=0;
      current_AD=(ADC0H & 0x0F)*256+ADC0L;
	  //AMX0SL=2; //为发射率通道作准备
	  time=0;
	}
	time++;
	//=======================================================================================================================================
	//AI超时检测
	//========================================================================================================================================
    if(ES0)
	{
		AITIME++;	
		if(AITIME==40)
		{
			REN0=0;
			ES0=0;
			AIOVERFLG=1;
			TIMEFLG=1;
		}
	}

}
//==============================================================================================================================================
//接收来自AI表的数据,此处有问题
//===============================================================================================================================================
void UART0_INT() interrupt 4//串口0中断函数,主要是用来接收AI808P的数据的中断
{
	RI0=0;	
	AIBUF[AIDATNUM]=SBUF0;
	AIDATNUM++;
	if(AIDATNUM==10)
	{
	    AIDATNUM=0;
		REN0=0;
		ES0=0;
		AIOVERFLG=1;
	}
}
//===============================================================================================================================================
//
//===============================================================================================================================================
void AIWR(unsigned char dat)//向串口0写数据函数
{
	SBUF0=dat;
	while(!TI0){}
	TI0=0;
}

//===============================================================================================================================================
//
//===============================================================================================================================================
unsigned int write_AI(unsigned char addr,unsigned int dat)//AI8080P写数据函数
{
	unsigned int CRC;	
	ERRORNUM=0;
again:
	CRC=AIADDR+0x43+addr*256+dat;
	AIOVERFLG=0;
	AITIME=0;
	delay100us();
	TR=1;
	delay100us();
	REN0=0;//暂时不能接收数据
	RI0=0;
	TI0=0;
	ES0=0;
	AIDATNUM=0;
	TIMEFLG=0;		
	AIWR(AIADDR+0x80);
	AIWR(AIADDR+0x80);//传2遍地址
	AIWR(0x43);
	AIWR(addr);
	AIWR(dat%256);
	AIWR(dat/256);//传数据
	AIWR(CRC%256);
	AIWR(CRC/256);//传CRC码
	delay100us();
	ES0=1;//开串口0的中断,准备接收数据
	REN0=1;//允许接收数据	
	TR=0;
	while(!AIOVERFLG){}
	TR=1;
	if(TIMEFLG)
	{
		ERRORNUM++;
		if(ERRORNUM == 10)
		{
		  //显示通信故障
		  statusbar.text=(unsigned char*)"通信错误";
          set_statusbar_window(&statusbar);
		  languge_mode(English,no);
		  set_window_str(","); 
          languge_mode(Chinese,no);
		  set_window_str("请检查通讯电路是否正常"); 
		  languge_mode(English,no);
		  set_window_str("!"); 
		}
		goto again;	
	}
	else
	{
		CRC=AIBUF[0]+AIBUF[1]*256+AIBUF[2]+AIBUF[3]*256+AIBUF[4]+AIBUF[5]*256+AIBUF[6]+AIBUF[7]*256+AIADDR;
		if(CRC != (AIBUF[8]+AIBUF[9]*256))//如果校验错误则表有问题
		{
			ERRORNUM++;
			if(ERRORNUM == 10)
			{
			  //显示通信故障
		      statusbar.text=(unsigned char*)"通信错误";
              set_statusbar_window(&statusbar);
		      languge_mode(English,no);
		      set_window_str(","); 
              languge_mode(Chinese,no);
		      set_window_str("请检查通讯电路是否正常"); 
		      languge_mode(English,no);
		      set_window_str("!"); 
			}
			goto again;		
		}
		else
		{
		    
			return(AIBUF[0]+AIBUF[1]*256);
		}
	}
}

//================================================================================================================================================
//
//================================================================================================================================================
unsigned int read_AI(unsigned char addr)//AI808P读数据函数
{
	unsigned int  CRC;
	ERRORNUM=0;
again:	
	CRC=AIADDR+0x52+addr*256;
	AIOVERFLG=0;
	AITIME=0;
	delay100us();
	TR=1;
	delay100us();
	REN0=0;//暂时不能接收数据
	RI0=0;
	TI0=0;
	ES0=0;
	AIDATNUM=0; 
	TIMEFLG=0;		
	AIWR(AIADDR+0x80);
	AIWR(AIADDR+0x80);//传2遍地址
	AIWR(0x52);
	AIWR(addr);
	AIWR(0);
	AIWR(0);//传数据
	AIWR(CRC%256);
	AIWR(CRC/256);//传CRC码
	delay100us();
	ES0=1;//开串口0的中断,准备接收数据
	REN0=1;//允许接收数据	
	TR=0;
	while(!AIOVERFLG){}
	TR=1;
	if(TIMEFLG)
	{
		ERRORNUM++;
		if(ERRORNUM == 10)
		{
		  //显示通信故障
		  statusbar.text=(unsigned char*)"通信错误";
          set_statusbar_window(&statusbar);
		  languge_mode(English,no);
		  set_window_str(","); 
          languge_mode(Chinese,no);
		  set_window_str("请检查通讯电路是否正常"); 
		  languge_mode(English,no);
		  set_window_str("!"); 

		}
		goto again;	
	}
	else
	{
		CRC=AIBUF[0]+AIBUF[1]*256+AIBUF[2]+AIBUF[3]*256+AIBUF[4]+AIBUF[5]*256+AIBUF[6]+AIBUF[7]*256+AIADDR;
		if(CRC != (AIBUF[8]+AIBUF[9]*256))//如果校验错误则表有问题
		{
			ERRORNUM++;
			if(ERRORNUM == 10)
			{
			   //显示通信故障
			   statusbar.text=(unsigned char*)"通信错误";
               set_statusbar_window(&statusbar);
		       languge_mode(English,no);
		       set_window_str(","); 
               languge_mode(Chinese,no);
		       set_window_str("请检查通讯电路是否正常"); 
		       languge_mode(English,no);
		       set_window_str("!"); 
			}
			goto again;	
		}
		else
		{
			return(AIBUF[6]+AIBUF[7]*256);
		}
	}
}



⌨️ 快捷键说明

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