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

📄 dcl.c

📁 PIC单片机开发的电磁炉程序.调试成功.都生产过了.
💻 C
📖 第 1 页 / 共 3 页
字号:
/*                            PIC16F73
                          ----------------
                        -|1         RB7 28|- (加热)
       IGBT Temperature -|2 RA0     RB6 27|- (弱加热)
                Voltage -|3 RA1     RB5 26|- (保温)
       REAL Temperature -|4 RA2     RB4 25|- (关机)
                Current -|5 RA3     RB3 24|- Beep
                        -|6 RA4     RB2 23|-
                        -|7 RA5     RB1 22|- Test Plus
                        -|8         RB0 21|- (中断)
                        -|9             20|-
                        -|10            19|-
                        -|11 RC0    RC7 18|-
             PWM Output -|12 RC1    RC6 17|-
            Capture/Fan -|13 RC2    RC5 16|-
                        -|14 RC3    RC4 15|-
                          ----------------

*/


//包括的头文件
#include <pic.h>
#include <math.h>


//定义
#define uchar unsigned char
#define uint unsigned int
#define bPLUS          RB1                                         //发试探脉冲的管脚
#define bBEEP          RB3

#define bSDATA         RC7                                         //SER
#define bSDCLK         RC5                                         //SRCLK
#define bSCLK          RC6                                         //RCLK

#define Turnoff_PWM_Output() {CCP2CON &= 0x0F0; T2CON &= 0x0FB;}   //停止PWM的输出
#define Low_PWM_Output() {  RC1 = 0; bPLUS = 0;}                   //并把PWM管脚拉低
#define High_Test_Output() {bPLUS = 1;}                            //把测试脉冲管脚电平拉高
#define Open_Fan() { RC4 = 1;}                                     //打开风扇
#define Turnoff_Fan() { RC4 = 0;}                                  //关闭风扇

#define DEFus           252
#define DEF20us         225
#define DEF10ms         61
#define PLUSCOUNT       3
#define TRUE            1
#define FALSE           0
#define MAXPLUSNUM      12
#define MINIREAD        15
#define IPOINTS         5

#define TMR1LOW         0X78
#define TMR1HIGH        0X0ec

#define T3RESTTIME      3      //300W时,工作3秒,休息5秒
#define T3WORKTIME      2

#define T6WORKTIME      4      //600W时,工作6秒,休息2秒
#define T6RESTTIME      1


#define gate_Voltage    0X88    //电压AD转化通道选择
#define gate_Current    0X98    //电流AD转化通道选择
#define gate_Pan_Warm   0X90    //锅底温度AD转化通道选择
#define gate_IGBT_Warm  0X80    //IGBT温度AD转化通道选择
#define gate_Key        0X0a0   //按键AD转化通道选择

#define switchTURNOFF   0x10
#define switchKEEPWARM  0x20
#define switchWEAKWARM  0x40
#define switchCOOKING   0x80
#define switchSHIELD    0x0F0

#define PWM_period      0x0a0                       //PWM的周期

void Send_Test_Plus(void);                         //发脉冲宽度为6us的试探脉冲
void Send_IGBT_Plus(unsigned int PWM_hi);         //发IGBT的驱动脉冲,是PWM的正脉冲宽度
void Check_Machine_Wave(void);                     //发出试探脉冲后,检测机器返回的振荡波
void interrupt INT_Service_Prog(void);             //中断服务程序
void PIC_Timer(uchar uKind,uchar uNum);             //定时程序
void Mcu_init(void);                               //单片机初始话程序
void Power_control(uchar iPower);                   //功率档位控制,间隙工作,连续工作
void DISPLAY1(uchar shu1, uchar shu2);              //显示子程序
void Display(void);                                 //显示档位,错误代码
void Judge_Switch_State(void);                      //中断后,对开关状态进行判断
void Read_Switch_State(void);                       //读开关状态,如与档位不一样,立即中断
void Power_adjust(void);                            //功率控制,与工作档位有关,连续工作,间隙工作
void work_condition_check(void);                    //对工作条件进行检测,主要是电压,温度传感器
void Voltage_check(void);                           //在电磁炉工作的情况下,测试电压,查表得出电流,以横功率
uchar ad_out(uchar uchannel);                        //AD转化子程序,参数是各AD通道的选择


