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

📄 motor_1_1.c

📁 电机控制板程序修改.机电一体化的实际应用。可操作性强
💻 C
📖 第 1 页 / 共 2 页
字号:
void transmit_byte(unsigned char send_byte)
{
 ES=0;
 SBUF=send_byte;
 while(TI==0);
 TI=0;
 ES=1;
}
//-----------------串口中断程序 -------------------------
void com_int() interrupt 4 using 1
{
 cmd=SBUF;
 RI=0;
}
//--------------写一个字节到液晶------------------------
void lcd_write(bit slr,unsigned char write_dat)
{
 RS=slr;
 E=1;
 lcd_dat_port=write_dat;
 E=0;
 delay(2);
}
//--------------液晶初始化-----------------------------
void ini_lcd()
 {
  //RW=0;
  delay(10);
  lcd_write(0,0x38);
  lcd_write(0,0x0c);
  lcd_write(0,0x06);
  lcd_write(0,0x01);
 }
//-------------------------液晶显示--------------------------
void display()         //将显示缓存lcd_buf[16]的内容显示
 {unsigned char ii;
  lcd_write(0,2);
  delay(10);
  for(ii=0;ii<16;ii++)
   {
    if (ii==8) lcd_write(0,0xc0);
    lcd_write(1,lcd_buf[ii]);
   }
 }
