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

📄 interruptc.#1

📁 采用CYGNAL F015单片机
💻 #1
字号:

// 中断服务程序 
//-------------------------------------------------------------------- 
// SMBus中断服务程序 
void SMBUS_ISR (void) interrupt 7 
{ 
switch (SMB0STA)
{ 
// SMBus状态码SMB0STA寄存器 
// 主发送器/接收器起始条件已发送 
// 在该状态发送的COMMAND字的R/W位总是为0(W) 
// 因为对于读和写操作来说都必须先写存储器地址 

case SMB_START:
   SMB0DAT = (COMMAND & 0xFE); // 装入要访问的从器件的地址 
   STA = 0; // 手动清除START位 
   break;
    
//主发送器/接收器重复起始条件已发送 
// 该状态只应在读操作期间出现在存储器地址已发送并得到确认之后
 
case SMB_RP_START: 
   SMB0DAT = COMMAND; // COMMAND中应保持从地址 + R. 
   AA=1;
   STA = 0; 
   break;
    
// 主发送器从地址 + WRITE已发送收到ACK
 
case SMB_MTADDACK: 
   SMB0DAT = LOW_ADD; // 装入待写存储器地址的高字节 
   break; 

 // 主发送器从地址 + WRITE已发送收到NACK 
 // 从器件不应答发送STOP + START重试
    
case SMB_MTADDNACK: 
   STO = 1; 
   STA = 1; 
   break;
    
// 主发送器数据字节已发送收到ACK 
// 该状态在写和读操作中都要用到BYTE_NUMBER看存储器地址状态 - 如果 
// 只发送了HIGH_ADD则装入LOW_ADD如果LOW_ADD已发送检查COMMAND 
// 中的R/W 值以决定下一状态 

case SMB_MTDBACK:
      if (COMMAND & 0x01) // 如果R/W=READ发送重复起始条件 
      {
    	 //reversec=30; 
         STA = 1;
         STEP = 1;//0表示还未写地址,1表示地址已写,2表示读到第一个字节,3表示读到第一个字节。。。
      } 
      else
      { 
	    if(BYTE_NUMBER>0)
         {
		   SMB0DAT = WORD; // 如果R/W=WRITE装入待写字节 
           BYTE_NUMBER--;
         }
        else
		 {
	       STO = 1; 
           SM_BUSY = 0; // 释放SMBus 
		 
		  }
       } 
      break; 

     // 主发送器数据字节已发送收到NACK 
     // 从器件不应答发送STOP + START重试 
case SMB_MTDBNACK: 
     STO = 1; 
     STA = 1; 
     break; 

      // 主发送器竞争失败 
// 不应出现如果出现重新开始传输过程 
case SMB_MTARBLOST: 
     STO = 1; 
     STA = 1; 
     break; 


// 主接收器从地址 + READ 已发送收到ACK 
// 设置为在下一次传输后发送NACK因为那将是最后一个字节唯一 
case SMB_MRADDACK: 
     AA = 1; // 在应答周期ACK 
     break; 


// 主接收器从地址 + READ 已发送收到NACK 
// 从器件不应答发送重复起始条件重试 
case SMB_MRADDNACK: 
     STA = 1; 
     break;
	 
	  
// 收到数据字节ACK已发送 
// 该状态不应出现因为AA已在前一状态被清0如果出现发送停止条件 
case SMB_MRDBACK:
    //RECVCHARS[STEP-1]= revolve(SMB0DAT);
    RECVCHARS[STEP-1]= SMB0DAT;
    STEP++;
    if (STEP>(RECVLEN-1))	AA= 0;
    break; 

// 收到数据字节NACK已发送 
// 读操作已完成读数据寄存器后发送停止条件 
case SMB_MRDBNACK:
    //RECVCHARS[STEP-1]= revolve(SMB0DAT); 
    STEP=0;
    STO = 1; 
    SM_BUSY = 0; // 释放SMBus 
    break;
	 
// 在本应用中所有其它状态码没有意义通信复位 
default: 
    STO = 1; // 通信复位 
    SM_BUSY = 0; 
    break; 
  } 
 SI=0; // 清除中断标志
} 

void RBuf (void) interrupt 4 //using 3
{
    unsigned char tchar; 
    EA=0;
	if (RI)
	{  
	    TR2     =   0;
        TH2     =0xfe;                   //等待10个字节时须在16位模式下设置为0xf933
        TL2     =0xfb; 
	    TR2     =   1;
	    if(DataNo<RBUFSIZE)
        {
          RData[Pos]=SBUF;
           Pos++;
		  Pos%=RBUFSIZE;
          DataNo++;
        }
		else
		{
	      tchar=SBUF;
		   TestVar=tchar;

		}
	 RI=0;
	}
   if(TI)
   {
	 TI=0;
	  if(DataSended>0)
	   {
	   if(DataSended<20)
	     {
         SBUF=SData[DataSended];
		 DataSended++;
		 TestVar4=DataSended;

         }
       else
          {
	     SData[0] =0;
         DataSended =0;
	      }
        }
	}
   EA=1;
   return;
}

void Timer0_ISR (void) interrupt 1   //DA REFRESH TIMER
{
   DAC0L=DALOW;
   DAC0H=DAHIGH;			 

}

void Timer2_ISR (void) interrupt 5   //串口超时检测
{
   TR2 =0;	  //停计数器2
   TF2 =0;     //清溢出标志位
   ES0=0;
   TestVar5=0x66;
   if(DataNo>0)
   { 
      DataNo=0 ;
      Pos=0;
	  Head=0;
   }
   ES0=1;
}

void Timer3_ISR (void) interrupt 14  //定时读取参数
{
	TMR3CN &= ~(0x80);							// clear TF3
    S_SMBUS=1;
}

⌨️ 快捷键说明

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