//定义标志位
bit  gTimerOver;      //定时器Tmr0定时是否结束,1:Yes,0:No
bit  gWorkNow;        //间隙工作模式下,是否在工作,1:Yes,0:No
bit  bDCLoff;         //电磁炉关机标志,用于关机后1MIN延时,然后等待
bit  bDCLon;          //用在打开加热档的一个标志
bit  bSwitch;         //用在读开关状态的标志,发现开关状态与工作档位不一样,置标志,延时5MS,在读一次
bit  bKeyChange;      //多个循环标志,若开关状态改变,产生中断,置标志,这样,主程序中的某些循环条件就不满足了
bit  bNopan;          //无锅标志,在发试探脉冲后,检测到无锅
bit  bLVoltage;       //检测到电压太低标志
bit  bHVoltage0;      //检测到电压太高标志0
bit  bHVoltage1;      //检测到电压太高标志1
bit  bHpan_tem;       //检测到锅底温度太高的标志
bit  bHigbt_tem;      //检测到IGBT温度太高的标志
bit  bL_Current;      //检测到电流太小的标志,是无锅状态
bit  bH_Current;      //检测到电流太大的标志,是电路故障
bit  bProtect0;       //用在条件的子程序中,如果在条件检测时,发生有错误,置标志
bit  bProtect1;       //在检测电流过程中,电流过大或过小,置标志
bit  bErro;           //只要有一个错误发生,就关机,去不断检测条件

uchar gDoCircle;      //是否持续工作
uchar gTimerDur;      //定义20us延时,还是10ms延时
uchar gTimerNum;      //定义延时的时间因子
uchar gPlusNum;       //定义在取试探脉冲时,多少个就可以满足要求
uchar gPlusNo;        //用于数组的下标
uchar gRevPlus;       //表示发出试探脉冲后,机器返回的脉冲个数
uchar gOldSwitch;     //开关原来的状态
uchar gNowSwitch;     //开关现在的状态
uchar iPower;         //功率档的标志,1关机,8加热,4弱加热,2保温
uchar uWorkTime;      //间隙工作时,工作的时间
uchar uRestTime;      //间隙工作时,休息的时间
uchar bCirCndit;      //在条件检测过程中,每次只检测哪一个的标志
uchar x,a;              //横功率控制,查表用的下标
uchar d01ms,d10ms,d100ms,d01s,d60s,d01h;            //中断的时间单元
uchar t1s,w,t750ms,t10ms,t1ms,t120ms,t2s,t3s,t01s;  //程序控制中需用的时间

uint  PWM_hi;                                       //PWM的占空比
uint gCPLZ[PLUSCOUNT];                              //此数组用于记录捕获到的信号的时间量
union tUNION                                       //定义了一个联合体
{
    uint iX;
    uchar uY[2];
}gCAPU;


//调试中,显示用
//0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
const unsigned char table[20]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0X07,0x7F,
                        0x6F,0x77,0x7C,0x58,0x5E,0x79,0x71,0x7f,0xbf,0x89,0xff};

const unsigned char current_table[22]={0x52,0x4F,0x4B,0x49,0x46,0x44,0x41,0x3F,
                        0x3D,0x3A,0x38,0x3F,0x3D,0x3A,0x38,0x36,0x34,0x32,0x30,
                        0x2E,0x2C,0x2A};

