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

📄 1820new.c

📁 DS1820的温度采集程序,包括基于二叉树的ROM搜索,可实现多个温度传感检测
💻 C
📖 第 1 页 / 共 2 页
字号:
	return (ISP_DATA);
}

/* 多字节读 */
uchar multi_byte_read(uint begin_addr, uint counter)
{
	uint	i = 0;
	uchar   ii,jj;
    for(i = 0; i< counter; i++)
	{
    ISP_ADDRH	=	(uchar)(begin_addr >> 8);
	ISP_ADDRL	=	(uchar)(begin_addr & 0x00ff);

	ISP_CMD		=	ISP_CMD	&	0xf8;        
	ISP_CMD		=	ISP_CMD	|	READ_AP_and_Data_Memory_Command;        

	ISP_IAP_enable();

	ISP_TRIG	=	0x46;
	ISP_TRIG	=	0xb9;
	_nop_();
    
    data_temp[i]=ISP_DATA;
	begin_addr++;

	}

	 for(ii=0;ii<Available;ii++)
		      for(jj=0;jj<8;jj++)
		           code1[ii][jj]=data_temp[ii*8+jj];

	ISP_IAP_disable();
	return OK;
}


/************************************************************
*Function:FLASH WRITE
*parameter:
*Return:
*Modify:
*************************************************************/
/* 字节编程 */
uchar byte_program(uint byte_addr, uchar original_data)
{
	ISP_ADDRH	=	(uchar)(byte_addr >> 8);
	ISP_ADDRL	=	(uchar)(byte_addr & 0x00ff);

	ISP_CMD		=	ISP_CMD	&	0xf8;        
	ISP_CMD		=	ISP_CMD	|	PROGRAM_AP_and_Data_Memory_Command;	
	ISP_DATA	=	original_data;

	ISP_IAP_enable();
	ISP_TRIG	=	0x46;                                         /* 触发ISP_IAP命令 */
	ISP_TRIG	=	0xb9;                                         /* 触发ISP_IAP命令 */
	_nop_();

	ISP_IAP_disable();
	return	OK;
}


/* 字节编程并校验 */
uchar byte_program_and_verify(uint byte_addr, uchar original_data)
{
	ISP_ADDRH	=	(uchar)(byte_addr >> 8);
	ISP_ADDRL	=	(uchar)(byte_addr & 0x00ff);

	ISP_CMD		=	ISP_CMD	&	0xf8;        /* 1111,1000 */
	ISP_CMD		=	ISP_CMD	|	PROGRAM_AP_and_Data_Memory_Command;	/* 0000,0010 */
	ISP_DATA	=	original_data;

	ISP_IAP_enable();

	ISP_TRIG	=	0x46;
	ISP_TRIG	=	0xb9;
	_nop_();

	ISP_DATA	=	0x00;

	ISP_CMD		=	ISP_CMD	&	0xf8;        /* 1111,1000 */
	ISP_CMD		=	ISP_CMD	|	READ_AP_and_Data_Memory_Command;        /* 0000,0001 */

	ISP_TRIG	=	0x46;        /* 触发ISP_IAP命令 */
	ISP_TRIG	=	0xb9;        /* 触发ISP_IAP命令 */
	_nop_();

	ISP_IAP_disable();

	if(ISP_DATA	==	original_data)
		return	OK;
	else
		return	ERROR;
}


/* 写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据	
   begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源	*/
