小車的單片機源程序如下:
- #include<reg52.h>
- ////////////電機轉動
- sbit P30=P2^0;
- sbit P31=P2^1;
- sbit P32=P2^2;
- sbit P33=P2^3;
- /////////pwm調試使能端
- sbit ENA=P0^0;
- sbit ENB=P0^1;
- ////////////四路循跡
- sbit P10=P1^7;
- sbit P11=P1^6;
- sbit P12=P1^5;
- sbit P13=P1^4;
- ////////////////
- #define Right_moto_pwm P0^0 //接驅動模塊ENA使能端輸入PWM信號調節速度
- void delay(unsigned int t); //函數聲明
- #define Left_moto_pwm P0^1 //接驅動模塊ENB使能端輸入PWM信號調節速度
- void Init_Timer0(void);//定時器初始化
-
- ///////////////定義電機轉動方向
- #define Left_moto_back {P30=1,P31=0;} //左電機后退
- #define Left_moto_go {P30=0,P31=1;} //左電機前進
- #define Left_moto_stop {P30=1,P31=1;} //左電機停轉
- #define Right_moto_back {P32=1,P33=0;} //右電機后退
- #define Right_moto_go {P32=0,P33=1;} //右電機前轉
- #define Right_moto_stop {P32=1,P33=1;} //右電機停轉
- //////////////////////////////
- #define uchar unsigned char
- #define uint unsigned int
- /////////////////////////////
- uchar pwm_val_left =0;
- uchar push_val_left =0; //左電機占空比N/10
- uchar pwm_val_right =0;
- uchar push_val_right=0; //右電機占空比N/10
- bit Right_moto_stp=1;
- bit Left_moto_stp =1;
- uint num,i,d,j=0;
- /****************************************************************
- ********/
- void run(void) //前進函數
- {
- push_val_left =17; //PWM 調節參數1-20 1為最慢20是最快 改這個值可以改變其速度
- push_val_right =17; //PWM 調節參數1-20 1為最慢20是最快 改這個值可以改變其速度
- Left_moto_go ; //左電機前進
- Right_moto_go ; //右電機前進
- }
- void run1(void)//前進函數1
- {
- push_val_left =4.8; //PWM 調節參數1-20 1為最慢20是最快 改這個值可以改變其速度
- push_val_right =4.8; //PWM 調節參數1-20 1為最慢20是最快 改這個值可以改變其速度
- Left_moto_go ; //左電機前進
- Right_moto_go ; //右電機前進
- }
- void run2(void)//前進函數1
- {
- push_val_left =21; //PWM 調節參數1-20 1為最慢20是最快 改這個值可以改變其速度
- push_val_right =21; //PWM 調節參數1-20 1為最慢20是最快 改這個值可以改變其速度
- Left_moto_go ; //左電機前進
- Right_moto_go ; //右電機前進
- }
- /****************************************************************
- ********/
- void left(void) //左轉函數
- {
- push_val_left =19;
- push_val_right =19;
- Right_moto_go; //右電機繼續
- Left_moto_stop; //左電機停走
- }
- void left1(void) //左轉函數 1
- {
- push_val_left =20;
- push_val_right =20;
- Right_moto_go; //右電機繼續
- Left_moto_stop; //左電機停走
- }
- /*************************************** *********************************/
- void right(void) //右轉函數
- {
- push_val_left =19;
-
- push_val_right =19;
- Right_moto_stop; //右電機停走
- Left_moto_go; //左電機繼續
- }
- void right1(void) //右轉函數1
- {
- push_val_left =20;
- push_val_right =20;
- Right_moto_stop; //右電機停走
- Left_moto_go; //左電機繼續
- }
- ///////////////////////////////////////////////////////////////停止
- void stop(void)
- {
- Right_moto_stop; //右電機停走
- Left_moto_stop; //左電機停走
- //run();
- //
- //Delayms(100);
- }
- ///////////////////////////////////////////
- void zzhijiao()
- {
- push_val_left =19;
-
- push_val_right =19;
-
- Left_moto_go ; //左電機前進
-
- Right_moto_back ;
- }
- ///////////////////////////////////////
- void yzhijiao()
- {
- push_val_left =19;
- push_val_right =19;
-
- Left_moto_back ; //左電機前進
-
- Right_moto_go ;}
- /*************************PWM調 制 電 機 轉 速
- ********************************/
- void pwm_out_left_moto(void) //左電機調速,調節push_val_left的值改變電機轉速,占空比
- {
- if(Left_moto_stp)
- {
- {if(pwm_val_left<=push_val_left)
- { ENB=1;}
- else
- {ENB=0;}
- }
- {if(pwm_val_left>=20)
- {pwm_val_left=0;}
- }
- }
- else
- {ENB=0;}
- }
- void pwm_out_right_moto(void) //右電機調速,調節push_val_left的值改變電機轉速,占空比
- {
- if(Right_moto_stp)
- {
- if(pwm_val_right<=push_val_right)
- {ENA=1;}
- else
- {ENA=0;}
- if(pwm_val_right>=20)
- {pwm_val_right=0;}
- }
- else
- {ENA=0;}
-
- }
- /***************************************************/
- void xunji()
- {
- uchar a=0,b=0;
-
- if( P10==1&&P11==1&&P12==1&&P13==1)
- {
- i++;
- }
- if( P10==0&&P11==0&&P12==0&&P13==0)
- {
- run();
- }
- if( P10==0&&P11==0&&P12==1&&P13==0||P10==0&&P11==0&&P12==0&&P13==1)
- {
- right();
- }
- if( P10==0&&P11==1&&P12==0&&P13==0||P10==1&&P11==0&&P12==0&&P13==0)
- {
- left();
- }
- if( P10==1&&P11==1&&P12==1&&P13==1&&i>=500) //600
- {
- j++;
- }
- while(j==2)
- {
- if( P10==0&&P11==0&&P12==0&&P13==0)
- {
- run1();
- }
-
- if( P10==0&&P11==0&&P12==1&&P13==0||P10==0&&P11==0&&P12==0&&P13==1)
- {
- right();
- }
- if( P10==1&&P11==1&&P12==0&&P13==0||P10==1&&P11==1&&P12==1&&P13==0)
- {
-
- yzhijiao();
- a++;
- }
- if( P10==0&&P11==0&&P12==1&&P13==1||P10==0&&P11==1&&P12==1&&P13==1)
- {
- zzhijiao();
- d++;
-
- }
- if( P10==0&&P11==1&&P12==0&&P13==0||P10==1&&P11==0&&P12==0&&P13==0)
- { left();}
-
-
- if(a+d>=2400)
- {
- if( P10==0&&P11==0&&P12==0&&P13==0)
- {
- run2();
- }
- if( P10==0&&P11==0&&P12==1&&P13==0||P10==0&&P11==0&&P12==0&&P13==1)
- {
- right1();
- }
- if( P10==0&&P11==1&&P12==0&&P13==0||P10==1&&P11==0&&P12==0&&P13==0)
- {
- left1();
- }
- if( P10==1&&P11==1&&P12==1&&P13==1) //600
- {
- stop();
-
- }
- }
- }
-
-
- }
-
- /***********TIMER0中斷服務子函數產生PWM信號**********/
- void Init_Timer0()interrupt 1 using 2
- {
-
- TH0=0XFC; //2Ms定時
- TL0=0X30;
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
循跡小車.rar
(24.16 KB, 下載次數: 489)
2017-10-27 22:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|