读书人

跪求小汽车走矩形程序

发布时间: 2013-01-21 10:15:38 作者: rapoo

跪求小车走矩形程序
#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;
}
这些是我目前的函数,请大神指教
[解决办法]
咦?C51的啊?

出什么问题了呢?

读书人网 >C++ Builder

热点推荐