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

📄 main.c

📁 个人学习参考!禁止使用到产品上! 任何人不得公开发布!
💻 C
字号:
/*========================================*/
/*系统名称:DDSF-CECG-JiangSu             */
/*函数名称:主程序  		              */
/*程序编写:步爱军			              */
/*开始日期:2005-01-01			          */
/*完成日期:				              */
/*修改记录:  				              */
/*软件版本:DDSF-CECG-002                 */
/*版本说明:用户数据保存在外部            */
/*外部器件:LM75、AT24C02、HT1621、LPC932 */
/*          R8025、ADE7755                */
/*========================================*/

//特别声明:利用中断0模拟的485通讯简称串口通讯
//          利用MCU自带的串口进行的红外通讯
//          简称红外通讯

#include <REG932.H>
#include <define.h>
#include <Stdio.h>
#include <Intrins.h>

void main(void)
{        
     EA=0;
     EA=0;       	 
     
     InitCpu();                         //初始化CPU      
     InitCmd();                         //命令初始化---判断硬复位还是软复位         
     InitLcd();                         //初始化液晶显示驱动器
     InitRTC();                         //初始化时钟
     WDT();
     EA=1;
     EA=1;
     while(1)
     {         
          LcdParse();                   //显示方式处理
          Temperature();                //温度采集处理
		  TimeSpend();                  //费率时刻判断         
          CmdParse();                   //外部通讯处理
          PulseParse();                 //脉冲采集处理
          DataProtect();                //数据定时存储(15分钟存储一次数据)        
          LowPower();                   //掉电检测
          KeyParse();                   //键盘采集处理
          DataCom();                    //通讯数据帧处理
          StakeOut(0x00,0x01);
    }
}
//485接收
void INT_INT0(void) interrupt 0 
{
    unsigned char BitData;
    bit BitChk;
    EA=0;
    EX0=0;
    WDT();
    EX0=0;
    BitData=0;
    BitChk=1;
    SeriesInData=0;
    Delay(130);                          //等过起始位
   	while(BitData<9)
   	{ 		
   		if(BitData==8)
        {
            SeriesBitNine=RXD;
        }
   		if(RXD==1)
   		{
   			SeriesInData|=0x0080;
            BitChk=~BitChk;
   		}   	    
  		BitData++;
  		if(BitData<8)
        {
            SeriesInData>>=1;
        }  		
  		Delay(90);
   	}
    if(BitChk)
    {
        if(ComEn)
        {
            
            InfraredSt=0;
            if(SeriesSt)
            {
                if(SeriesBufDptr<60)
         	    {
                  if(SeriesBufDptr==0)			//数据缓冲区地址指针是否为零
                  {       			                
                      if(SeriesInData==0x68)	        //缓冲区的第一个数据是否等于0x68*/
                      {
                          ComDataBuf[0]=SeriesInData;	//数据保存到缓冲区*/
      			           SeriesBufDptr++;		//缓冲区地址累加*/
                      }
                      else
                      {
                          SeriesBufDptr=0;
                      }
                 }
                 else
                 {
                      ComDataBuf[SeriesBufDptr]=SeriesInData;	//数据保存到缓冲区*/
                      SeriesBufDptr++;					//缓冲区地址累加*/
                 }
               }
               else
               {
          	        SeriesBufDptr=0;
               }
               if(ComDataBuf[ComDataBuf[9]+11]==0x16)
               {
          		   SeriesBufDptr=0;
          		   SeriesFg=1;//串口占用数据通道有标志效
          		   ComBit=1;
               }
               else//命令错误释放串口占用数据通道标志
               {
                   SeriesFg=0;//串口占用数据通道标志失效
               }               
            }            
        }
        else
        {
            ComEn=1;
            SeriesSt=1;            
        }        
    }
    EX0=1;
    EA=1;
}
void INT_T0(void) interrupt 1			//定时器---产生模拟接受时序间隔信号
{
    ET0=0;								//定时器0中断使能禁止
	TR0=0;  						    //定时器0中断使能禁止
	TR0=1;
	ET0=1;
}
void INT_INT1(void) interrupt 2         //外部中断1---红外接收中断
{
  EX1=0;
}
//定时器---产生0.25秒信号
void INT_T1(void) interrupt 3			
{
    
	ET1=0;
	TR1=0; 
    CkData++; 
    ComTimeA++;
    WDT();
    //LCD显示间隔---秒单位
    if(CkData>=90)                      
    {
        CkData=0;
        LcdTime++;
        LcdTimeFg=1;
        PingLed=~PingLed;              //峰指示灯点亮
        if(LcdTime>=4)
        {
            LcdRunData++;
            LcdTime=0;          
        }
        ComTimeB++;
		if(ComTimeB>=5)               //通讯指示点亮时间---5秒
		{
			ComFg=0;			
		}   
		TemperatureTime++;
		if(TemperatureTime>=10)       //温度补偿程序定时时间---10分钟
		{
			TemperatureTime=0;
			TemperatureTimeFg=1;
		}
	    DataProtectTime++;
		if(DataProtectTime>=60)      //数据保护程序每一个小时运行一次
		{
			DataProtectTime=0;
			DataProtectFg=1;
		}
    } 
    TH1=0X00;
    TL1=0X00;
    TR1=1;
	ET1=1;
}
//串口中断-红外接收--*/
void INT_SERIAL(void) interrupt 4		   
{
    unsigned char i,j,k,l;	
	ES=0;
	j=0;
	k=0;
	l=SBUF;
	//数据做偶校验
	for(i=0;i<8;i++)
    {
       if(l & 0x80)
       {									//bytedata和0x80作AND逻辑运算等于0x80
           	j++;
           	if(j==2)
            {
               j=0;
            }         						//即表示位7等于1则条件成立
       }
       l <<=1;	
    }								        //禁止串口中断
    if(j==0)
    {
        if(RB8)
        {
            k=0;
        }
        else
        {
            k=1;
        }            
    }
    else
    {
        if(RB8)
        {
            k=1;
        }
    }
    if(k)
    {
        if(ComEn)
        {
            SeriesSt=0;
            if(InfraredSt)
            {
                if(InfraredBufDptr<60)
           	    {
                    if(InfraredBufDptr==0)			//数据缓冲区地址指针是否为零
                    {       			                
                        if(SBUF==0x68)	            //缓冲区的第一个数据是否等于0x68*/
                        {
                            ComDataBuf[0]=SBUF;	    //数据保存到缓冲区*/
        			        InfraredBufDptr++;		//缓冲区地址累加*/
                        }
                        else
                        {
                            InfraredBufDptr=0;
                        }
                   }
                   else
                   {
                        ComDataBuf[InfraredBufDptr]=SBUF;	//数据保存到缓冲区*/
                        InfraredBufDptr++;					//缓冲区地址累加*/
                   }
                   
                }
                else
                {
            	    InfraredBufDptr=0;
                }
                if(ComDataBuf[ComDataBuf[9]+11]==0x16)
                {
          		    InfraredBufDptr=0;
          		    InfraredFg=1;//红外占用数据通道有效
          		    ComBit=1;
                }
                else
                {
                    InfraredFg=0;//红外占用数据通道失效标志
                }
            }           
        }
        else
        {
            ComEn=1;
            InfraredSt=1;           
        }     
    }
	RI=0;
	ES=1;								               //接收标志位清零*
}
void INT_KBI(void) interrupt 7					       //键盘中断处理程序*/
{
    EKBI=0;	
	KBCON=0;
	if(~P0&0x30)
    {
        LowPowerFg=1;
    }
    else
    {								                   //清楚键盘中断标志位
     	KeyTemp=~P0&0x30;				     			   //提取当前中断数值---对应键盘;
     	switch(KeyTemp)							           //判断正向还是反向,以及脉冲是否到来/
     	{
     		case 0x10 :	
     					KBMASK=KBMASK&0xef;				   //允许P0.1键盘产生中断,禁止P0.0键盘中断					
     		break;
     		case 0x20 :
     					KBMASK=KBMASK&0xdf;				   //允许P0.0键盘产生中断,禁止P0.1键盘中断	
     		break;
     		case 0x30 :			
     					KBMASK=KBMASK&0xcf;				   //禁止键盘中断
     		break;
     	}
         PulseParseFg=1;
    }
}
void CMP_ISR() interrupt 8
{
      unsigned char data temp,RING,LED; 
      EA=0; //关中断
      temp=CMP2&0x02;                                //判断CMP1.1
      if(temp==0x02)                                 //如果CMP1.1为1(正向输入端大于反向输入端)
      {
           RING=~RING;
      }
      else if(temp==0x00)                            //如果CMP1.1为0
      {
           LED=~LED;
      }
      CMP2&=0xFE;                                   //清0比较器中断标志位
      EA=1;                                         //开中断
}

⌨️ 快捷键说明

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