標(biāo)題:
51單片機舵機循黑線小車程序
[打印本頁]
作者:
小餅干吖
時間:
2018-12-8 15:01
標(biāo)題:
51單片機舵機循黑線小車程序
單片機源程序如下:
#include <reg52.h>
sbit pwm = P2^0; //定義舵機p20
sbit ENA = P3^6; //定義驅(qū)動模塊
sbit ENB = P3^7; //
sbit IN1 = P3^0;
sbit IN2 = P3^1;
sbit IN3 = P3^2;
sbit IN4 = P3^3; //定義驅(qū)動模
/*定義光電管,光電管檢測到黑線輸出高電平,否則輸出低電平*/
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)//延時函數(shù),調(diào)節(jié)電機轉(zhuǎn)速
{
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; //舵機輸出小偏轉(zhuǎn)角度 。高電平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))//判斷當(dāng)左邊光電管遇到黑線,
{ //右邊和前邊的光電管遇到白線時左轉(zhuǎn)
zuozhuan();//調(diào)用左轉(zhuǎn)函數(shù)
}
while((zuoz==0)&&(zuo==1)&&(you==0))//判斷當(dāng)右邊光電管遇到黑線,
{ //左邊和前邊的光電管遇到白線時右轉(zhuǎn)
zhengzhuan();//
}
while((zuo==0)&&(you==1)&&(youy==0))//判斷當(dāng)左邊光電管遇到黑線,右邊光電管也遇到黑線
{ //前邊的光電管遇到白線時停止
zhengzhuan();//調(diào)用停止函數(shù)
}
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();
}
}
}
/*以下調(diào)用函數(shù)*/
void timer0(void) interrupt 1//定時器0中斷函數(shù)
{
pwm=1;
TH0=-18432/256;
TL0=-18432%256;
TR1=1;
}
void timer1(void) interrupt 3//定時器1中斷函數(shù)
{
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()//左右輪協(xié)同前進子函數(shù)
{ ENA=1;
ENB=1;
IN1=1;
IN2=0;
IN3=1;
IN4=0;
delay(10-1);//pwm調(diào)速
IN1=0;
IN2=0;
IN3=0;
IN4=0;
delay(1);
}
void zuozhuan()//左右輪協(xié)同左轉(zhuǎn)子函數(shù)
{ ENA=1;
ENB=1;
IN1=0;
IN2=0;
IN3=1;
IN4=0;
delay(10-1);//pwm調(diào)速
IN1=0;
IN2=0;
IN3=0;
IN4=0;
delay(1);
}
void youzhuan()//左右輪協(xié)同右轉(zhuǎn)子函數(shù)
{ ENA=1;
ENB=1;
IN1=1;
IN2=0;
IN3=0;
IN4=0;
delay(10-1);//pwm調(diào)速
IN1=0;
IN2=0;
IN3=0;
IN4=0;
delay(1);
}
void quansu()
{
ENA=1;
ENB=1;
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
復(fù)制代碼
所有資料51hei提供下載:
sad.zip
(1.54 KB, 下載次數(shù): 20)
2018-12-8 15:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1