自己寫的循跡車循跡程序,多多指教
單片機源程序如下:
- #include <reg52.H>
- #define uchar unsigned char
- #define uint unsigned int
- /*****************延時函數 1ms******************/
- void delay(unsigned int ms)
- {
- unsigned char i;
- while(ms--)
- {
- for(i=0;i<125;i++);
- }
- }
- uchar dianji,dianjiH,dianjiL;
- uchar duoji,duojiH,duojiL,duojiH2,duojiL2,duojiH3,duojiL3;
- sbit IN1=P2^6; // 電機使能控制端
- sbit ENA=P2^7;
- sbit IN2=P2^5;
- sbit pwm=P2^0; // 舵機pwm控制
- sbit Ghg=P2^4; // 干簧管
-
- uint gg,gd,dg,dd,zgg,zgd,zdg,zdd;
- /*****中斷程序1******用于控制舵機偏轉角度******周期20ms*******/
- void timer1() interrupt 1 using 0 //中斷1 T0溢出中斷
- {
- pwm=!pwm; //輸出取反
- if(pwm==0) //
- {
- pwm=0;
- TH0=dg;
- TL0=dd;
- }
- else
- {
- pwm=1;
- TH0=gg;
- TL0=gd;
- }
- }
- /*********中斷程序2****用于控制電機轉速*********/
- void timer2() interrupt 3 using 3 //中斷3 T1溢出中斷,使用工作組3
- {
- IN2=!IN2; // 輸出取反
- if(IN2==0) //
- {
- IN2=0;
- TH1=zdg;
- TL1=zdd;
- }
- else
- {
- IN2=1;
- TH1=zgg;
- TL1=zgd;
- }
- }
- /*&&&&&&&&& (一)此段子函數對舵機方向進行操作&&&&&&&&&&&&&&*/
- /********右轉45度*******高低電位占空比為1.675:18.325ms**********/
- void yz45(void)
- {
- gg=0xf9-duojiH3-(0x74<duojiL3);
- gd=0x74-duojiL3;
- dg=0xb8+duojiH3+(0x6a+duojiL3)/256;
- dd=0x6a+duojiL3;
- TR0=1;
- }
- /******右轉25度******高低電位占空比為1.6:18.4ms*********/
- void yz25(void)
- {
- gg=0xf9-duojiH2-(0xbf<duojiL2); // 63935 65536-63935=1601
- gd=0xbf-duojiL2;
- dg=0xb8+duojiH2+(0x1f+duojiL2)/256;// 47135 65536-47135=18401
- dd=0x1f+duojiL2;
- TR0=1;
-
- }
- /******右轉15度******高低電位占空比為1.55:18.45ms*********/
- void yz15(void)
- {
- gg=0xf9-duojiH-(0xf1<duojiL);
- gd=0xf1-duojiL;
- dg=0xb7+duojiH+(0xed+duojiL)/256;
- dd=0xed+duojiL;
- TR0=1;
-
- }
- /*********復位*****高低電位占空比為1.5ms:18.5ms************/
- void fw(void)
- {
- gg=0xfa;
- gd=0x23;
- dg=0xb7;
- dd=0xbb;
- TR0=1;
- }
- /******左轉15度***********高低電位占空比為1.45:18.55ms***********/
- void zz15(void)
- {
- gg=0xfa+duojiH+(0x55+duojiL)/256;
- gd=0x55+duojiL;
- dg=0xb7-duojiH-(0x89<duojiL);
- dd=0x89-duojiL;
- TR0=1;
-
- }
- /******左轉25度***********高低電位占空比為1.4:18.6ms***********/
- void zz25(void)
- {
- gg=0xfa+duojiH2+(0x87+duojiL2)/256;
- gd=0x87+duojiL2;
- dg=0xb7-duojiH2-(0x57<duojiL2);
- dd=0x57-duojiL2;
- TR0=1;
-
- }
- /********左轉45度*****高低電位占空比為1.325:18.675ms*************/
- void zz45(void)
- {
- gg=0xfa+duojiH3+(0xd2+duojiL3)/256;
- gd=0xd2+duojiL3;
- dg=0xb7-duojiH3-(0x0c<duojiL3);
- dd=0x0c-duojiL3;
- TR0=1;
- }
- /*&&&&&& (二)此段子函數對驅動電機進行操作*/
- void run(void) //前進 高低電位占空比為4:16ms
- {
-
- zgg=0xf0-dianjiH-(0x5f<dianjiL);
- zgd=0x5f-dianjiL;
- zdg=0xc1+dianjiH+(0x7f+dianjiL)/256;
- zdd=0x7f+dianjiL;
-
- }
- void stop(void) //停車
- {
- ENA=1;
- IN1=0;
- IN2=0;
- }
- /***********************主函數****************************/
- void main(void)
- {
-
- unsigned char i=0;
-
- TMOD=0x11; //
- ET0=1; //
- ET1=1; // 中斷初始化
- EA=1; //
- TR0=0; //
- TR1=0;
-
- Ghg=1;
- P0=0XFF; // 單片機端口初始化
- P1=0xff;
- i=P1; //撥碼開關
- dianji=i/16; //
- dianjiH=(150*dianji)/256; // 初始化電機速度 改電機輸出電壓最小值
- dianjiL=(20*dianji)%256; //
-
- duoji=i%16; // 舵機角度
- duojiH=(2*duoji)/256; // 初始值10
- duojiL=(2*duoji)%256; // 初始值10
- duojiH2=(6*duoji)/256; // 初始值 20
- duojiL2=(6*duoji)%256; // 初始值 20
- duojiH3=(10*duoji)/256; // 初始值 33
- duojiL3=(10*duoji)%256; // 初始值 33
- fw();
- // ENA=1; // L298 使能端高有效 控制端狀態不同 狀態相同時 快速停車
- IN1=0;
- // IN2=1;
- run();
- TR1=1;
- /*************************舵機測試程序*************************************
- while(1)
- {
- fw();
- delay(2000);
- yz45();
- delay(2000);
- yz25();
- delay(2000);
- yz25();
- delay(2000);
- delay(2000);
- zz15();
- delay(2000);
- zz25();
- delay(2000);
- zz45();
- delay(2000);
- run();
- }
- } */
- /******************循跡部分**傳感器反*****最左P0.7最右P0.0***************/
- while(1)
- {
- if(Ghg == 0)
- {
- fw();
- stop();
- }
- /************************循跡處理****************************/
- /*P0_0==0 黑道 ..........P0_6==0黑道 從低往高 P0^7到P0^0*/
- if(P0==0xF7) // 1111 0111
- {
- fw();
- }
- else if(P0==0xEF) // 1110 1111
- {
- zz15();
- }
- else if(P0==0XDF)
- {
- zz25();
- }
- else if(P0==0XBF)
- {
- zz45();
- }
- else if(P0==0XFB)
- {
- yz15();
- }
- else if(P0==0XFD)
- {
- yz25();
- }
- else if(P0==0XFE)
- {
- yz45();
- }
- else;
- delay(10);
- run();
- }
- }
復制代碼
所有資料51hei提供下載:
新建文件夾.rar
(38.13 KB, 下載次數: 8)
2019-5-14 11:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|