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

📄 实验5.lst

📁 电机控制板程序修改.机电一体化的实际应用。可操作性强
💻 LST
📖 第 1 页 / 共 2 页
字号:
 236   1       while(TI==0);
 237   1       TI=0;
 238   1       ES=1;
 239   1      }
 240          //-----------------串口中断程序 -------------------------
 241          void com_int() interrupt 4 using 1
C51 COMPILER V7.20   实验5                                                                 05/27/2008 11:09:34 PAGE 5   

 242          {
 243   1       cmd=SBUF;
 244   1       RI=0;
 245   1      }
 246          //--------------写一个字节到液晶------------------------
 247          void lcd_write(bit slr,unsigned char write_dat)
 248          {
 249   1       RS=slr;
 250   1       E=1;
 251   1       lcd_dat_port=write_dat;
 252   1       E=0;
 253   1       delay(2);
 254   1      }
 255          //--------------液晶初始化-----------------------------
 256          void ini_lcd()
 257           {
 258   1        RW=0;
 259   1        delay(10);
 260   1        lcd_write(0,0x38);
 261   1        lcd_write(0,0x0c);
 262   1        lcd_write(0,0x06);
 263   1        lcd_write(0,0x01);
 264   1       }
 265          //-------------------------液晶显示--------------------------
 266          void display()         //将显示缓存lcd_buf[16]的内容显示
 267           {unsigned char ii;
 268   1        lcd_write(0,2);
 269   1        delay(10);
 270   1        for(ii=0;ii<16;ii++)
 271   1         {
 272   2          if (ii==8) lcd_write(0,0xc0);
 273   2          lcd_write(1,lcd_buf[ii]);
 274   2         }
 275   1       }
 276          //-------------- 按键子程序 ----------------------
 277          unsigned char get_key()
 278          {unsigned char key1,key2,ii;
 279   1       key1=key_port;
 280   1       delay(100);       //10ms消抖动
 281   1       if(key1==key_port) //延时10ms后键不变
 282   1         {
 283   2          key_port=0x0f;
 284   2          key2=key_port;
 285   2          key1=key1|key2;
 286   2          key_port=0xf0;
 287   2          for(ii=0;ii<16;ii++)
 288   2            {if(key1==key_index[ii])
 289   3                return(ii);
 290   3            }
 291   2          return(0xff);
 292   2         }
 293   1       else return(0xff);
 294   1      }
 295          //-------------- 菜单 -----------------------
 296          void menu()
 297          {unsigned char key_val,ii;
 298   1       unsigned int setup_val;     //设置值,指步进电机转速设置值或直流电机PWM设置值
 299   1       static unsigned char selection=1;
 300   1       key_val=get_key();          //选择一级菜单,打"*"项为选中项
 301   1       if(key_val==0x0e)  //功能键
 302   1         {
 303   2          menu_level=1;choice=0;selection=1;
C51 COMPILER V7.20   实验5                                                                 05/27/2008 11:09:34 PAGE 6   

 304   2          strcpy(lcd_buf,"Measure*  Setup "); //显示一级菜单
 305   2          display();
 306   2          }
 307   1       else if(menu_level==1&&key_val==0x0c)                     //一级菜单下,左键
 308   1         {selection=1;lcd_buf[7]='*';lcd_buf[15]=' ';display();} //选中Measure,测速菜单项
 309   1       else if(menu_level==1&&key_val==0x0d)                     //一级菜单下,右键
 310   1         {selection=2;lcd_buf[7]=' ';lcd_buf[15]='*';display();} //选中Setup,设转速或脉冲频率
 311   1       else if(menu_level==1 && selection==1 &&key_val==0x0f)    //一级菜单下,选中Measure
 312   1         {
 313   2          choice=1;
 314   2          strcpy(lcd_buf,"Rotation:    r/m");
 315   2          display();
 316   2         }
 317   1       else if(menu_level==1 && selection==2 &&key_val==0x0f) //一级菜单下,选中Setup进入二级菜单
 318   1         {
 319   2          menu_level=2;selection=1;
 320   2          strcpy(lcd_buf,"Step.* DC_motor ");                 //显示二级菜单
 321   2          display();
 322   2         }
 323   1       else if(menu_level==2&&key_val==0x0c)                     //二级菜单下,左键
 324   1         {selection=1;lcd_buf[5]='*';lcd_buf[15]=' ';display();} //选中Step.,设定步进电机
 325   1       else if(menu_level==2&&key_val==0x0d)                     //二级菜单下,右键
 326   1         {selection=2;lcd_buf[5]=' ';lcd_buf[15]='*';display();} //选中DC_motor,设定直流电机
 327   1       else if(menu_level==2&&selection==1&&key_val==0x0f)       //二级菜单下,确认键
 328   1         {menu_level=3;choice=2;strcpy(lcd_buf,"Stepper.rot:    ");display();} //选中Stepper,设定步进电机转速
 329   1       else if(menu_level==2&&selection==2&&key_val==0x0f)       //二级菜单下,确认键
 330   1         {menu_level=3;
 331   2          strcpy(lcd_buf,"PWM:         . %");
 332   2          choice=3;
 333   2          display();
 334   2         }
 335   1        else if(choice==2&&key_val<10)                            //数字键,设PWM值
 336   1         {if(setup_val!=0)
 337   2             {
 338   3              setup_val=0;
 339   3              lcd_buf[12]=' ';lcd_buf[13]=' ';lcd_buf[14]=' ';lcd_buf[15]=' ';//数字清掉从来
 340   3             }
 341   2          lcd_buf[12]=lcd_buf[13];     //数字逐位左移
 342   2          lcd_buf[13]=lcd_buf[14];
 343   2          lcd_buf[14]=lcd_buf[15];
 344   2          lcd_buf[15]='0'+key_val;
 345   2          display();
 346   2         }                                                      //选中Stepper,设定步进电机转速
 347   1       else if(choice==3&&key_val<10)                            //数字键,设定步进电机速度
 348   1         {if(setup_val!=0)
 349   2             {
 350   3              setup_val=0;
 351   3              lcd_buf[11]=' ';lcd_buf[12]=' ';lcd_buf[13]='.';lcd_buf[14]=' ';//数字清掉从来
 352   3             }
 353   2          lcd_buf[11]=lcd_buf[12];     //数字逐位左移
 354   2          lcd_buf[12]=lcd_buf[14];
 355   2          lcd_buf[14]='0'+key_val;
 356   2          display();
 357   2         }
 358   1       else if(choice==2&&key_val==15)                           //步进电机速度设置完毕
 359   1         {
 360   2          for(setup_val=0,ii=0;ii<4;ii++)
 361   2            {if(lcd_buf[12+ii]!=' ')
 362   3               setup_val=setup_val*10+lcd_buf[12+ii]-'0';
 363   3            }
 364   2          stepping_int(setup_val);
 365   2         }
C51 COMPILER V7.20   实验5                                                                 05/27/2008 11:09:34 PAGE 7   

 366   1       else if(choice==3&&key_val==15)                           //直流电机PWM设置完毕
 367   1         {if(lcd_buf[11]!=' '){setup_val=(lcd_buf[11]-'0')*100;}
 368   2          if(lcd_buf[12]!=' '){setup_val=setup_val+(lcd_buf[12]-'0')*10;}
 369   2          if(lcd_buf[14]!=' '){setup_val=setup_val+(lcd_buf[14]-'0');}
 370   2          PWM=setup_val/2;
 371   2         }
 372   1       while(key_port!=0xf0);                                     //等待按键释放
 373   1       delay(100);
 374   1       while(key_port!=0xf0);                                     //等待按键释放
 375   1      }
 376          //----------------------主程序------------------------------
 377          main()
 378          {
 379   1       unsigned char n1=0,n2=0; //命令字的后续两字节
 380   1       unsigned char loop_times=1;//主程序大循环次数,主要用于确定占空比用
 381   1      //unsigned char PWM=0;       //直流电机脉宽调制系数(1到10000)10^-2,精确到0.01%
 382   1                                 //例如PWM=213表示2.13%
 383   1       ini_com();           //串口设置,设波特率19200等
 384   1       ini_lcd();           //初始化液晶
 385   1       set_T0T1();          //设置T1,T0: T1定时器作定时100us并控制步进电机,
 386   1                            //           T0作计数以测定直流电机或步进电机转速
 387   1       P1=0;EA=1;ES=1;cmd=0;//初始化,开串口中断
 388   1       DIR=0;
 389   1      
 390   1       strcpy(lcd_buf,"Mechatronics  V1"); //显示题头,版本
 391   1       display();
 392   1       //delay_1s(2);
 393   1      while(1)
 394   1         {key_port=0xf0;
 395   2          if (key_port!=0xf0)
 396   2             {
 397   3              menu();
 398   3             }
 399   2          else if (cmd==0xc0)          //软件分配步进电机,转速n1n2
 400   2             {
 401   3              ES=0;
 402   3              n1=receipt_byte();
 403   3              n2=receipt_byte();
 404   3              stepping_int(n1*256+n2);
 405   3              cmd=0;
 406   3              ES=1;
 407   3             }
 408   2          else if (cmd==0xc3||choice==1)          //测电机转速
 409   2             {
 410   3              if (cmd==0xc3)
 411   3                {
 412   4                 n1=speed/256;
 413   4                 transmit_byte(n1);
 414   4                 n2=speed%256;
 415   4                 transmit_byte(n2);
 416   4                 cmd=0;
 417   4                 }
 418   3              else
 419   3                {
 420   4                 lcd_buf[9]='0'+speed/1000;lcd_buf[10]='0'+(speed%1000)/100;
 421   4                 lcd_buf[11]='0'+(speed%100)/10;lcd_buf[12]='0'+speed%10;
 422   4                 if (count_display>5000)   //0.5秒显示刷新一次,该变量在定时T0(100us)中断中累加
 423   4                   {count_display=0;
 424   5                    display();
 425   5                   }
 426   4                }
 427   3             }
C51 COMPILER V7.20   实验5                                                                 05/27/2008 11:09:34 PAGE 8   

 428   2           else if (cmd==0xc2)         //设直流电机PWM系数
 429   2             {
 430   3              ES=0;
 431   3              n1=receipt_byte();
 432   3              n2=receipt_byte();
 433   3              ES=1;
 434   3              PWM=n1*256+n2;
 435   3              PWM=PWM/2;
 436   3              cmd=0;
 437   3             }
 438   2          /*else if (cmd==0xc3);
 439   2          else if (cmd==0xc4);*/
 440   2           else if (cmd==0xc5)         //停止步进电机
 441   2             {
 442   3              stepping_by_T0=0;
 443   3              /*speed=0;*/
 444   3              cmd=0;
 445   3             }
 446   2         /*else if (cmd==0xc6)
 447   2            {
 448   2             PWM=0;//停止直流电机
 449   2             cmd=0;
 450   2             }*/
 451   2          /*if (loop_times<PWM)
 452   2             DC_MOTOR=1;
 453   2          else
 454   2             DC_MOTOR=0;
 455   2          loop_times++;
 456   2          if (loop_times>100)
 457   2             loop_times=1;
 458   2          //#pragma ASM
 459   2          //mov p1,#00H
 460   2          //#pragma ENDASM */
 461   2         }
 462   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1505    ----
   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 + -