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

📄 51.c

📁 51下的步进电机控制
💻 C
字号:
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned short
#define ulong unsigned long



void delayms(uint x)
{    uint i;
     while(x>0)
     {  for (i=1; i<60;i++);
        {x--; }
     }
}

void beeps(uint t)
{
    beep = 1;
    delayms(t);
    beep = 0;
}

void write_8254_config( uchar num, uchar config_data )
{
       if(num == 1)
         cs1 = 0;
       if(num == 2)
         cs2 = 0;
       rd = 1;
       a0 = 1;
       a1 = 1;
       P0 = config_data;
       wr = 0;
       rd = 1;
       wr = 1;
       cs1 = 1;
       cs2 = 1;
       P0 = 0xff;
}



void program_count( uchar num_p, uchar num_c, uint cv )
{
       if(num_p == 1)
         cs1 = 0;
       if(num_p == 2)
         cs2 = 0;
       rd = 1;
       a0 = ((num_c % 2 ) == 1) ;
       a1 = ((num_c / 2 ) == 1) ;
       P0 = cv%256;
       wr = 0; rd = 1; wr = 1;
       P0=cv/256;
       wr= 0; rd = 1; wr = 1;
       cs1 = 1;
       cs2 = 1;
       a0 = a1 = 1;
       P0 = 0xff;

}


void set_pulse1(uint p_num, uint freq)
{
       write_8254_config(1, 0x70);
       program_count(1, 1, p_num);
       write_8254_config(1, 0x36);
       program_count(1, 0, freq);
}



void set_pulsef1(uint p_num, uint freq)
{
    uint f = (uint)((10000000 / (ulong)freq));
       write_8254_config(1, 0x70);
       program_count(1, 1, p_num);
       write_8254_config(1, 0x36);
       program_count(1, 0, f);
}



void set_pulse2(uint p_num, uint freq)
{
       write_8254_config(2, 0x70);
       program_count(2, 1, p_num);
       write_8254_config(2, 0x36);
       program_count(2, 0, freq);
}

void set_pulsef2(uint p_num, uint freq)
{
    uint f = (uint)((10000000 / (ulong)freq));
       write_8254_config(2, 0x70);
       program_count(2, 1, p_num);
       write_8254_config(2, 0x36);
       program_count(2, 0, f);
}

void set_pulse3(uint p_num, uint freq)
{
       write_8254_config(1, 0xb0);
       program_count(1, 2, p_num);
       write_8254_config(2, 0xb6);
       program_count(2, 2, freq);
}






void conti_move()
{
    uint num;
    b_stop = 0;

   // beeps(100);

    while(1)
    {
      set_pulsef2(500, speed);
   //   beeps(20);
      while(1)
      {

        delayms(10);
        num = read_count(2, 1);
        if(b_stop || (num==0) )
          break;
         else if(bb)
         {    
          bb = 0;
          break;

        }
      }
      if(b_stop) {
        set_pulse2(2, 20000);
        break;
      }
    }
  // beeps(1000);
}

void cer_move()
{
  set_pulsef2(num_p, speed);
  b_stop = 0;
 // task_n = 2;
  delayms(20);
  while(read_count(2, 1) != 0)
  {
    delayms(10);
    if(b_stop)
    {
       break_bit = 1;
       set_pulsef2(2, speed);
       break;
    }

  }
 // beeps(1000);
 // task_n = 0;
}




void loudou_move()
{
  set_pulsef1(num_p, speed);
  b_stop = 0;
  //task_n = 2;
  delayms(20);
  while((read_count(1, 1) != 0) && (!b_stop))
  {
    delayms(10);
    if(b_stop)
    {
      // break_bit = 1;
       set_pulsef1(1, speed);
       break;
    }
  }
  set_pulsef1(1, speed);
  ///task_n = 0;
}

main()
{
      // uint i;
       EA = 1;
       beeps(100);
       CH375_Init();
       delayms(500);

       while(1) {
         while (break_bit);
         switch (task_p) {
           case 0x01:     /*delayms(1000); beeps(1000);*/
                          speed = (uint)((uint)dat[2] * 256 + dat[3]);
                          dir2 = dat[4];
                          conti_move();
                          break_bit=1;
                          break;
           case 0x02:    /* delayms(1000); beeps(1000);*/
                          b_stop=0;  break_bit=1;
                          break;

           case 0x03:   /*  delayms(1000); beeps(1000); */
                          speed = (uint)((uint)dat[2] * 256 + dat[3]);
                          num_p = (uint)((uint)dat[4] * 256 + dat[5]);
                          dir2 = dat[7];
                          cer_move();
                          break_bit=1;
                          break;
           case 0x04:    /* delayms(1000); beeps(1000);  */
                          speed = (uint)((uint)dat[2] * 256 + dat[3]);
                          num_p = (uint)((uint)dat[4] * 256 + dat[5]);
                          dir1 = dat[7];
                          loudou_move();
                          break_bit=1;
                          break;
           default:       break_bit=1;  break;
         }
       //  delayms(1000);
      //   beeps(100);


       }

}




⌨️ 快捷键说明

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