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

📄 lpc932.txt

📁 使用LPC932制作的一款电能表-源程序
💻 TXT
字号:


 

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

#i nclude <REG932.H>
#i nclude <define.h>
#i nclude <Stdio.h>
#i nclude <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;
    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;
}
void INT_T0(void) interrupt 1            //定时器---产生模拟接受时序间隔信号
{
    ET0=0;                                //定时器0中断使能禁止
    TR0=0;                              //定时器0中断使能禁止
    TR0=0;
    ET0=0;
}
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;
        TimeSpendFg=1;
        PingLed=~PingLed;              //峰指示灯点亮
        if(LcdTime>=4)
        {
            LcdRunData++;             //状态显示时间间隔--吕顺
            LcdTime=0;          
        }
        ComTimeB++;
        if(ComTimeB>=5)               //通讯指示点亮时间---5秒
        {
            ComFg=0;            
        }   
        TemperatureTime++;
        if(TemperatureTime>=100)       //温度补偿程序定时时间---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;
    KeyTemp=~P0&0x08;
    if(~P0&0x08)
    {
        LowPowerFg=1;
    }
    else
    {                                                   //清楚键盘中断标志位
         KeyTemp=~P0&0x30;                                    //提取当前中断数值---对应键盘;
         KeyTemp=KeyTemp>>4;    
         switch(KeyTemp)                                       //判断正向还是反向,以及脉冲是否到来/
         {
             case 0x01 :    
                         PulseParseFg=1;
                         KBMASK=KBMASK&0xef;                   //允许P0.1键盘产生中断,禁止P0.0键盘中断                    
             break;
             case 0x02 :
                         PulseParseFg=1;
                         KBMASK=KBMASK&0xdf;                   //允许P0.0键盘产生中断,禁止P0.1键盘中断    
             break;
             case 0x03 :            
                         PulseParseFg=1;
                         KBMASK=KBMASK&0xcf;                   //禁止键盘中断
             break;
         }
    }
     
}
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 + -