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

📄 main.c

📁 本代码为电子式单相多费率电能表的源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
{   
  uchar i;
  
  i = 0xFF;
  while(--i); //延时140uS
 
  if(PULSE==0)
  {
    if(REVP==1) //电能正向处理
    {
      if((Fee1==0)&&(Fee0==1))  Energy.PulseTmp1[0]++; //峰时段处理
      else if((Fee1==1)&&(Fee0==1))  Energy.PulseTmp1[2]++; //谷时段处理
      else  Energy.PulseTmp1[1]++; //平时段处理
      Energy.PulseTmp1[3] = ~(Energy.PulseTmp1[0]+Energy.PulseTmp1[1]+Energy.PulseTmp1[2]); //校验
    }  
    else //电能反向处理
    {
      if((Fee1==0)&&(Fee0==1))  Energy.PulseTmp2[0]++; //峰时段处理
      else if((Fee1==1)&&(Fee0==1))  Energy.PulseTmp2[2]++; //谷时段处理
      else  Energy.PulseTmp2[1]++; //平时段处理
      Energy.PulseTmp2[3] = ~(Energy.PulseTmp2[0]+Energy.PulseTmp2[1]+Energy.PulseTmp2[2]); //校验
    }
  }
  
}

//**********************************************************
// 名称:keyboard_isr
// 功能:键盘中断处理程序
// 说明:RS485通讯信道切换、RTC报警
//**********************************************************
void Keyboard_isr(void)interrupt 7 using 1      
{
  if((CommFlag==0)&&(RXD485==0)) //选通RS485信道
  {
    KBMASK    = 0x00; //屏蔽RXD485(P0.6脚)键盘中断
    COMMSEL   = 1;    //选通RS485通道
    CommTimer = 0x00;
  }
  KBCON &= 0xFE; //清楚键盘中断标志
}

//**********************************************************
// 名称: watchdogrtc_isr()
// 功能: 看门狗定时器和实时时钟(RTC)中断处理程序
// 说明: 
//**********************************************************
void Watchdogrtc_isr(void) interrupt 10 using 1
{  
  //使用看门狗时不能清此标志位,不使用时最好清掉
  //WDCON  &= ~0x02;
  if(RTCCON&0x80) //检查是否实时时钟中断
  {
    RTCCON  &= ~0x80; //清楚实时时钟中断标志位
    DspFlag  = 1; //置位显示刷新标志
    if(PROG==0)  LCDShowMode = 0; //编程按键按下,正常轮显模式
    if(Prog_Flag==1)  ProgTimer++; //编程开关有效计时
    
    RTCMonitor = 0; //监控RTC是否正常运行
    MainMonitor++;  //监控主循环是否正常运行
    if(MainMonitor>3)  AUXR1 |= 0x08; //软件复位
  }
}

//**********************************************************
// 名称:Timer0_isr
// 功能:Timer0中断处理程序
// 说明:编程按键检测、通讯超时监控程序
//**********************************************************
void Timer0_isr(void) interrupt 1  using 1
{
  uchar Temp;
  
  TF0 = 0;    //清中断标志
  TR0 = 0;
  TH0 = 0x70; //Timer0定时10mS初值
  TL0 = 0x00;
  TR0 = 1;
  //监控Timer0是否正常运行
  T0Monitor = 0;
  //监控RTC是否正常运行
  RTCMonitor++;
  if(RTCMonitor>5000)  AUXR1 |= 0x08; //软件复位
  
  ///////////////////////////////////////////////////////////
  //编程开关处理
  ///////////////////////////////////////////////////////////
  if(PROG==0)
  {
    ProgDeLayTimer++;
  }
  else
  {     
    ProgDeLayTimer = 0; //按键检测延时计数器
    ProgActiveFlag = 0x00; //按键有效标志 	  
    Last_Prog_Flag = 0x01; //上次状态为高,为下次判断作参考
    if(ProgTimer>=240)	   //编程开关有效时间:4分钟
    {
      Prog_Flag = 0;
      ProgTimer = 0x00;
    }
  }
  if(ProgDeLayTimer>50)
  {
    ProgDeLayTimer = 62; //按键检测延时计数器
    ProgActiveFlag = 0xFF; //按键有效标志
    ProgLEDShow = 0x00; //编程键按下时,LED预置为全亮
    if(Last_Prog_Flag==0x01) //上次编程状态为高
    {
      Prog_Flag = !Prog_Flag; //编程状态取反
      ProgTimer = 0x00; //编程有效计时器清零
      Last_Prog_Flag = 0x00; //上次状态为低,为下次判断作参考
    }
  }
  ///////////////////////////////////////////////////////////
  //通讯超时监测
  ///////////////////////////////////////////////////////////
  if(ReinitUARTFlag==1)   //UART重新初始化
  {
    ReinitUARTFlag = 0;   //清除UART重新初始化标志  
    //
    SCON   = 0xD0;	  //SM0=1,SM1=1,REN=1
    SSTAT  = 0x00; 	 
    BRGCON = 0x00;	  //配置内部波特率发生器
    BRGR0  = 0xF0;
    BRGR1  = 0x17;
    BRGCON = 0x03;  	
    IP0H  &=~0x10;	  //设置中断服务优先级为0
    IP0   &=~0x10;
    //
    Flag     &= 0xE0;
    //TimeAdj = 0;	  //校时时间
    //TimeProg= 0;	  //编程时间
    //RxdFlag = 0;	  //接收状态
    //TxdFlag = 0;	  //通信应答
    //TxdWork = 0;	  //发送状态
    CommFlag  = 0;	  //通讯状态标志清零
    COMMSEL   = 0;  	  //默认红外通讯方式
    CTRL485   = 1;  	  //RS485接收状态
    TR1       = 0;	  //Timer1关闭,无红外载波
    //HW38K   = 1;	  //P0.7置高
    CommTimer = 0x00;     //超时计数清零
    ComPtr    = 0x00;     //通讯缓冲区指针置零
    KBMASK    = 0x40;     //P0.6=1,打开RS485通讯唤醒
    ES 	      = 1;        //打开UART中断允许
  } 
  if(CommFlag==1)         //UART通讯状态标志
  {	
    CommTimer++;          //+10mS
    if(TxdWork==0)        //接收状态
    {
      if(RxdFlag==0) 
      {
        if(CommTimer>35)  //允许接收数据时,字节间停顿<=350mS
        {
          ES = 0; //关闭UART中断允许
          ReinitUARTFlag =1; //UART重新初始化标志
        }
      }     
    }	
    else                  //发送状态
    {
      Temp=RS_CmdPtr+RS_Len+2+2; //发送数据长度
      if(ComPtr<=1)//数据发送
      {
        TB8 = 1; //偶校验
        SBUF = 0xFE; //发送第一个字节值
        ComPtr++;
      }
      else if((ComPtr<Temp)&&(CommTimer<20)) //数据发送,字节间停顿<=200mS
      {
        ACC  = ComBuf[ComPtr-2];
        TB8  = P;
        SBUF = ComBuf[ComPtr-2];
        ComPtr++;
      }
      else //数据发送完成
      {
        ES = 0; //关闭UART中断允许
        ReinitUARTFlag =1; //UART重新初始化标志
      }
    }
  }

}