uchar sequential_write_flash_in_one_sector(uint begin_addr, uint counter, uchar array[])
{
	uint	i = 0;
	uchar   ii,jj;
	uint	in_sector_begin_addr = 0;
	uint	sector_addr	= 0;

	/* 判是否是有效范围,此函数不允许跨扇区操作 */
	if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
		return	ERROR;
	in_sector_begin_addr = begin_addr & 0x01ff;        
	if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
		return ERROR;

    /* 擦除 要修改/写入 的扇区 */
	sector_addr	=	(begin_addr & 0xfe00);	                      /* 1111,1110,0000,0000; 取扇区地址 */
	ISP_ADDRH	=	(uchar)(sector_addr >> 8);
	ISP_ADDRL	=	0x00;
	ISP_CMD		=	ISP_CMD	&	0xf8;		
	ISP_CMD		=	ISP_CMD	|	SECTOR_ERASE_AP_and_Data_Memory_Command;	

	ISP_IAP_enable();
	ISP_TRIG	=	0x46;                                         /* 触发ISP_IAP命令 */
	ISP_TRIG	=	0xb9;                                         /* 触发ISP_IAP命令 */
	_nop_();

	for(i = 0; i< counter; i++)
	{
		/* 写一个字节 */
		ISP_ADDRH	=	(uchar)(begin_addr >> 8);
		ISP_ADDRL	=	(uchar)(begin_addr & 0x00ff);
		ISP_DATA	=	array[i];
		ISP_CMD		=	ISP_CMD	&	0xf8;	
		ISP_CMD		=	ISP_CMD	|	PROGRAM_AP_and_Data_Memory_Command;		

		ISP_TRIG	=	0x46;	                                  /* 触发ISP_IAP命令 */
		ISP_TRIG	=	0xb9;	                                  /* 触发ISP_IAP命令 */
		_nop_();
		
        
		/* 读回来 */
		ISP_DATA	=	0x00;

		ISP_CMD		=	ISP_CMD	&	0xf8;	
		ISP_CMD     =	ISP_CMD	|	READ_AP_and_Data_Memory_Command;	

		ISP_TRIG	=	0x46;	                                  /* 触发ISP_IAP命令 */
		ISP_TRIG	=	0xb9;	                                  /* 触发ISP_IAP命令 */
		_nop_();

		data_temp[i]=array[i];
		begin_addr++;

	}
	    for(ii=0;ii<Available;ii++)
		      for(jj=0;jj<8;jj++)
		           code1[ii][jj]=data_temp[ii*8+jj];

	ISP_IAP_disable();
	return	OK;
}


/************************************************************
*Function:ISP DISABLE
*parameter:
*Return:
*Modify:
*************************************************************/
/* 打开 ISP,IAP 功能 */
void ISP_IAP_enable(void)
{
	EA	=	0;	                                                  /* 关中断 */
	ISP_CONTR	=	ISP_CONTR & 0x18;                             /* 0001,1000 */
	ISP_CONTR	=	ISP_CONTR | WAIT_TIME;
	ISP_CONTR	=	ISP_CONTR | 0x80;                             /* 1000,0000 */
}

