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

📄 pic16f73inductionprocedures.c

📁 C用语言来做一个PIC16F73电磁炉程序很好的请大家共同学习.
💻 C
📖 第 1 页 / 共 3 页
字号:


//保存TMR1的设置值
    uCON = T1CON;
    TMR1ON = 0;
    TMR1IF = 0;
    TMR1IE = 0;
    uTMRL = TMR1L;
    uTMRH = TMR1H;

    RC2 = 0;
    asm("nop");
//CCP1,RC2
//设置RC2为输入管脚
    TRISC |= 0x04;     //"00000100"

//延时25ms
    PIC_Timer(3,2);
    while(gTimerOver != 1);


    gPlusNum = PLUSCOUNT;   //需要采取的上升沿个数
    gPlusNo = 0x00;         //清零

    gRevPlus = 0x00;        //收到的脉冲数清零

    CCP1CON = 0x00;
    T1CON = 0x00;           //1:1
    TMR1L = 0;
    TMR1H = 0;

//设置CCP1CON
    CCP1IF = 0;
    CCP1IE = 1;
    CCP1CON = 0x05;
    TMR1ON = 1;

//发试探脉冲
    Send_Test_Plus();

//定时160us
    PIC_Timer(2,8);

//当收到的脉冲数等于MAXPLUSNUM时,同时或者定时时间到,退出循环
    while((gTimerOver == 0) && (gRevPlus < MAXPLUSNUM));

//不是定时时间到而退出循环的,关闭定时器
    if(gTimerOver == 0)
    {
        T0IE = 0;
    }



//关闭捕捉功能
    CCP1CON = 0x00;
    CCP1IE = 0;
    TMR1ON = 0;

//恢复TMR1的值设置
    TMR1IF = 0;
    TMR1IE = 1;
    TMR1L = uTMRL;
    TMR1H = uTMRH;
    T1CON = uCON;

    TRISC &= 0x0fb;     //11111011
    asm("nop");
    RC2=1;
}

#pragma interrupt_level 1
void interrupt INT_Service_Prog(void)
{
    uint uDelay;
    uchar uSwOne;
    uchar uSwTwo;

    if(T0IF == 1)                          //是tmr0中断
    {
        T0IF = 0;                          //清楚中断标志

        --gTimerNum;                       //定时个数减一
        if(gTimerNum == 0)                 //延时时间是否到,
        {
           gTimerOver = 1;                 //是,置标志位
           T0IE = 0;                       //关闭定时器中断
        }
        else
           TMR0 = gTimerDur;               //否,继续置定时器时间常数

    }
    if(CCP1IF == 1)                        //是capture中断
    {
        CCP1IF = 0;                        //清除中断标志

        if(gPlusNum != 0)                  //需要capture的次数是否到了
        {                                   //没有,记录相关的数据
            gCAPU.uY[0] = CCPR1L;           //CCPR1L;
            gCAPU.uY[1] = CCPR1H;           //CCPR1H;

            gCPLZ[gPlusNo] = gCAPU.iX;

            gPlusNo++;
            gPlusNum--;
        }

        gRevPlus++;                        //收到的脉冲数加1
        PIC_Timer(2,8);                    //定时器重新开始定时160us
    }
    else if(TMR1IF == 1)                   //是tmr1中断
    {
       TMR1IF = 0;
       TMR1L  = TMR1LOW;
       TMR1H  = TMR1HIGH;
       d01ms++;
       t1ms++;
       if (d01ms>=10)
       {  d01ms=0; d10ms++;
          t750ms++; t10ms++;
          t120ms++;
          if(d10ms>=10)
          {  d10ms=0 ; d100ms++;
             t01s++;

             if (d100ms>=10)
             {  d100ms=0;d01s++;
                t1s++; t2s++; t3s++;

                if (d01s>=60)
                {  d01s=0; d60s++;

                   if( d60s>=60)
                   {  d60s=0; d01h++;
                   }
                }
             }
          }
       }
    }
    else if(INTF == 1)                      //开关状态发生改变
    {
        INTF = 0;                            //清除中断标志
        uSwOne = PORTB & switchSHIELD;       //读开关的值
        if( uSwOne != gOldSwitch)            //判断是否与原来的值相等
        {
            for(uDelay=0;uDelay<300;uDelay++);  //不相等,等待一段时间后,重新读取
            uSwTwo = PORTB & switchSHIELD;
            if(uSwOne == uSwTwo)             //前后两次的值是否相等
            {
                gNowSwitch = uSwOne;         //如相等,则认为开关状态已经发生变化
                gDoCircle = FALSE;           //设定重新循环的标志
                bKeyChange = TRUE ;          //*加热状态改变
            }
        }
    }
}


