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