自己写的循迹车循迹程序,多多指教
单片机源程序如下:
- #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)
|