导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[求助]求教,抗干扰[wanglian13]

 *第12570篇: [求助]求教,抗干扰

  
楼 主:wanglian13 2003年5月24日18:45
 [求助]求教,抗干扰
求教,抗干扰
    1. 有一电路,见上传,FinglishiLed.sch,由CPU(pic16c73)控制继电器,继电器控制40W日光灯。
    2. 功能已实现,当人按开关,CPU接到开关命令后,打开日光灯,大概工作30--300次不等时,总发生死机,LED显示全无,且不接收任何命令。
    3. CPU内已开启看门狗,不起作用,但用示波器看晶振似乎跳动。

   // watdog is not timo


 #if defined(__PCM__)
#include   <16f73.h>  

#fuses XT,WDT,NOPROTECT    //NOWDT
#use delay(clock=4000000)

#define uchar unsigned char
#define uint unsigned int
//uint   time2s;time40s;

#byte port_b=6


#define jijinDec PIN_A0
//#define  PIN_A1
#define Light_Dec PIN_B7
#define Left PIN_C5
#define Right PIN_C2
#define spkrF PIN_A5

//#define  LightB   PIN_B0
#define DoorB  PIN_A4
//#define spkrA   PIN_B2
//#define LightA  PIN_B3
#define DoorA  PIN_A3
#define Fengji  PIN_C1
#define Light_Ce PIN_C0
//#define BellDoorc PIN_B7

//#define    LcdDat PIN_C0
//#define    LcdClk     PIN_C1
//#define    LOADPIN     PIN_C2
//#define    LcdCom      PIN_B7


//#define         PIN_C2
//#define         PIN_C3
//#define         PIN_C4

#define    detDoorB     PIN_A2
#define    detDoorA     PIN_A1
//#define    spkrB        PIN_C7

#define INTS_PER_SECOND 76     // (20000000/(4*256*256))


//#include   <input.c>  
#include   <24041.c>  

int16 seconds;      // A running seconds counter
byte int_count;    // Number of interrupts left before a second has elapsed
byte int_num1;
byte lightbiao;
byte DAfirst;
uchar  disdata[3];
byte waitnum,waitnum1;
//byte lcdcomBZ;
byte doorOpen;
byte ledon;
//int16 wdtNum;

void wait() {           // This function waits for either ~2ms or until a
  int countdown;        // event happens (in this case a rs232 character)

  countdown=200;
  while(--countdown!=0)
    delay_us(10);
}


void  wait_times(uint waitnum)  // about 1 s
{
  uint i,j;
  for (j=0; j  <waitnum;j++)
  {
   for (i=0; i  <97;i++)
   delay_ms(10);
   restart_wdt();                        // sets timer to interrupt in 200us
  }

}


void  wait_times_openA(uint waitnum)  // about 1 s
{
  uint i,j;
  for (j=0; j  <waitnum;j++)
  {
   for (i=0; i  <100;i++)
   delay_ms(6);
   if(input(detDoorA))
   {
    doorOpen=0;
    break;

   }
   restart_wdt();                        // sets timer to interrupt in 200us
  }

}


void  wait_times_openB(uint waitnum)  // about 1 s
{
  uint i,j;
  for (j=0; j  <waitnum;j++)
  {
   for (i=0; i  <100;i++)
   delay_ms(6);
   if(input(detDoorB))
   {
    doorOpen=0;
    break;

   }

   restart_wdt();                        // sets timer to interrupt in 200us
  }

}

/*

void LCD(uchar  ccdata)
{

    uchar i,j;

      i=8;
      output_high(LOADPIN);


        do
        {

         if((int1)(ccdata&0x01))
                  output_high(LcdDat);
         else
            output_low(LcdDat);
                   output_high(LcdClk);
    output_low(LcdClk);
          output_high(LcdClk);
    ccdata>  >  =1;
        }while(--i!=0);
  output_low(LOADPIN);
}
*/
/////////////0403b  6f 0c 76 3-5e 1d 5b 7b 0e 7f 9-5f


////   Ma-RB6,mb-rb5,mc-rb4,md-rb3,me-rb3,mf-rb1,mg-rb0, com yang


