小车的单片机源程序如下:
- #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)
|