//程序开始了...
void main(void)
{
   uchar uAD;
   uint  iRecordVoltage,u,u1,uHi1,ss1;
   uchar uNum;
   uchar uAD2,uAD0,uADy;
   uchar j,p,t,i;
   uint  uUad  ;

   Mcu_init();

   bBEEP=1;                                  //蜂鸣器长叫一声。时间2秒
   t3s = 0;
   while(t3s<2);
   bBEEP=0;

   INTF = 1;                                 // 强行中断,读开关状态,与00比较
   gOldSwitch = 0x00;                        //开关的初始状态为0


  while(1)
  {

    if(bKeyChange == 1)                      //开关状态改变
    {
        bKeyChange = 0 ;

        Turnoff_PWM_Output();                //关闭PWM的输出
        Low_PWM_Output();                    //PWM管脚拉低

        for(j=256;j>0;j--);                  //延时一会

        Judge_Switch_State();                //判开关的状态

        gWorkNow=0;                          //确保在切换开关后,能马上工作起来
        t1s=20;                              //间隙工作时,马上工作的条件
     }


    if(RB2==0)                               //显示
    {  Display(); }


    if(bDCLoff == 1)                         //关机动作,风扇再工作一分钟
    {
       Turnoff_PWM_Output();                  //关闭PWM的输出
       Low_PWM_Output();                      //PWM管脚拉低


       t2s=0;                                 //延时一分钟
       while((bKeyChange == 0)&&(t2s<90))
       {    Read_Switch_State();     }        //要不断的去读开关状态

       Turnoff_Fan();                         //关闭风扇

       while(bKeyChange == 0)                 //已关机,风扇已工作了,等待开机
       {
          Read_Switch_State();                 //要不断的去读开关状态

          if(RB2==1)                           //显示
          {  Display(); }

       }

    }


    if(iPower==1)
     { Turnoff_Fan();  }                       //关闭风扇
    else
     { Open_Fan();     }                       //打开风扇


    while(bKeyChange == 0)                   //功率控制
    {
      if(RB2==0)
      {  Display(); }

      Read_Switch_State();                              //读开关状态

      work_condition_check();                           //条件检测

      if((bProtect0==1)||(bProtect1==1)||(bNopan==1))   //发生错误,置标志,推出循环
      { bErro=1;  break; }
      else
        bErro=0;

      Power_control(iPower);                             //工作状态控制

      if((iPower==8)||(gWorkNow == 1))                   //横功率控制
      {
          if(t01s>9)                                    //工作后,延时等待在检测
         { t01s=10;
           Voltage_check();                              //检测电压
           Power_adjust();                               //检测电流,查表调整PWM
         }
      }

    }


    if(bErro==1)                                         //发生错误,进行处理
    {
       Turnoff_PWM_Output();                             //关闭PWM的输出
       Low_PWM_Output();                                 //PWM输出低电平

       while(1)
       {
          if(RB2==0)                                     //显示
          {  Display(); }

          bBEEP =1;                                      //蜂鸣器报警
          bProtect1=0;

          Read_Switch_State();                           //读开关状态
          if(bKeyChange == 1)                            //开关状态改变,退出
          { bErro =0;
            bBEEP =0;
            break;

          }


          if(bH_Current==1)                              //对电流太大进行处理
          { bH_Current=0;
            t2s=0;
            while(t2s<2);                                //延时2秒,退出处理程序,再去检查
            bBEEP =0;                                     //关蜂鸣器,取消错误标志
            bErro =0;

            gWorkNow=0;                                   //确保在工作条件满足后,能马上工作起来
            t1s=20;
            bDCLon=0;
            PWM_hi=0x0c0;

            break;
          }


          if((bL_Current==1)||(bNopan==1))               //对无锅进行处理
          {  t2s=0;
             while(t2s<1);

             Check_Machine_Wave();                       //发试探脉冲,检测返回个数
             if(gRevPlus >= MAXPLUSNUM)                  //如果测试到的脉冲数大于预先设定的脉冲数
                bNopan=1;                                //则认为无锅
             else
                bNopan=0;
           }


          if(bProtect0==1)                                //对温度传感器或电压错误进行处理
          { work_condition_check();        }


          if((bProtect0==0)&&(bNopan==0))                //条件正常,退出
          { bErro =0;
            bBEEP =0;

            gWorkNow=0;                                  //确保在工作条件满足后,能马上工作起来
            t1s=20;
            bDCLon=0;
            PWM_hi=0x0c0;

            break;
          }



       }

     }

  }

}



//开关状态改变
void Judge_Switch_State(void)
{
   gOldSwitch = gNowSwitch;                                     //承认开关状态改变,更新开关状态

   bSwitch = 0 ;                                                //清在读开关状态过程中,发现开关状态与档位不一样时,置的标志

   if((gNowSwitch & switchTURNOFF) == switchTURNOFF)            //是关机状态
        iPower = 1 ;                                            //定义开关状态单元

   else if((gNowSwitch & switchCOOKING) == switchCOOKING)       //是保温状态

⌨️ 快捷键说明

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