//byte  disdata[3];

static struct
{
  uchar ascii;
        uchar stroke;
} CONST led_stroke[27]=        {{'0',0x81},{'1',0xcf},{'2',0x92},{'3',0x86},{'4',0xcc},   {'5',0xa4},{'6',0xa0},{'7',0x8f},{'8',0x80},{'9',0x84},  {'E',0xb0},{'-',0x81},{'.',0x20},{0x00,0x00},{0xff,0xff},  };


uchar get_stroke(uchar c)
{
  uchar i=0;
  while(led_stroke[i].ascii != c) i++;

  return(led_stroke[i].stroke);
}

uchar kbscan(void)   /*  4key   */
{
   if (!input(detDoorA)||!input(detDoorB)||!input(jijinDec)||!input(Right)||!input(Left)||!input(Light_Dec))  //(detDoorA 1; detDoorB 2; jijinDec 3; Right 4; Left 5; Light_Dec 6;
    {
  delay_ms(10);

    {if (input(detDoorA)==0)

    {
     delay_ms(10);
      {if (input(detDoorA)==0)

       return(1);
      }
    }
   }


    {if(input(detDoorB)==0)
    {
     delay_ms(10);
     {if(input(detDoorB)==0)

      return(2);}
    }}


    {if(input(jijinDec)==0)
    {  delay_ms(10);
      {if(input(jijinDec)==0)

       return(3);}
    }}

    {if(input(Right)==0)
    {  delay_ms(10);
      {if(input(Right)==0)
            {output_low(spkrF);
       delay_ms(140);
       output_high(spkrF);
       return(4);}}
    }}

   {if(input(Left)==0)
    {  delay_ms(10);
      {if(input(Left)==0)
           { output_low(spkrF);
       delay_ms(140);
       output_high(spkrF);
       return(5);}}
    }}

    {if(input(Light_Dec)==0)
    {  delay_ms(10);
      {if(input(Light_Dec)==0)
             {output_low(spkrF);
       delay_ms(140);
       output_high(spkrF);
       return(6);}}
    }}


      }

 else  return(0);
}

void detDoorAF(void)  //before door open for doora
{

  output_low(DoorB);  //   high
  output_high(DoorA);
  //DAfirst=1;

}


void detDoorBF(void)
{
  output_low(DoorA);  //   low
  output_high(DoorB);
  //DBfirst=1;
}
/*
void jijinDecF(void)
{
// DAfirst=1;DBfirst=0;

 if (DAfirst==1)
 { DAfirst=0;
  output_high(Fengji);
  output_high(DoorB);  //
  output_high(DoorA);

  wait_times(waitnum);
  output_low(Fengji);
  output_low(DoorB);   //
  output_low(DoorA);
  //wait_times(waitnum);
 }

}

*/
//void RightF(void){output_high(spkrA);}
//void LeftF(void){output_high(spkrB);}

void Light_DecF(void)
{ if (lightbiao==1)
 {
  output_high(Light_Ce);   //high

  lightbiao=0;
 }
 else
 {
  output_low(Light_Ce);
  lightbiao=1;
 }
}