//uKind = 1,以8us为基准
//uKind = 2,以20us为基准
//否则以10ms为基准
#pragma interrupt_level 1
void PIC_Timer(uchar uKind,uchar uNum)
{
    T0IF = 0;
    T0IE = 1;
//如定时60us,3×20us,为3次
    gTimerNum = uNum;
//定时时间到,开始为"0",结束为"1"
    gTimerOver = 0;
//不是发试探脉冲定时
//    gIsPlus = FALSE;

    if(uKind == 1)
    {
        OPTION &= 0x0F8;
        gTimerDur = DEFus;
    }
    else if(uKind == 2)
    {
        OPTION &= 0x0F8;
        gTimerDur = DEF20us;
    }
    else
    {
        OPTION |= 0x07;
        gTimerDur = DEF10ms;
    }
//TMR0的初始值
    TMR0 = gTimerDur;
}



//此函数发试探脉冲
//试探脉冲的宽度是6us
void Send_Test_Plus(void)
{  uchar i;
   bPLUS = 0;
   for(i=6;i>0;i--);
   bPLUS = 1;
   for(i=2;i>0;i--);
   bPLUS = 0;
   for(i=6;i>0;i--);
}



void Send_IGBT_Plus(unsigned int PWM_hi)
{
    unsigned int uHi,ss;

    PR2 = PWM_period;
    uHi = PWM_hi;

    ss=uHi & 0x03fc;
    CCPR2L = (ss >> 2);
    ss=uHi & 0x0003;
    CCP2CON |= ((ss <<4) & 0x0030);    //CCP2CON<5:4>=0;


    T2CON = 0x01;       // 1/4 frequency

    CCP2CON |= 0x0C;    //PWM mode

    T2CON |= 0x04;      //打开TMR2

}

uchar ad_out(uchar uchannel)
{ int iT;
  ADCON0=uchannel;
  ADCON0 |=0X01;
  for(iT=0; iT<60; iT++) ;
  ADCON0 |= 0X04;
  asm("NOP");
  asm("NOP");
  while((ADCON0&0X04)==0X04) ;
  asm("NOP");
  asm("NOP");
  ADCON0 &=0X0FE;
  return(ADRES);
}


void DISPLAY1(uchar shu1, uchar shu2)
{ char ucdata,ucI,ucshi,ucge;

  ucshi=shu2;
  ucge =shu2;

  bSDATA = 0;
  bSDCLK = 0;
  bSCLK  = 0;

  ucdata=table[ucge];
  for(ucI=0;ucI<8;ucI++)
  {   if (ucdata & 0x80)
         bSDATA=1;
      else
         bSDATA=0;

      asm("NOP");
      asm("NOP");

      bSDCLK=1;
      asm("NOP");
      asm("NOP");
      bSDCLK=0;

      ucdata &= 0x07f;
      ucdata <<= 1;
   }


  ucdata=table[ucshi];
  for(ucI=0;ucI<8;ucI++)
  {   if (ucdata & 0x80)
         bSDATA=1;
      else
         bSDATA=0;

      asm("NOP");
      asm("NOP");

      bSDCLK=1;
      asm("NOP");
      asm("NOP");
      bSDCLK=0;

      ucdata &= 0x7f;
      ucdata <<=1;
   }

   bSCLK=0;
   asm("NOP");
   asm("NOP");
   bSCLK=1;

}


void Mcu_init(void)
{   ADCON1 = 0x00;      //Vref+=VDD,Vref-=VSS,所有的都是A/D口
                        //87X,10位精度;7X,8位精度
                        //RA0:IGBT temperature:pin-2
                        //RA1:Voltage         :pin-3
                        //RA2:Coil temperature:pin-4
                        //RA3:Current         :pin-5
    TRISA = 0x0DF;      //A口全部为输入,用作A/D
    TRISC = 0X08;
    TRISB = 0x0F5;      //RB0,RB4,RB5,RB6,RB7 input,others output

    Low_PWM_Output();   //IGBT的驱动脉冲,不工作时为低电平
                        //测试脉冲为低电平,以防止意外

    T1CON=0X00;
    PIR1=0X00;
    INTCON=0X00;
    TMR1L  = TMR1LOW;
    TMR1H  = TMR1HIGH;
    TMR1IE=1;

    INTCON = 0x00;
    OPTION = 0x0C0;     //RB0/INT上升沿触发, 并禁止弱上拉

    INTE = 1;           //允许外部中断(开关)
    PEIE = 1;           //允许其他外设中断
    GIE = 1;            //允许全局中断

    TMR1ON=1;

}

⌨️ 快捷键说明

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