//**********************************************************
// 名称: UART_isr()
// 功能: 串口接收发送中断处理程序
// 说明:
//**********************************************************
void UART_isr(void) interrupt 4 using 1
{
  uchar Temp;
  
  CommFlag = 1; //UART通讯状态标志
  CommTimer = 0; //超时计数器清零

  if(RI) //接收中断处理
  {
    RI = 0; //清除接收中断标志
    	
    if((TxdWork==0)&&(RxdFlag==0)) //不在发送状态,且无已接收数据需处理
    { 	
      Temp = SBUF; //读取接收缓冲区数据
      ACC  = Temp; //接收数据

      if(P==RB8) //寄偶校验位比较,数据正确
      {    		    		    
    	if(ComPtr==0x00)
    	{	
    	  if(Temp==0x68) //帧头检查
    	  {
    	    ComBuf[0] = Temp;
            ComPtr++; //指针+1
          }	 			    
    	}    
    	else
    	{				
	  ComBuf[ComPtr] = Temp;
      	  ComPtr++;
 
      	  if(ComPtr>=RS_CmdPtr) //接收数据长度>10
      	  {      			
      	    Temp = RS_CmdPtr+RS_Len+2; //结束检查
      			
      	    if((ComPtr==Temp)||(ComPtr==RS_MaxSize)) //数据长度正确或达到最大值
      	    {   				
      	      ES = 0; //接收结束,关串口中断   
              RxdFlag = 1; //接收处理标志置位    
              CommFlag = 0; //UART通讯状态标志      					
      	    }
      	  }									
      	}
      }
    }	
  } 

  if(TI)
  {
    TI        = 0; //清除发送中断标志
    TxdWork   = 1; //标志UART处于发送状态
  }
  
}

//**********************************************************
// 名称:Int0_isr()
// 功能:
// 说明:
//**********************************************************
void Int0_isr(void) interrupt 0 using 1
{
  //IE0 = 0;
  AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称: Timer1_isr()
// 功能: Timer1中断处理程序
// 说明:
//**********************************************************
void Timer1_isr(void) interrupt 3  using 1
{
  //TF1 = 0; //清中断标志
  AUXR1 |= 0x08;   //软件复位
}
//**********************************************************
// 名称:PowerOff_isr
// 功能:
// 说明:
//**********************************************************
void PowerOff_isr(void) interrupt 5 using 1
{
  //BOF = 0;
  AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称:I2c_isr
// 功能:
// 说明:
//**********************************************************
void I2c_isr(void) interrupt 6 using 1
{
  //SI = 0;
  AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称: CMP_isr()
// 功能: 
// 说明: 
//**********************************************************
void CMP_isr(void) interrupt 8 using 1
{	
  //CMP1 &= 0xFE; //清楚比较器1的中断标志
  //CMP2 &= 0xFE; //清楚比较器2的中断标志
  AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称:Spi_isr
// 功能:
// 说明:
//**********************************************************
void Spi_isr(void) interrupt 9 using 1
{
  //SPIF = 0;
  AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称:Capture_isr
// 功能:
// 说明:
//**********************************************************
void Capture_isr(void) interrupt 11 using 1
{
 AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称: TXSend_isr()
// 功能: 串口发送中断处理程序
// 说明:
//**********************************************************
void TXSend_isr(void) interrupt 13 using 1
{
  //TI = 0;
  AUXR1 |= 0x08;   //软件复位
}
//**********************************************************
// 名称:ADC_isr
// 功能:
// 说明:
//**********************************************************
void ADC_isr(void) interrupt 14 using 1
{
  //ADCI1 = 0;
  //BNDI1 = 0;
  AUXR1 |= 0x08; //软件复位
}

⌨️ 快捷键说明

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