下面是我之前写的程序51单片机写的和你的一样我的是12Mhz的,里面有很详细的注解。用什么不懂的问题,追问我。
////////////////////////////////////////////////////////////////////////////////////////////
//程序名称:小车循迹程序。
//程序目的:跟着黑线走。
//时 间:2013年10月
/////////////////////////////////////////////////////////////////////////////////////////////
#include
unsigned int int_time; //用于记录 溢出的次数。
sbit PWM=P0^0; //舵机的控制位。
sbit SS1=P2^0; //前面的光感应定义 I/O 口
sbit SS2=P2^1;
sbit SS3=P2^2;
sbit SS4=P2^3;
sbit SS5=P2^4;
sbit M1_in1=P1^0; //电机定义 I/O 口 M1右电机 M2左电机;
sbit M1_in2=P1^1;
sbit M2_in1=P1^2;
sbit M2_in2=P1^3;
/*
void delay(unsigned int N)//延时程序: 实现(16*N+24)us 的延时,11.0592的条件下。N=1000 对应 20ms.
{
int i;
for(i=0;i
}
*/
void init() //初始化中断
{
////100微秒@12.000MHz 0x
TMOD = 0x02; //设置定时器模式
EA=1;
ET0=1;
TF0 =0; //清除TF0标志
TL0 =236; //设置定时初值
TH0 =236; //设置定时重载值
TR0 = 1; //定时器0开始计时
int_time=0;
}
void occupy(int all,int part) //占用宽度,即调节脉宽PWM中高电平的时间占用
{
if(int_time>all) //all表示一个周期所用int_time(中断一次的时间)的次数,
int_time=0;
if(int_time<=part) //part表示一个周期类高电平时所用int_time的次数。
PWM=1;
else
PWM=0;
}
main() //主函数
{
int s1=0,s2=0,s3=0,s4=0,s5=0;
init(); //初始化中断 ||(LED1==1&&LED2==1&&LED3==1&&LED4==1&&LED5==1
while(1)
{
if(SS1==0&&SS2==0&&SS3==0&&SS4==0&&SS5==0) // 当没有检测到黑线时,电机(M1 M2)停止工作。
{
M1_in1=0;
M1_in2=0;
M2_in1=0;
M2_in2=0;
}
while(SS1==1||SS2==1||SS3==1||SS4==1||SS5==1)
{
M1_in1=1;
M1_in2=0;
M2_in1=0;
M2_in2=1;
while(SS1==0&&SS2==1&&SS3==1&&SS4==1&&SS5==1) // 向左转弯时:SS1检测到黑线。
{occupy(1000,60);}
while(SS1==0&&SS2==0&&SS3==1&&SS4==1&&SS5==1) // 向左转弯时:SS1和SS2检测到黑线。
{occupy(1000,85);}
while(SS1==1&&SS2==0&&SS3==1&&SS4==1&&SS5==1) // 向左转弯时:SS2检测到黑线。
{occupy(1000,80);}
while(SS1==1&&SS2==0&&SS3==0&&SS4==1&&SS5==1) // 向左转弯时:SS2和SS3检测到黑线。
{occupy(1000,77);}
while(SS1==1&&SS2==1&&SS3==0&&SS4==1&&SS5==1) // 直线向前时:SS3检测到黑线。 8888888888888
{occupy(1000,75);}
while(SS1==1&&SS2==1&&SS3==0&&SS4==0&&SS5==1) // 向右转弯时:SS3和SS4 检测到黑线。
{occupy(1000,72);}
while(SS1==1&&SS2==1&&SS3==1&&SS4==0&&SS5==1) // 向右转弯时:SS4检测到黑线。
{occupy(1000,70);}
while(SS1==0&&SS2==0&&SS3==1&&SS4==0&&SS5==0) // 向左转弯时:SS4和SS5检测到黑线。
{occupy(1000,65);}
while(SS1==1&&SS2==1&&SS3==1&&SS4==1&&SS5==0) // 向右转弯时:SS5检测到黑线。
{occupy(1000,90);}
}
}
}
void ABC(void) interrupt 1 //进入中断一次,将计数量int_time加1。
{
int_time++;
}
// M2_in1=0;
// M2_in2=1;
// delay(1000);
// M2_in1=0;
// M2_in2=0;
// delay(1000) ;
汇编还是C语音啊?