void key_chuli(uchar key)     //if (!detDoorA||!detDoorB||!jijinDec||!Right||!Left||!Light_Dec)  //(detDoorA 1; detDoorB 2; jijinDec 3; Right 4; Left 5; Light_Dec 6;
{
  // uchar key,speed_d_temp,JumpMark=1;
  // uint i;
  //uchar key;
 // key = kbscan();


      switch (key)

   {              //sw
    case 0:

    break;

    case 1:

    detDoorAF();
    seconds=0;
    doorOpen=1;
     while ((input(detDoorA)==0)&&(doorOpen==1))
      {
      //  if(input(jijinDec)==0)
        // {
       // delay_ms(10);
       // if(input(jijinDec)==0)
       // jijinDecF();
      // }

       restart_wdt();                        // sets timer to interrupt in 200us

        if (seconds>  1200)
         {
          if ((seconds>  1200)&&(seconds  <6600))
          {
           //restart_wdt();                        // sets timer to interrupt in 200us
          output_low(spkrF);
         // output_high(spkrB);
         // output_high(spkrA);
        //   output_low(LightB);
                //   output_low(LightA);

          delay_ms(110);  //140
          //  output_low(spkrA);   //sound off
                    //  output_low(spkrB);   //sound  off
                       output_high(spkrF);
       //   output_high(LightB);
                //   output_high(LightA);
         //restart_wdt();
         //wait_times(1);
         wait_times_openA(3);

                  }

          if (seconds>  6599)
              {
              output_high(DoorA);  //  low
              output_high(DoorB);
              output_low(spkrF);
          // output_high(spkrB);
          // output_high(spkrA);
         //   output_low(LightB);
                 //  output_low(LightA);
           delay_ms(110);  //140
          //  output_low(spkrA);   //sound off
                    //  output_low(spkrB);   //sound  off
                       output_high(spkrF);
                    //   output_high(LightB);
                 //  output_high(LightA);
                      // wait_times(1);
                      delay_ms(500);
                      restart_wdt();
               }

         }
      }
      //// sound turn off
          output_high(spkrF);
          // output_low(spkrB);
          // output_low(spkrA);
          //  output_high(LightB);
                  //         output_high(LightA);
           output_high(DoorB);  //
        DAfirst=1;
    break;

    case 2:

    detDoorBF();
     seconds=0; doorOpen=1;

     while ((input(detDoorB)==0)&&(doorOpen==1))

     {
 //       if(input(jijinDec)==0)
 //        {
 //       delay_ms(10);
 //       if(input(jijinDec)==0)
 //       jijinDecF();
 //      }
      restart_wdt();                        // sets timer to interrupt in 200us

        if (seconds>  1200)
         {
          if ((seconds>  1200)&&(seconds  <6600))
          {
          output_low(spkrF);
         // output_high(spkrB);
         // output_high(spkrA);
        //   output_low(LightB);
               //   output_low(LightA);
          delay_ms(110);  //140
         //   output_low(spkrA);   //sound off
                   //   output_low(spkrB);   //sound  off
                       output_high(spkrF);
                    //    output_high(LightB);
                 //    output_high(LightA);
      //restart_wdt();
         //wait_times(1);
         wait_times_openB(3);
                  }

          if (seconds>  6599)
              {
              output_high(DoorA);  //
              output_high(DoorB);
              output_low(spkrF);
          // output_high(spkrB);
          // output_high(spkrA);
         //   output_low(LightB);
                 //  output_low(LightA);
           delay_ms(140);

          // output_low(spkrA);   //sound off
                    //  output_low(spkrB);   //sound  off
                       output_high(spkrF);
       //  output_high(LightB);
                 //  output_high(LightA);
         //wait_times(1);
         delay_ms(500);
           restart_wdt();

               }

         }
      }
      //// sound turn off
          output_high(spkrF);
          // output_low(spkrB);
          // output_low(spkrA);
          //  output_high(LightB);
                  //  output_high(LightA);
         output_high(DoorA);    // low
         DAfirst=0;
    break;

    case 3:


     // DAfirst=1;DBfirst=0;

      if (DAfirst==1)
    { DAfirst=0;
     //wait_times(1);
      delay_ms(600);
     output_low(Fengji);     //high
     output_low(DoorB);  //
     output_low(DoorA);
      restart_wdt();                        // sets timer to interrupt in 200us
     wait_times(waitnum);
     output_high(Fengji);  //low
     output_high(DoorB);   //
     output_high(DoorA);           //low
     //wait_times(waitnum);
    }


   // jijinDecF();

    // while (input(jijinDec)==0);

    break;

    case 4:

    waitnum1=waitnum1+5;
    if(waitnum1>  94) waitnum1=95;

    //waitnum1
   // SetTimerF();
     while (input(Right)==0){restart_wdt();  }                   // sets timer to interrupt in 200us
    break;

    case 5:

    //SetTimerF();
    waitnum1=waitnum1-5;
    if(waitnum1  <9) waitnum1=5;

     while (input(Left)==0){restart_wdt();  }                      // sets timer to interrupt in 200us;

    break;

    case 6:

    Light_DecF();
     while (input(Light_Dec)==0){restart_wdt();}                        // sets timer to interrupt in 200us
    break;

    default:

          break;

   }//sw


}

                   // This function is called every time
