📄 实验5.lst
字号:
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 + -