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

📄 motor_1_2.lst

📁 电机控制板程序修改.机电一体化的实际应用。可操作性强
💻 LST
📖 第 1 页 / 共 2 页
字号:
 226   1       RI=0;
 227   1      }
 228          //--------------写一个字节到液晶------------------------
 229          void lcd_write(bit slr,unsigned char write_dat)
 230          {
 231   1       RS=slr;
 232   1       E=1;
 233   1       lcd_dat_port=write_dat;
 234   1       E=0;
 235   1       delay(2);
 236   1      }
 237          //--------------液晶初始化-----------------------------
 238          void ini_lcd()
 239           {
 240   1        RW=0;
 241   1        delay(10);
C51 COMPILER V7.20   MOTOR_1_2                                                             04/02/2008 10:14:27 PAGE 5   

 242   1        lcd_write(0,0x38);
 243   1        lcd_write(0,0x0c);
 244   1        lcd_write(0,0x06);
 245   1        lcd_write(0,0x01);
 246   1       }
 247          //-------------------------液晶显示--------------------------
 248          void display()         //将显示缓存lcd_buf[16]的内容显示
 249           {unsigned char ii;
 250   1        lcd_write(0,2);
 251   1        delay(10);
 252   1        for(ii=0;ii<16;ii++)
 253   1         {
 254   2          if (ii==8) lcd_write(0,0xc0);
 255   2          lcd_write(1,lcd_buf[ii]);
 256   2         }
 257   1       }
 258          //-------------- 按键子程序 ----------------------
 259          unsigned char get_key()
 260          {unsigned char key1,key2,ii;
 261   1       key1=key_port;
 262   1       delay(100);       //10ms消抖动
 263   1       if(key1==key_port) //延时10ms后键不变
 264   1         {
 265   2          key_port=0x0f;
 266   2          key2=key_port;
 267   2          key1=key1|key2;
 268   2          key_port=0xf0;
 269   2          for(ii=0;ii<16;ii++)
 270   2            {if(key1==key_index[ii])
 271   3                return(ii);
 272   3            }
 273   2          return(0xff);
 274   2         }
 275   1       else return(0xff);
 276   1      }
 277          //-------------- 菜单 -----------------------
 278          void menu()
 279          {unsigned char key_val,ii;
 280   1       unsigned int setup_val;     //设置值,指步进电机转速设置值或直流电机PWM设置值
 281   1       static unsigned char selection=1;
 282   1       key_val=get_key();          //选择一级菜单,打"*"项为选中项
 283   1       if(key_val==0x0e)  //功能键
 284   1         {
 285   2          menu_level=1;choice=0;selection=1;
 286   2          strcpy(lcd_buf,"Measure*  Setup "); //显示一级菜单
 287   2          display();
 288   2          }
 289   1       else if(menu_level==1&&key_val==0x0c)                     //一级菜单下,左键
 290   1         {selection=1;lcd_buf[7]='*';lcd_buf[15]=' ';display();} //选中Measure,测速菜单项
 291   1       else if(menu_level==1&&key_val==0x0d)                     //一级菜单下,右键
 292   1         {selection=2;lcd_buf[7]=' ';lcd_buf[15]='*';display();} //选中Setup,设转速或脉冲频率
 293   1       else if(menu_level==1 && selection==1 &&key_val==0x0f)    //一级菜单下,选中Measure
 294   1         {
 295   2          choice=1;
 296   2          strcpy(lcd_buf,"Rotation:    r/m");
 297   2          display();
 298   2         }
 299   1       else if(menu_level==1 && selection==2 &&key_val==0x0f) //一级菜单下,选中Setup进入二级菜单
 300   1         {
 301   2          menu_level=2;selection=1;
 302   2          strcpy(lcd_buf,"Step.* DC_motor ");                 //显示二级菜单
 303   2          display();
C51 COMPILER V7.20   MOTOR_1_2                                                             04/02/2008 10:14:27 PAGE 6   

 304   2         }
 305   1       else if(menu_level==2&&key_val==0x0c)                     //二级菜单下,左键
 306   1         {selection=1;lcd_buf[5]='*';lcd_buf[15]=' ';display();} //选中Step.,设定步进电机
 307   1       else if(menu_level==2&&key_val==0x0d)                     //二级菜单下,右键
 308   1         {selection=2;lcd_buf[5]=' ';lcd_buf[15]='*';display();} //选中DC_motor,设定直流电机
 309   1       else if(menu_level==2&&selection==1&&key_val==0x0f)       //二级菜单下,确认键
 310   1         {menu_level=3;choice=2;strcpy(lcd_buf,"Stepper.rot:    ");display();} //选中Stepper,设定步进电机转速
 311   1       else if(menu_level==2&&selection==2&&key_val==0x0f)       //二级菜单下,确认键
 312   1         {menu_level=3;
 313   2          strcpy(lcd_buf,"PWM:         . %");
 314   2          choice=3;
 315   2          display();
 316   2         }
 317   1        else if(choice==2&&key_val<10)                            //数字键,设PWM值
 318   1         {if(setup_val!=0)
 319   2             {
 320   3              setup_val=0;
 321   3              lcd_buf[12]=' ';lcd_buf[13]=' ';lcd_buf[14]=' ';lcd_buf[15]=' ';//数字清掉从来
 322   3             }
 323   2          lcd_buf[12]=lcd_buf[13];     //数字逐位左移
 324   2          lcd_buf[13]=lcd_buf[14];
 325   2          lcd_buf[14]=lcd_buf[15];
 326   2          lcd_buf[15]='0'+key_val;
 327   2          display();
 328   2         }                                                      //选中Stepper,设定步进电机转速
 329   1       else if(choice==3&&key_val<10)                            //数字键,设定步进电机速度
 330   1         {if(setup_val!=0)
 331   2             {
 332   3              setup_val=0;
 333   3              lcd_buf[11]=' ';lcd_buf[12]=' ';lcd_buf[13]='.';lcd_buf[14]=' ';//数字清掉从来
 334   3             }
 335   2          lcd_buf[11]=lcd_buf[12];     //数字逐位左移
 336   2          lcd_buf[12]=lcd_buf[14];
 337   2          lcd_buf[14]='0'+key_val;
 338   2          display();
 339   2         }
 340   1       else if(choice==2&&key_val==15)                           //步进电机速度设置完毕
 341   1         {
 342   2          for(setup_val=0,ii=0;ii<4;ii++)
 343   2            {if(lcd_buf[12+ii]!=' ')
 344   3               setup_val=setup_val*10+lcd_buf[12+ii]-'0';
 345   3            }
 346   2          stepping_int(setup_val);
 347   2         }
 348   1       else if(choice==3&&key_val==15)                           //步进电机速度设置完毕
 349   1         {if(lcd_buf[11]!=' '){setup_val=(lcd_buf[11]-'0')*100;}
 350   2          if(lcd_buf[12]!=' '){setup_val=setup_val+(lcd_buf[12]-'0')*10;}
 351   2          if(lcd_buf[14]!=' '){setup_val=setup_val+(lcd_buf[14]-'0');}
 352   2          PWM=setup_val;
 353   2         }
 354   1       while(key_port!=0xf0);                                     //等待按键释放
 355   1       delay(100);
 356   1       while(key_port!=0xf0);                                     //等待按键释放
 357   1      }
 358          //----------------------主程序------------------------------
 359          main()
 360          {
 361   1       unsigned char n1=0,n2=0; //命令字的后续两字节
 362   1       unsigned char loop_times=1;//主程序大循环次数,主要用于确定占空比用
 363   1      //unsigned char PWM=0;       //直流电机脉宽调制系数(1到10000)10^-2,精确到0.01%
 364   1                                 //例如PWM=213表示2.13%
 365   1       ini_com();           //串口设置,设波特率19200等
C51 COMPILER V7.20   MOTOR_1_2                                                             04/02/2008 10:14:27 PAGE 7   

 366   1       ini_lcd();           //初始化液晶
 367   1       set_T0T1();          //设置T1,T0: T1定时器作定时100us并控制步进电机,
 368   1                            //           T0作计数以测定直流电机或步进电机转速
 369   1       P1=0;EA=1;ES=1;cmd=0;//初始化,开串口中断
 370   1       DIR=0;
 371   1      
 372   1       strcpy(lcd_buf,"Mechatronics  V1"); //显示题头,版本
 373   1       display();
 374   1       //delay_1s(2);
 375   1      while(1)
 376   1         {key_port=0xf0;
 377   2          if (key_port!=0xf0)
 378   2             {
 379   3              menu();
 380   3             }
 381   2          else if (cmd==0xc0)          //软件分配步进电机,转速n1n2
 382   2             {ES=0;
 383   3              n1=receipt_byte();
 384   3              n2=receipt_byte();
 385   3              stepping_int(n1*256+n2);
 386   3              cmd=0;
 387   3              ES=1;
 388   3             }
 389   2          else if (cmd==0xc3||choice==1)          //测电机转速
 390   2             {
 391   3              if (cmd==0xc3)
 392   3                {
 393   4                 n1=speed/256;
 394   4                 transmit_byte(n1);
 395   4                 n2=speed%256;
 396   4                 transmit_byte(n2);
 397   4                 cmd=0;
 398   4                 }
 399   3              else
 400   3                {
 401   4                 lcd_buf[9]='0'+speed/1000;lcd_buf[10]='0'+(speed%1000)/100;
 402   4                 lcd_buf[11]='0'+(speed%100)/10;lcd_buf[12]='0'+speed%10;
 403   4                 if (count_display>5000)   //0.5秒显示刷新一次,该变量在定时T0(100us)中断中累加
 404   4                   {count_display=0;
 405   5                    display();
 406   5                   }
 407   4                }
 408   3             }
 409   2           else if (cmd==0xc2)         //设直流电机PWM系数
 410   2             {
 411   3              ES=0;
 412   3              n1=receipt_byte();
 413   3              n2=receipt_byte();
 414   3              PWM=n1*256+n2;
 415   3              cmd=0;
 416   3              ES=1;
 417   3             }
 418   2          /*else if (cmd==0xc3);
 419   2          else if (cmd==0xc4);*/
 420   2           else if (cmd==0xc5)         //停止步进电机
 421   2             {
 422   3              stepping_by_T0=0;
 423   3              speed=0;
 424   3              cmd=0;
 425   3             }
 426   2         /*else if (cmd==0xc6)
 427   2            {
C51 COMPILER V7.20   MOTOR_1_2                                                             04/02/2008 10:14:27 PAGE 8   

 428   2             PWM=0;//停止直流电机
 429   2             cmd=0;
 430   2             }*/
 431   2          /*if (loop_times<PWM)
 432   2             DC_MOTOR=1;
 433   2          else
 434   2             DC_MOTOR=0;
 435   2          loop_times++;
 436   2          if (loop_times>100)
 437   2             loop_times=1;
 438   2          //#pragma ASM
 439   2          //mov p1,#00H
 440   2          //#pragma ENDASM */
 441   2         }
 442   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1459    ----
   CONSTANT SIZE    =    142    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     36      15
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       2
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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