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

📄 main.c

📁 为日本瑞萨苏州分公司做的一个温控系统
💻 C
字号:
//-------------------------------------------------------------------------*
//工程文件名:Bake.prj                                                      *
//硬件连接:                                                                *
//  TLC2543的CS,I/O CLOCK,DATA INPUT,DATA OUT分别接PTC0,PTD1~PTD3        *
//  LCD的数据口为PTB0~PTB7,控制口为PTC1~PTC4                              *
//  报警灯:红灯及蜂鸣器、绿灯、黄灯、Bake阀、Cool阀分别接PTA的第0~4脚     *
//  温度电位器、时间电位器、热敏电阻、红外传感器分别接TLC2543的第0~3脚    
//程序描述:由TLC2543采集来的AD值确定设定时间、设定温度、当前温度和         *
//         Cool箱中是否有物体                                              *
//         判断如果Bake炉内温度变化超过设定温度一定范围,则红灯闪并报警    *
//         否则等加热到设定时间后黄灯闪,切掉Bake炉电源,提示取出加热物体  *
//         放入Cool箱,冷却阀闭合,当物体移出Cool箱后,冷却阀断开          *
//日    期:2007.04.25                                                      *
//-------------------------------------------------------------------------*
#include "Includes.h"           //总头文件

//内部函数声明
void LightAlarm(INT8U Light);   //通过不同颜色灯闪,提示进一步操作
INT16U ConvertCT(INT16U adv);   //将AD值转换当前温度
INT16U ConvertT(INT16U adv);    //将AD值转换设定温度
INT16U ConvertTime(INT16U adv); //将AD值转换设定时间
void ReFlash(void);

//主函数
void main()
{
   INT16U ADValue[11];  //11路A/D采集数据
   INT8U InitTime;          //开始计时的基值
   INT16U tmp;
  
   //初始化
   DisableMCUInterrupt();   //禁止总中断
   MCUInit();               //芯片初始化
   SPIInit();               //SPI初始化
   LCDInit();               //Lcd初始化
   SCIInit();               //串口初始化
   Timer1init();            //定时器1初始化
   SwitchOutput_Init();     //开关量输出初始化
   EnTm1OverflowInt();      //开放Timer1溢出中断
   EnableSCIReInt();        //开放串行中断
   EnableMCUInterrupt();    //开放总中断
MainLoop:    
   //初始化标志
   StateFlag=1;             //初始状态为1:开绿灯、Bake炉
   CoolFlag=0;              //开始工作时,Cool箱中是没物体的
   FlashFlag=0;             //需要校准当前温度或修改MCU号时在串行中断里置1
  
   //主循环
   while(1)
   {
     //1 采集A/D值,转换为设定温度、设定时间、当前温度和红外传感器值
     ADC11P(0,ADValue);
     CurtTmp=ConvertCT(ADValue[0]);   //第0路为当前温度
     Temper=ConvertT(ADValue[1]);     //第1路为设定温度
     Time=ConvertTime(ADValue[2]);    //第2路为设定时间
     Infrared=ADValue[3];             //第3路为红外传感器的值
     
     ADCurtTmp=ADValue[0];            //校准当前温度时写flash用
     if(FlashFlag==1)
       ReFlash();

     //2 根据不同状态,作不同处理
     switch(StateFlag)
     {
       case 1://状态1:绿灯亮,Bake炉通电工作 
              SwitchOutput(C_GreenLight,1); //系统开始工作后,绿灯常亮
              SwitchOutput(C_BakeSw,1);     //使Bake炉开始工作
              StateFlag=2;                  //进入状态2
              break;
       case 2://状态2:等待炉内温度达到设定值
              if(CurtTmp>=Temper)   //温度达到设定值
              {
                InitTime=MntTim;    //记录此刻时间,作为加热时间的基值
                StateFlag=3;        //进入状态3
              }
              break;
       case 3://状态3:如果当前炉内温度偏离设定温度过大,则报警提示关闭系统
              if(CurtTmp>Temper)    //允许正负偏一定值,tmp为两者的差值
                 tmp=CurtTmp-Temper;
              else
                 tmp=Temper-CurtTmp;
              if(tmp>C_TmpPC)  //如果当前温度与设定温度偏差大于5,作异常处理
              {
                 SwitchOutput(C_BakeSw,0);    //断开Bake阀
                 SwitchOutput(C_GreenLight,0);//绿灯灭
                 SwitchOutput(C_RedLight,1);  //红灯亮并报警,直到掉电
              }
              else 
              {
                 StateFlag=4;   //进入状态4
              }   
              break;
       case 4://状态4:如果加热到设定时间,黄灯闪
              CurtTime=MntTim-InitTime;
              if(CurtTime>=Time)     //加热时间到,报警灯提示,直到Cool阀开
              {
                 LightAlarm(C_YellowLight);    //断开Bake阀、绿灯灭、黄灯闪
                 StateFlag=5;   //进入状态5
              }
              else
              {   
                 StateFlag=3;   //加热时间未到,回状态3,边判边等
              }   
              break;  
       case 5://状态5:冷却箱中有物体放入,就闭合Cool阀,等到无物体时就断开
              if(Infrared<=C_Exist)
              {
                 SwitchOutput(C_CoolSw,1);
                 SwitchOutput(C_GreenLight,1);
                 CoolFlag=1;       //有物体放入置此标志
              }
              else if(CoolFlag==0) //没物体放入,转状态4继续黄灯闪提示
                   {
                     StateFlag=4;
                   }
                   else            //有物体放入并已经拿走,则断开Cool阀
                   {
                     SwitchOutput(C_CoolSw,0);    //关冷却箱
                     SwitchOutput(C_GreenLight,0);//绿灯灭
                     CoolFlag=0;
                     goto MainLoop;
                   }
              break;
     }//switch
   }//while    
}


