📄 motor_1_2.lst
字号:
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 + -