跪求小车走矩形程序
#include "reg51.h"
sbit J14 = P1^1;//右轮
sbit J15 = P1^2;//右轮
sbit J16 = P1^3; //左轮
sbit J17 = P1^4; //左轮
sbit k4 = P3^4;
sbit J6 = P2^1;//产生38.5khz
//sbit k3 = P3^3;
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//控制显示的数字
unsigned char P2data[]={0xef,0xdf,0xbf,0x7f};//控制显示的数字出现的位置
void forward(char v,unsigned int m);
void back();
void left(unsigned char d);
void right();
void stop();
void delaynms(int t);
void show(unsigned int k);
unsigned int n = 0,n_left=0,n_right=0;//n_left=0记脉冲
// unsigned int msec = 0,sec = 0 ;
/*定时器T0的中断服务函数*/
/*void timer_t0()interrupt 1
{
TH0 = 0xb1; //1ms,周期是2ms,高电平1ms,低电平1ms
TL0 = 0xe0;
// msec++;
sound = !sound;
}
*/
void timer_t1()interrupt 3 //定时器T1
{
EA=0;
J6=!J6;//产生38.5khz的信号,
EA=1;
}
void int_0()interrupt 0
{
n_left++; //光栅盘次数.
}
void int_1()interrupt 2
{
n_right++;
}
/*************主函数************/
void main()
{
TMOD = 0x21;
TH0 = 0xb1;//延时1次10ms ,周期是20ms
TL0 = 0xe0;
TH1=TL1=0xe6;//初始值为230
ET1 = 1;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA = 1;
TR1 = 1;
while(1)
{
if(k4==0)
show(n_left/10); //除以40得到真实的转速
else
show(n_right/10);
forward(10,10);
}
}
/*************前进函数************/
void forward(char v,unsigned int m) //1:100变速箱,转1圈,电机转100次,光栅盘挡400次,m为距离参数.
{
/*J14 = 0;J15 = 1; //右电机,
J16 = 0;J17 = 1; //左电机
delaynms(10);
J16 = 1,J17 = 1; //关闭左电机, 让右电机先启动
delaynms(44); //delayms(43);时向右偏,而delayms(44); 却又向左偏,
J14 = 0;
//delaynms(100);
J15 = 1;
delaynms(3);
J16 = 0;J17 = 1;
delaynms(70);
}*/
n_left = n_right = 0;//计数器清零
while(n_left<(m*43))//m*43不能大于65536,走m的距离光栅实际被挡的次数 (转成长整形 2的32次方 4 294 967 296)
{
J14 = 0;J15 = 1; //右电机
J16 = 0;J17 = 1;//左电机
delaynms(v);
J14 = 1;J15 = 1; //右电机,1停止0前进
delaynms(n);//前面定义n的值,全局变量,调节n修正小车走直线
J16 = 1;J17 = 1;//左电机
delaynms(20-v);
}
}
/*************后退函数************/
void back()
{
J14 = 1;J15 = 0;//右电机
J16 = 1;J17 = 0; //左电机
}
/*************左转函数************/
void left(unsigned char d) //角度 (0-180)
{
n_left = n_right = 0;
while(n_right<(10*d)) //可加修正值 1两边同乘10,2在d后面加参数
{
J14 = 1;J15 = 1;
J16 = 0;J17 = 1;
}
J14 = 1;J15 = 1;
J16 = 1;J17 = 1;//停止
}
/*************右转函数************/
void right()
{
J14 = 0;J15 = 1;
J16 = 1;J17 = 0;
}
/*************停止函数************/
void stop()
{
J14 = 1; J15 = 1;
J16 = 1; J17 = 1;
}
/*************延时函数************/
void delaynms( int t)
{
int i;
for(i=0;i<t;i++)
{
TH0 = 0xfc;
TL0 = 0x18; //24mhz晶振,产生1ms
TR0 = 1; //启动T0
while(TF0==0);// (!TF1)
TF0=0;
}
}
/*************显示函数************/
void show(unsigned int k)
{
int i = 0;
for(i = 0;i < 4;i++)
{
P2=P2data[i];
P0=led[k%10];
delaynms(1);
P0=0xff;
k=k/10;
}
这些是我目前的函数,请大神指教