新聞中心

智能小車C語言程序

作者: 時(shí)間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
智能小車黑線循跡C語言程序
#include
#include
#define uchar unsigned char
#define uint unsigned int

sbit LeftIR=P1^6; //左邊紅外接收
sbit RightIR=P1^7; //右邊紅外接收
sbit ENA=P1^2; // L298的Enable A
sbit IN1=P1^0; // L298的Input 1
sbit IN2=P1^1; // L298的Input 2
sbit ENB=P1^5; // L298的Enable B
sbit IN3=P1^3; // L298的Input 3
sbit IN4=P1^4; // L298的Input 4
uchar t=0; //中斷計(jì)數(shù)器
uchar motor_1=0,motor_2=0; //電機(jī)1,2速度值
uchar tmp1,tmp2; // 電機(jī)當(dāng)前速度值
uchar aa; //定時(shí)器1中斷計(jì)數(shù)
bit flag=0; //標(biāo)志位


void motor(uchar index, char speed)
{
if(speed>=-100 && speed<=100)
{
if(index==1) // 電機(jī)1的處理
{
motor_1=abs(speed); // 取速度的絕對(duì)值
if(speed<0) // 速度值為負(fù)則反轉(zhuǎn)
{
IN1=0;
IN2=1;
}
else // 不為負(fù)數(shù)則正轉(zhuǎn)
{
IN1=1;
IN2=0;
}
}
if(index==2) // 電機(jī)1的處理
{
motor_2=abs(speed); // 取速度的絕對(duì)值
if(speed<0) // 速度值為負(fù)則反轉(zhuǎn)
{
IN3=0;
IN4=1;
}
else // 不為負(fù)數(shù)則正轉(zhuǎn)
{
IN3=1;
IN4=0;
}
}
}
}
void init()
{
TMOD=0x12; // 設(shè)定T0的工作模式為2
TH0=0x9B; // 裝入定時(shí)器的初值
TL0=0x9B;
TH1=(65536-50000)/256; //設(shè)置初值定時(shí)50ms
TL1=(65536-50000)%6;
EA=1; // 開中斷
ET0=1; // 定時(shí)器0允許中斷
ET1=1; //定時(shí)器1允許中斷
TR0=0; // 關(guān)閉定時(shí)器0
TR1=0; // 關(guān)閉定時(shí)器0
ENA=0; //關(guān)閉電機(jī)1
ENB=0; //關(guān)閉電機(jī)2
}
void main()
{
int irDetectLeft,irDetectRight;
init();
while(1)// 電機(jī)實(shí)際控制演示
{
irDetectRight = RightIR;//右邊接收
irDetectLeft = LeftIR;//左邊接收
if((irDetectLeft==0)&&(irDetectRight==0))//向前進(jìn)
{
motor(1,100);
motor(2,100);
}
if((irDetectLeft==0)&&(irDetectRight==1))//右轉(zhuǎn)
{
motor(1,-100);
motor(2,100);
}
if((irDetectLeft==1)&&(irDetectRight==0))//左轉(zhuǎn)
{
motor(1,100);
motor(2,-100);
}
if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==0)) //第一次探測定時(shí)器1開始計(jì)時(shí)
{
motor(1,100);
motor(2,100);
TR1=1;
}
if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==1))//第二次探測時(shí)小車停
{
TR0=0;
ENA=0;
ENB=0;
}
}
}
void timer0() interrupt 1 // T0中斷服務(wù)程序
{
if(t==0) // 1個(gè)PWM周期完成后才會(huì)接受新數(shù)值
{
tmp1=motor_1;
tmp2=motor_2;
}
if(t ENA=1;
else
ENA=0; // 產(chǎn)生電機(jī)1的PWM信號(hào)
if(t ENB=1;
else
ENB=0; // 產(chǎn)生電機(jī)2的PWM信號(hào)
t++;
if(t>=100)
t=0; // 1個(gè)PWM信號(hào)由100次中斷產(chǎn)生
}
void timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%6;
aa++;
if(aa==40) //定時(shí)2s后小車開始運(yùn)動(dòng)
TR0=1;
if(aa==60) //定時(shí)3s后置標(biāo)志位
{
aa=0;
flag=1;
}
}


關(guān)鍵詞: 智能小車C語言程

評(píng)論


技術(shù)專區(qū)

關(guān)閉