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

📄 main.c

📁 简易风盘控器程序 AVR GCC MEGA8
💻 C
字号:
/**************** (c) 2005   佛山菱电 *****************************************
PROJECT  : 简易风盘控制器
COMPILER : AVR ICC for m48
MODULE   : main.c
VERSION  : 1.0.0
DATE     : 2005/12/12
AUTHOR   : 朱坤
DESCRIPTION :   Main Routine

MODIFICATIONS :
******************************************************************************/

#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include "lib.h"
#include "version.h"

#include "ports.h"
#include "timer.h"
#include "adc.h"
#include "i2c.h"
#include "fan.h"
#include "buz.h"
#include "lcd.h"
#include "scom.h"
#include "main.h"

#ifndef UGPIO
u8 RunMode;                 /* 运行模式 */
#endif
u8 SysConfig;               /* 配置 */
u8 Errorflg;                /* 内机故障 */
u8 Sysflag;
u8 SetupTp;                 /* 设定温度,加偏移 0x80 */
u8 NeijiNo;                 /* 内机 ID */
u8 OutDevStu;               /* 室外机工作/设备状态(3字节) */
u8 OutSideErr;              /* 室外机故障状态(6字节) */
u8 StartUt;
u8 SysOkDly;

#ifdef ChigoXG1
#ifndef ChigoXG1Set
u8 SetOffset;               /* 制热温度补偿 +0x80*/
#endif
#endif

/* 复位标志 */
u16 ResetID;

int main(void)
{
  cli();                    /* 禁止中断 */

  OSCCAL = 0x0A8;

  PORTS_Init();             /* 初始化 I/O */
  PORTS_Ref();              /* 刷新I/O */

  /* 禁止 USART 模块 */
  //UCSR0A = (u8)(1<<TXC0);
  UCSR0B = (u8)0x00;
  //UCSR0C = (u8)0x00;

  /* 禁止 TWI 模块 */
  TWCR = (u8)0x00;
  /* 禁止 SPI 模块 */
  SPCR = (u8)0x00;
  /* 不允许 Sleep  */
  SMCR = (u8)0x00;
  /* 禁止 ACC 模块 */
  ACSR = (u8)(1<<ACD);

  wdt_enable(WDTO_500MS);   /* 初始化看门狗 */

  if (ResetID != 0x5A7D){
    ResetID = 0x5A7D;
    Buz_Init(BuzCntrLong);  /* 蜂鸣器初始化 */
    I2C_Init();             /* 初始化 i2c 模块 */
    Lcd_Init();             /* LED 显示初始化 */
    PG_Init();              /* PG 风机初始化 */
    ADC_Init();
    GetFromEEPROM();        /* 从 EEPROM 中恢复记忆的参数*/
  }

  Init_Timer0();            /* 计时模块初始化 */
  Init_Timer2();            /* T2 初始化 */
  sei();                    /* 允许中断 */

  while (1){

#if 0
#ifdef DEBUG
     DDRC  |= 0x04;
     PORTC ^= 0x04;
#endif
#endif

#ifndef DEBUG
    PORTS_Ref();            /* 刷新I/O */
#endif
    ScCom_Sub();            /* 外机通信接收数据处理,同时生成发送数据 */
#ifdef DISDRYCONTINUE
    /* 除湿时不允许连续 */
    //if ((u8)(RunMode & MODEMASK) == MODEDRY){   /* 除湿模式  */
    //  ClrBit(Sysflag,fContinue);                /* 1: 连续 */
    //}
#endif
    if (((u8)(RunMode & MODEMASK) == MODEHEAT)  /* 制热模式  */
         && ValBit(SysConfig,fDisHeat)){        /* 1: 单冷机 */
      RunMode = (u8)((RunMode & ~MODEMASK)|MODEFAN);
    }
    Timer_Sub();            /* 4mS 计时 */
    wdt_reset();            /* 刷新看门狗 */
    SleepSub();             /* 睡眠控制 */
    TimerOnOff();           /* 定开定关 */

    /* 功率控制 */
    if (RunMode == ((1<<fSysOn)|(1<<fSysOnOff)|MODEHEAT) ){
      CHK_Power(SetupTp, TempOffset, MODECOOL);
    } else if (RunMode == ((1<<fSysOn)|(1<<fSysOnOff)|MODECOOL) ){
      CHK_Power(AmbientTp, SetupTp, MODECOOL);
    } else if  (RunMode == ((1<<fSysOn)|(1<<fSysOnOff)|MODEDRY) ){
      CHK_Power(AmbientTp, 0x90, MODEDRY);
    } else {
      StartUt = 0;
      ClrBit(Sysflag,fPower);     /* 关压缩机 */
    }

    WorkStu_Sub();          /* 风机控制 */
    PG_FeedBack();          /* PG 风机反馈 */
    FanCont_Sub();          /* 风机输出 */
    Buz_Sub();              /* 蜂鸣器处理 */
    SaveToEEPROM();         /* 更新EEPROM中的参数 */
    if ((RunMode & ((1 << fSysOnOff)|   /* 系统请求开机 */
                    (1 << fLtdSwOn) |   /* 1: 系统被锁定,不开机 */
                    (1 << fErrSt)   |   /* 1: 故障关机 */
                    (1 << fSysPower)|   /* 1: 功率超过 */
                    (1 << fSysOn))) == (1 << fSysOnOff)){
        SetBit(RunMode,fSysOn);         /* 同意开机 */
    }
  }
  return 0;
}

void CHK_Power(u8 TempTr, u8 TempTs,u8 ModeSet)
{
   if (StartUt != ModeSet){
     StartUt = ModeSet;                /* 由其它模式进入 */
     ClrBit(Sysflag,fModeflag);
     ClrBit(OutDevStu,fRunEnable);     /* 1:外机工作允许标志 */
   }

   if (!ValBit(OutDevStu,fRunEnable)){ /* 1:外机工作允许标志 */
     ClrBit(Sysflag,fPower);           /* 关压缩机 */
   } else if (TempTr > TempTs){
     ClrBit(Sysflag,fDelay);           /* 1:停压缩机延时 */
     SetBit(Sysflag,fPower);           /* 开压缩机 */
   } else if (TempTr < TempTs){
     if (!ValBit(Sysflag,fDelay)){
       SetBit(Sysflag,fDelay);         /* 1:停压缩机延时    */
       SysOkDly = 0x96;                /* 停压缩机延时 5分钟 */
     }
     if (SysOkDly == 0){
       ClrBit(Sysflag,fPower);         /* 关压缩机 */
     }
   }
}

void SetMode(u8 nMode)
{
  if (nMode != (u8)(ValBit(Sysflag,fMAuto)? MODEAUTO : (RunMode & MODEMASK))){
    RunMode = (u8)((RunMode & ~MODEMASK)| nMode);
    ClrBit(Sysflag,fDelay);          /* 1:停压缩机延时 */
    ClrBit(Sysflag,fMAuto);          /* 自动模式清除 */
  }
}

/*** (c) 2005  佛山菱电 **************************** END OF FILE *************/

⌨️ 快捷键说明

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