/* 关闭 ISP,IAP 功能 */
void ISP_IAP_disable(void)
{
	ISP_CONTR	=	ISP_CONTR & 0x7f;	                          /* 0111,1111 */
	ISP_TRIG	=	0x00;
	EA			=   1;                	                          /* 开中断 */
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////

/************************************************************
*Function:串口通讯
*parameter:
*Return:
*Modify:
*************************************************************/

void Send_Serial_Port_ISR (void) interrupt 4 
{
  
   uint tep=0;
   uchar a[2],m,b,i,j;
   uint Temperature;

  
   if(RI)
   {
     RI=0;
	 En_485R=0;
     a[0]=SBUF;
	 for(i=1;i<2;i++)
	 {
	    while(RI==0);
        a[i]=SBUF;
	    RI=0;  
	 }
	 TI=1;
   }
   /*wirte 485 address to flash*/
   if((a[0]==0x0d)&&TI)
   {
     TI=0;  
     sector_erase(DEBUG_AP_Memory_Begin_Sector_addr);
	 byte_program(DEBUG_AP_Memory_Begin_Sector_addr,a[1]);
	 //获取地址码
     address_num_485=byte_read(DEBUG_AP_Memory_Begin_Sector_addr);
   }
   //master send slave command,slave acknowledge 
   if((a[0]==address_num_485)&&TI)
   {
     TI=0;  
	 
	 if(a[1]==0x0f)                                      //获取传感器序列码
	 
	 {
		   addr_temper_flag=1;
	       SearchRom();
           for(i=0;i<Available;i++)
		      for(j=0;j<8;j++)
		          data_temp1[i*8+j]=code1[i][j];
		   sequential_write_flash_in_one_sector(DEBUG_Data_Memory_Begin_Sector_addr, Available*8, data_temp1);

		   En_485R=1;
		   En_485T=1;
           SBUF= 0x0c;
           while(TI==0);
           TI=0; 
           SBUF= 0x0f;
           while(TI==0);
           TI=0; 
           SBUF= a[0];
           while(TI==0);
           TI=0; 
           SBUF= 0x00;
           while(TI==0);
           TI=0; 
           En_485T=0;
           En_485R=0;
		
	 }	
	 
     if((a[1]==0x0b)&&(addr_temper_flag==1))
	 {
	       

		   En_485R=1;
	       En_485T=1;
           SBUF= 0x0f;
           while(TI==0);
           TI=0; 
           SBUF=Available;
           while(TI==0);
           TI=0; 
          

  		   for(i=0;i<Available;i++)
		     for(j=0;j<8;j++)
		     {
		        
                SBUF= code1[i][j];
                while(TI==0);
                TI=0; 
                
			 }
           En_485T=0;
		   En_485R=0;
		   addr_temper_flag=0;	 

		
	 }

	 
	 if((a[1]==0x0e))
	 {
		   
	       addr_temper_flag1=1;
		   
		   En_485R=1;
	       En_485T=1;
           SBUF= 0x0c;
           while(TI==0);
           TI=0; 
           SBUF= 0x0e;
           while(TI==0);
           TI=0; 
           SBUF= a[0];
           while(TI==0);
           TI=0; 
           SBUF= 0x00;
           while(TI==0);
           TI=0; 
           En_485T=0;
		   En_485R=0;
		 
	 }


	 if((a[1]==0x0b)&&(addr_temper_flag1==1))
	 {
		   En_485R=1;
	       En_485T=1;
           SBUF= 0x0e;
           while(TI==0);
           TI=0; 
           SBUF=Available;
           while(TI==0);
           TI=0; 
          
           for(iii=0;iii<Available;iii++)
           {
               Init18b20();
               WriteByte(0xCC);                                            
               WriteByte(0x44);          
	           Send_MatchRom();
               WriteByte(0xBE);     
               aa=ReadByte();
               bb=ReadByte();
               SBUF=aa;
               while(TI==0);
               TI=0; 
	           SBUF=bb;
               while(TI==0);
               TI=0; 
	           
    
           }
           En_485T=0;
		   En_485R=0;
           if(iii>=Available)
           iii=0;
		   addr_temper_flag1=0;
		
	 }

	 
	 
   }//if((a[0]==address_num_485)&&TI) end

 
   
}



///////////////////////////////////////////////////////////////////////////////////////////////////////////

/************************************************************
*Function:主函数
*parameter:
*Return:
*Modify:
*************************************************************/
main(void)
{
  
  TMOD=0x20;                 
  SCON=0x50;                    
  TH1=0xfa;                                                       //fd baud rate 9600;fa 4800
  TR1=0x01;
  ET1=0x00;
  ES=1;
  EA=1;
  En_485T=0;
  En_485R=0;
  SBUF=0x00;

  //获取地址码
  address_num_485=byte_read(DEBUG_AP_Memory_Begin_Sector_addr);
  //获取传感器序列号
  Available=byte_read(DEBUG_AP_Memory_End_Sector_addr);
  multi_byte_read(DEBUG_Data_Memory_Begin_Sector_addr, Available*8);

  

  while(1);
}  

⌨️ 快捷键说明

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