單片機源程序如下:
- #include <reg52.h>
- sbit pwm = P2^0; //定義舵機p20
- sbit ENA = P3^6; //定義驅動模塊
- sbit ENB = P3^7; //
- sbit IN1 = P3^0;
- sbit IN2 = P3^1;
- sbit IN3 = P3^2;
- sbit IN4 = P3^3; //定義驅動模
- /*定義光電管,光電管檢測到黑線輸出高電平,否則輸出低電平*/
- sbit zuoz = P2^7; //定義最左邊 光電
- sbit zuo = P2^6; //定義中左邊 光電
- sbit you = P2^5; //定義中右邊 光電
- sbit youy = P2^4; //定義最右邊光電模塊
- unsigned int sum1 = 0; //定義幾個光電管的和1
- unsigned int sum2= 0; //定義幾個光電管的和2
- unsigned int i ;
- void zhengzhuan(); //前進
- void tingzhi(); //停止
- void youzhuan();
- void zuozhuan();
- void quansu();
- void InitTimer();
- typedef unsigned int uint;
- typedef unsigned char uchar;
- void delay_ms(uint x)
- {
- uint i;
- while(x--)
- for(i=0;i<125;i++);
- }
- void delay(int z)//延時函數,調節電機轉速
- {
- int i,j;
- for(i=2;i>0;i--)
- for(j=z;j>0;j--);
- }
- void InitTimer(void)
- {
- TMOD=0x11;//開定時器0,1
- TH0=-18432/256;//定時20MS,20MS為一個周期
- TL0=-18432%256;
- TH1=-1382/256;//定時1.5MS,這時舵機處于0度
- TL1=-1382%256;
- EA=1;//開總斷
- TR0=1;//開定時器0
- ET0=1;
- TR1=1;//開定時器1
- ET1=1;
- }
- //輸出PWM信號
- uint pwm_value=1382; //初值為1.5ms
- uint value[]={1150,1290,1382,1474,1580,};//定義1.2ms,1.4ms,1.5ms,1.6ms,1.75ms;
- void main()
- {
- while(1)
- {
- uint j;
- InitTimer();
- pwm_value=1382;
- sum1=zuoz&zuo&you&youy;
- sum2=zuoz|zuo|you|youy;
- if(zuoz==1&&zuo==0)
- j=0;
- else if(zuo==1&&you==0&&zuoz==0)
- j=1;
- else if(you==1&&zuo==0&&youy==0)
- j=2;
- else if(youy==1&&you==0)
- j=3 ;
- else if(sum1==1) //所有光電管輸出高電平,停止
- j=4;
- else if(sum2==0) //所有光電管輸出低電平,前進
- j=5;
- else j= 6 ;
- switch(j)
- {
- case 0: pwm_value=value[4]; delay_ms(100);break; //舵機輸出小偏轉角度 。高電平1.3ms
- case 1: pwm_value=value[3]; delay_ms(50);break;
- case 2: pwm_value=value[1]; delay_ms(50);break;
- case 3: pwm_value=value[0]; delay_ms(100);break;
- case 4: pwm_value=value[2]; delay_ms(50);break;
- case 5: pwm_value=value[2]; delay_ms(50);break;
- default : break;
-
- }
-
- while((zuoz==1)&&(zuo==0))//判斷當左邊光電管遇到黑線,
- { //右邊和前邊的光電管遇到白線時左轉
- zuozhuan();//調用左轉函數
- }
- while((zuoz==0)&&(zuo==1)&&(you==0))//判斷當右邊光電管遇到黑線,
- { //左邊和前邊的光電管遇到白線時右轉
- zhengzhuan();//
- }
- while((zuo==0)&&(you==1)&&(youy==0))//判斷當左邊光電管遇到黑線,右邊光電管也遇到黑線
- { //前邊的光電管遇到白線時停止
- zhengzhuan();//調用停止函數
- }
- while((you==0)&&(youy==1))
- {
- youzhuan();
- }
- while((zuo==0)&&(zuoz==0)&&(you==0)&&(youy==0))
- {
- zhengzhuan();
- }
- while((zuo==1)&&(zuoz=1)&&(you==1)&&(youy==1))
- {
- tingzhi();
-
- }
- }
-
- }
- /*以下調用函數*/
-
- void timer0(void) interrupt 1//定時器0中斷函數
- {
- pwm=1;
- TH0=-18432/256;
- TL0=-18432%256;
- TR1=1;
- }
- void timer1(void) interrupt 3//定時器1中斷函數
- {
- pwm=0;
- TH1=-pwm_value/256;
- TL1=-pwm_value%256;
- TR1=0;
- }
- void tingzhi()
- {
- ENA=1;
- ENB=1;
- IN1=0;
- IN2=0;
- IN3=0;
- IN4=0;
- }
-
- void zhengzhuan()//左右輪協同前進子函數
- { ENA=1;
- ENB=1;
- IN1=1;
- IN2=0;
- IN3=1;
- IN4=0;
- delay(10-1);//pwm調速
- IN1=0;
- IN2=0;
- IN3=0;
- IN4=0;
- delay(1);
- }
- void zuozhuan()//左右輪協同左轉子函數
- { ENA=1;
- ENB=1;
- IN1=0;
- IN2=0;
- IN3=1;
- IN4=0;
- delay(10-1);//pwm調速
- IN1=0;
- IN2=0;
- IN3=0;
- IN4=0;
- delay(1);
- }
- void youzhuan()//左右輪協同右轉子函數
- { ENA=1;
- ENB=1;
- IN1=1;
- IN2=0;
- IN3=0;
- IN4=0;
- delay(10-1);//pwm調速
- IN1=0;
- IN2=0;
- IN3=0;
- IN4=0;
- delay(1);
- }
- void quansu()
- {
- ENA=1;
- ENB=1;
- IN1=1;
- IN2=0;
- IN3=1;
- IN4=0;
- }
復制代碼
所有資料51hei提供下載:
sad.zip
(1.54 KB, 下載次數: 20)
2018-12-8 15:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|