//**************************************************************************
//                              内部函数                                   *
//**************************************************************************

//-------------------------------------------------------------------------*
//函数名:ConvertCT                                                         *
//参  数:AD值                                                              *
//返  回:AD值对应的当前温度                                                *
//功  能:将AD值转换为当前温度                                              *
//-------------------------------------------------------------------------*
INT16U ConvertCT(INT16U adv)
{
     INT32U tmp;
     
     //防止溢出,限定最大最小值
     if(adv<TADmin)      
        adv=TADmin;
     else if(adv>TADmax)
             adv=TADmax;
          
     //             TADmax-TADmin     adv-TADmin
     //计算公式:  -------------- = ---------------
     //              Tmax-Tmin          ?-Tmin
     tmp=adv-TADmin;      
     tmp=(tmp*(Tmax-Tmin))/(TADmax-TADmin)+Tmin;
     return(tmp); 
}
//-------------------------------------------------------------------------*
//函数名:ConvertT                                                          *
//参  数:AD值                                                              *
//返  回:AD值对应的设定温度                                                *
//功  能:将AD值转换为设定温度                                              *
//-------------------------------------------------------------------------*
INT16U ConvertT(INT16U adv)
{
     INT32U tmp;    //32位
     
     tmp=adv; 
     //按线性关系,将AD值范围分为C_TmpBound等分              
     tmp=((tmp*C_TmpBound)/C_RADMax)/10+C_MinTmp;
     return(tmp);      
}
//-------------------------------------------------------------------------*
//函数名:ConvertTime                                                       *
//参  数:AD值                                                              *
//返  回:AD值对应的设定时间                                                *
//功  能:将AD值转换为设定时间                                              *
//-------------------------------------------------------------------------*
INT16U ConvertTime(INT16U adv)
{
     INT32U tmp;  //32位

     tmp=adv; 
     //按线性关系,将AD值范围分为C_TimBound等分         
     tmp=((tmp*C_TimBound)/C_RADMax/10+C_MinTim); 
     return(tmp);      //显示可精确到0.1分,此处计时只精确到1分
/////////////////////////////////////////
//return(2);
//////////////////////////////////////////////////////////     
}

//-------------------------------------------------------------------------*
//函数名:LightAlarm                                                        *
//参  数:无                                                                *
//返  回:无                                                                *
//功  能:切掉Bake炉电源、通过不同颜色灯闪,提示进一步操作                  *
//-------------------------------------------------------------------------*
void LightAlarm(INT8U Light)
{
   INT8U  i,j;
   
   //Bake炉内温度异常,切掉Bake炉电源
   SwitchOutput(C_BakeSw,0);
   //绿灯灭
   SwitchOutput(C_GreenLight,0);
   
   //灯亮
   SwitchOutput(Light,1);
         
   //延时
   for(i=0;i<200;i++)
      for(j=0;j<200;j++);
          
   //灯灭
   SwitchOutput(Light,0);
         
   //延时
   for(i=0;i<200;i++)
      for(j=0;j<200;j++);
}


//校准当前温度,或修改MCU号,写flash函数
void ReFlash(void)
{
   
   DisableMCUInterrupt();
   EraseFlash(0x8000);	//擦除0x8000为始址的一个页
   WriteFlash(0x8000);
   EnableMCUInterrupt();
   
}

⌨️ 快捷键说明

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