//#int_rtcc
//clock_isr() {                      // the RTCC (timer0) overflows (255->  0).
                                   // For this program this is apx 76 times
//    if(--int_count==0) {           // per second.

//      int_count=INTS_PER_SECOND;

//       restart_wdt();
 //   }
 //restart_wdt();
//}

void Ldis(byte tempdata)
{

        uchar i,j;


   //xdata1temp=tempdata;

   //tempdata=(int)xdata1temp;

   i=tempdata/10;
    if (i>  9){i=9+0x30;}
     else i=i+0x30;


   j=tempdata%10;
   j=j+0x30;


   if (tempdata  <0)
   {


   i='0';
   j='0';


   }


  disdata[1]=get_stroke(i);
  disdata[2]=get_stroke(j);

 }

/*
void display(void)
{
   port_b=disdata[1];
   output_high(PIN_C7);
   wait();
   output_low(PIN_C7);
   port_b=disdata[2];
   output_high(PIN_C6);
   wait();
   output_low(PIN_C6);
}

*/


#INT_TIMER1
void wave_timer() {
  // int i;

   set_timer1(0xD500);

  ++seconds;
  if(seconds>  60000) seconds=60000;
 // wdtNum++;
 // if(wdtNum>  2)
  //{
  //  restart_wdt();                        // sets timer to interrupt in 200us
  //  wdtNum=0;
  //}
 if(ledon==1)
  {
   output_low(PIN_C7);
    port_b=disdata[1];
     output_high(PIN_C6);
   ledon=0;
 }
 else
  {
   output_low(PIN_C6);
    port_b=disdata[2];
     output_high(PIN_C7);
   ledon=1;


  }


}

void main(void)
{


 unsigned char i,j,m,n;

 unsigned char key1;
 uchar dnum;

  setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);   // setup interrupts
  enable_interrupts(INT_TIMER1);
  enable_interrupts(GLOBAL);
   setup_wdt(WDT_2304MS);   //WDT_2304MS

 doorOpen=1;
 ledon=1;
 //wdtNum=0;

  port_b=0;
  set_tris_b(0x80);

   switch ( restart_cause() )
   {
      case WDT_TIMEOUT:
      {

         break;
      }
      case NORMAL_POWER_UP:
      {

         break;
      }
   }


   lightbiao=0;

              output_low(spkrF);


    delay_ms(100);

                 output_high(spkrF);


     wait_times(2);

//////////////////////////////// door init
      output_high(DoorB);  //
                                  output_high(DoorA);    //  low
      DAfirst=0;

   while((input(detDoorA)==0)||(input(detDoorB)==0))
   {
    restart_wdt();                        // sets timer to interrupt in 200us

   
                  output_low(spkrF);
     


      delay_ms(140);
         
                  output_high(spkrF);
                

      wait_times(2);
    
   }


 waitnum=read_ext_eeprom(0x01);
 waitnum1=waitnum;
 if((waitnum>  95)||(waitnum  <5))
 {
  waitnum=50;waitnum1=50;
 }

 Ldis(waitnum);


 while(1)
  {


     restart_wdt();
    key1=kbscan();
    if (key1==1||key1==2||key1==3||key1==4||key1==5||key1==6)
     key_chuli(key1);

                         

                                 if(!(waitnum1==waitnum))
    {
     waitnum=waitnum1;
     Ldis(waitnum);
     write_ext_eeprom(0x01,waitnum);
    }


  


          }

}

  
2楼:红心J 2003年5月24日19:05
 没看程序,只想提醒,不要用定时中断喂狗,
没看程序,只想提醒,不要用定时中断喂狗,否则这狗就白养了。

>>>>>>对该主题发表你的看法

本主题贴数2,分页: [第1页]


[上一篇主题]:[求助]向大家求助:关于Keil c51使用的一些使用

[下一篇主题]:请问用VB编一个上位机程序通过232和单片机相连,怎样在VB里写程序?VB里好象没有对串口的函数嘛?