|
楼主 |
发表于 2010-5-6 13:30:08
|
显示全部楼层
程序:#include <reg52.h>
#include <math.h>
#include <bin.h> //包含二进制转十六宏定义文件:如#define b0000_0001 0x01
/********************************
芯片:AT89S52 频率:24.576mhz
编写:wjd
********************************/
unsigned char VL,VR,tt; //定义全局变量:VL,VR为左右电机速度,tt为pwm时间
/*定义电机控制端*/
sbit MLP=P2^0; //左电机使能
sbit MRP=P2^1; //右电机使能
sbit MLG=P2^2; //左电机前进
sbit MLB=P2^3; //左电机后退
sbit MRG=P2^4; //右电机前进
sbit MRB=P2^5; //右电机后退
/*定义红外传感器*/
sbit SR2=P3^0; //
sbit SR1=P3^1; //左一和右一在黑线上
sbit SL1=P3^2; //
sbit SL2=P3^3; //
void M(int l,r) //电机控制函数
{ //l,r分别为左右电机速度
if(l<0) //速度范围:“-9~0~+9”整数
{MLG=0;MLB=1;}
else
{
if(l==0)
{MLG=1;MLB=1;l=9;}
else
{MLG=1;MLB=0;}
}
if(r<0)
{MRG=0;MRB=1;}
else
{
if(r==0)
{MRG=1;MRB=1;r=9;}
else
{MRG=1;MRB=0;}
}
VL=abs(l);
VR=abs(r);
}
void init(void) //初始化变量和端口
{
VL=0;
VR=0;
MLP=1;
MRP=1;
MRG=0;
MLG=0;
MRB=0;
MLB=0;
P3=0xFF;
tt=0;
}
void InitTimer0(void) //定时器0初始化
{
TMOD = 0x01;
TH0 = 0x0FF;
TL0 = 0x0EC;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0Interrupt(void) interrupt 1 //定时器0中断(PWM)
{
TH0 = 0x0F8;
TL0 = 0x00;
if(tt==9)
{
tt=0;
MLP=1;
MRP=1;
}
else
{
if(VL==tt)MLP=0;
if(VR==tt)MRP=0;
}
tt++;
}
void follow_line(void) //循线控制函数
{
switch(P3|0xf0) //“P3|0xf0”低四位代表四个传感器
{
case b1111_1001:M(8,8);break;
case b1111_1111:M(8,8);break;
case b1111_1101:
{M(8,7);}
while(SL1&&SR1==1)
{M(5,0);}break;
case b1111_1011:
{M(7,8);}
while(SL1&&SR1==1)
{M(0,5);}break;
case b1111_1110:
M(4,-4);
while(SL1&&SR1==1)
{}break;
case b1111_0111:
M(-4,4);
while(SL1&&SR1==1)
{}break;
default:M(0,0) ;
}
}
void main() //主函数
{
init();
InitTimer0();
while(1)
{
follow_line(); //循线
/*+其它程序*/
}
}
本贴被 wjd40 编辑过,最后修改时间:2010-04-17,18:17:28.
http://www.ourdev.cn/bbs/bbs_con ... d40&bbs_id=9999 |
|