//-------------- 按键子程序 ----------------------
unsigned char get_key()
{unsigned char key1,key2,ii;
 key1=key_port;
 delay(100);       //10ms消抖动
 if(key1==key_port) //延时10ms后键不变
   {
    key_port=0x0f;
    key2=key_port;
    key1=key1|key2;
    key_port=0xf0;
    for(ii=0;ii<16;ii++)
      {if(key1==key_index[ii])
          return(ii);
      }
    return(0xff);
   }
 else return(0xff);
}
//-------------- 菜单 -----------------------
void menu()
{unsigned char key_val,ii;
 unsigned int setup_val;     //设置值,指步进电机转速设置值或直流电机PWM设置值
 static unsigned char selection=1;
 key_val=get_key();          //选择一级菜单,打"*"项为选中项
 if(key_val==0x0e)  //功能键
   {
    menu_level=1;choice=0;selection=1;
    strcpy(lcd_buf,"Measure*  Setup "); //显示一级菜单
    display();
    }
 else if(menu_level==1&&key_val==0x0c)                     //一级菜单下,左键
   {selection=1;lcd_buf[7]='*';lcd_buf[15]=' ';display();} //选中Measure,测速菜单项
 else if(menu_level==1&&key_val==0x0d)                     //一级菜单下,右键
   {selection=2;lcd_buf[7]=' ';lcd_buf[15]='*';display();} //选中Setup,设转速或脉冲频率
 else if(menu_level==1 && selection==1 &&key_val==0x0f)    //一级菜单下,选中Measure
   {
    choice=1;
    strcpy(lcd_buf,"Rotation:    r/m");
    display();
   }
 else if(menu_level==1 && selection==2 &&key_val==0x0f) //一级菜单下,选中Setup进入二级菜单
   {
    menu_level=2;selection=1;
    strcpy(lcd_buf,"Step.* DC_motor ");                 //显示二级菜单
    display();
   }
 else if(menu_level==2&&key_val==0x0c)                     //二级菜单下,左键
   {selection=1;lcd_buf[5]='*';lcd_buf[15]=' ';display();} //选中Step.,设定步进电机
 else if(menu_level==2&&key_val==0x0d)                     //二级菜单下,右键
   {selection=2;lcd_buf[5]=' ';lcd_buf[15]='*';display();} //选中DC_motor,设定直流电机
 else if(menu_level==2&&selection==1&&key_val==0x0f)       //二级菜单下,确认键
   {menu_level=3;choice=2;strcpy(lcd_buf,"Stepper.rot:    ");display();} //选中Stepper,设定步进电机转速
 else if(menu_level==2&&selection==2&&key_val==0x0f)       //二级菜单下,确认键
   {menu_level=3;
    strcpy(lcd_buf,"PWM:         . %");
    choice=3;
    display();
   }
  else if(choice==2&&key_val<10)                            //数字键,设PWM值
   {if(setup_val!=0)
       {
        setup_val=0;
        lcd_buf[12]=' ';lcd_buf[13]=' ';lcd_buf[14]=' ';lcd_buf[15]=' ';//数字清掉从来
       }
    lcd_buf[12]=lcd_buf[13];     //数字逐位左移
    lcd_buf[13]=lcd_buf[14];
    lcd_buf[14]=lcd_buf[15];
    lcd_buf[15]='0'+key_val;
    display();
   }                                                      //选中Stepper,设定步进电机转速
 else if(choice==3&&key_val<10)                            //数字键,设定步进电机速度
   {if(setup_val!=0)
       {
        setup_val=0;
        lcd_buf[11]=' ';lcd_buf[12]=' ';lcd_buf[13]='.';lcd_buf[14]=' ';//数字清掉从来
       }
    lcd_buf[11]=lcd_buf[12];     //数字逐位左移
    lcd_buf[12]=lcd_buf[14];
    lcd_buf[14]='0'+key_val;
    display();
   }
 else if(choice==2&&key_val==15)                           //步进电机速度设置完毕
   {
    for(setup_val=0,ii=0;ii<4;ii++)
      {if(lcd_buf[12+ii]!=' ')
         setup_val=setup_val*10+lcd_buf[12+ii]-'0';
      }
    stepping_int(setup_val);
   }
 else if(choice==3&&key_val==15)                           //直流电机PWM设置完毕
   {if(lcd_buf[11]!=' '){setup_val=(lcd_buf[11]-'0')*100;}
    if(lcd_buf[12]!=' '){setup_val=setup_val+(lcd_buf[12]-'0')*10;}
    if(lcd_buf[14]!=' '){setup_val=setup_val+(lcd_buf[14]-'0');}
    PWM=setup_val/2;
   }
 while(key_port!=0xf0);                                     //等待按键释放
 delay(100);
 while(key_port!=0xf0);                                     //等待按键释放
}
//----------------------主程序------------------------------
main()
{
 unsigned char n1=0,n2=0; //命令字的后续两字节
 unsigned char loop_times=1;//主程序大循环次数,主要用于确定占空比用
//unsigned char PWM=0;       //直流电机脉宽调制系数(1到10000)10^-2,精确到0.01%
                           //例如PWM=213表示2.13%
 ini_com();           //串口设置,设波特率19200等
 ini_lcd();           //初始化液晶
 set_T0T1();          //设置T1,T0: T1定时器作定时100us并控制步进电机,
                      //           T0作计数以测定直流电机或步进电机转速
 P1=0;EA=1;ES=1;cmd=0;//初始化,开串口中断

 strcpy(lcd_buf,"Mechatronics  V1"); //显示题头,版本
 display();
 //delay_1s(2);
while(1)
   {key_port=0xf0;
    if (key_port!=0xf0)
       {
        menu();
       }
    else if (cmd==0xc0)          //软件分配步进电机,转速n1n2
       {
        ES=0;
        n1=receipt_byte();
        n2=receipt_byte();
        stepping_int(n1*256+n2);
        cmd=0;
        ES=1;
       }
    else if (cmd==0xc3||choice==1)          //测电机转速
       {
        if (cmd==0xc3)
          {
           n1=speed/256;
           transmit_byte(n1);
           n2=speed%256;
           transmit_byte(n2);
           cmd=0;
           }
        else
          {
           lcd_buf[9]='0'+speed/1000;lcd_buf[10]='0'+(speed%1000)/100;
           lcd_buf[11]='0'+(speed%100)/10;lcd_buf[12]='0'+speed%10;
           if (count_display>5000)   //0.5秒显示刷新一次,该变量在定时T0(100us)中断中累加
             {count_display=0;
              display();
             }
          }
       }
     else if (cmd==0xc2)         //设直流电机PWM系数
       {
        ES=0;
        n1=receipt_byte();
        n2=receipt_byte();
        ES=1;
        PWM=n1*256+n2;
        PWM=PWM/2;
        cmd=0;
       }
    /*else if (cmd==0xc3);
    else if (cmd==0xc4);*/
     else if (cmd==0xc5)         //停止步进电机
       {
        stepping_by_T0=0;
        /*speed=0;*/
        cmd=0;
       }
   /*else if (cmd==0xc6)
      {
       PWM=0;//停止直流电机
       cmd=0;
       }*/
    /*if (loop_times<PWM)
       DC_MOTOR=1;
    else
       DC_MOTOR=0;
    loop_times++;
    if (loop_times>100)
       loop_times=1;
    //#pragma ASM
    //mov p1,#00H
    //#pragma ENDASM */
   }
}

⌨️ 快捷键说明

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