本帖最后由 **kfu 于 2012-3-16 22:21 编辑
具体的这个函数没有问题
把全部代码帖上来
ayb_ice 发表于 2012-3-16 09:07 
我的这个是个用串口发指令,控制小车的程序,出问题的就在红色字体的部分,首先说明下,下面的程序是没有问题的,可为正常运行,我的问题就是 当我把红色部分的代码换成对应的函数时候就不管用了。对应的函数就是左转,右转,后退那几个函数。
#include<at89x51.h>
#include<stdio.h>
#define uchar unsigned char
/***************************************************************************
* DIR1 和 PWM1控制左边电机
* DIR2 和 PWM2控制右边电机
* DIR为方向控制(控制正反转),PWM为使能信号(1为运转,0为停止)
* 下面为左边电机的状态表(右边电机也是如此):
—————————————————————————
DIR1 PWM1 状态
—————————————————————————
0 1 正转
—————————————————————————
0 0 停
—————————————————————————
1 1 反转
—————————————————————————
1 0 停
—————————————————————————
****************************************************************************/
#define DIR1 P2_0
#define PWM1 P2_1
#define DIR2 P2_2
#define PWM2 P2_3
void delayMS(uchar t);//延时
void go_forward(); //前走
void go_back();//后退
void turn_left();//左转
void turn_right();//右转
void stop(); //停
void main(void)
{
uchar xdata rcvdata[1];
EA=1; //开启总中断
SCON = 0x50; //串口方式1,允许接收
TMOD=0X21;
TH1 = 0xFD; //11.0592MHZ 9600 波特率
TL1 = 0xFD;
TR1 = 1; //启动定时器1
EX0=1; //开启外部中断 0,即P32引脚
IT0=0; //设置成 低电平触发方式,IT0=1为下降沿触发
PWM1=0;//防止小车上电就开始跑
PWM2=0;
while(1)
{
rcvdata[0]=0;
if(RI)
{
rcvdata[0]=SBUF;//把接收到的数据保存
RI=0;
SBUF=rcvdata[0];
if(SBUF=='1')
go_forward();
if(SBUF=='2')
go_back();
if(SBUF=='3')
turn_left();
if(SBUF=='4')
turn_right();
if(SBUF=='5')
stop();
//把收到的数据通过串口发送出去
while(!TI);
TI=0;
}
}
}
/***************************************************************************
*外部中断 0 C51中断号1 0的优先级最高,关键字"interrupt" , 这是C语言的中断函数表示法
*本中断的响应是P32引脚有低电平触发
****************************************************************************/
void int_0() interrupt 0
{
// 后退防止碰住障碍物
DIR1=1;
PWM1=1;
DIR2=1;
PWM2=1;
delayMS(1000);
//左转
DIR1=1;
PWM1=1;
DIR2=0;
PWM2=1;
delayMS(1000);
//继续向前走
DIR1=0;
PWM1=1;
DIR2=0;
PWM2=1;
delayMS(1000);
}
void go_forward() //前走
{
DIR1=0;
PWM1=1;
DIR2=0;
PWM2=1;
printf("go_forward");
}
void go_back()//后退
{
DIR1=1;
PWM1=1;
DIR2=1;
PWM2=1;
printf("go_back");
}
void turn_left()//左转
{
DIR1=1;
PWM1=1;
DIR2=0;
PWM2=1;
printf("turn_left");
}
void turn_right()//右转
{
DIR1=0;
PWM1=1;
DIR2=1;
PWM2=1;
printf("turn_right");
}
void stop()//停
{
DIR1=0;
PWM1=0;
DIR2=0;
PWM2=0;
printf("stop");
}
void delayMS(uchar t)//延时
{
uchar i;
while(t--)
for(i=0;i<120;i++);
}
|