如何在小车任务板上添加一个转向灯指令?
首先打开HARDWARE目录下的tba.c(任务板的程序)79行的任务板转向灯控制函数,代码如下:
/**
函数功能: 任务板转向灯控制
参 数:LorR L_LED--左转向灯 R_LED--右转向灯
swch SET -- 开 RESET--关
返 回 值: 无
*/
void Set_tba_WheelLED(uint8_t LorR,uint8_t swch)//第一个形参:左转向灯还是右转向灯 第二个形参:转向灯开启还是关闭
{
switch(LorR)
{
case L_LED: //左转向灯
if(swch) //如果swch等于SET(SET!=0始终为真,右击SET进入SET的定义可查看。definition:定义),代表左转向灯打开
GPIO_ResetBits(GPIOH,GPIO_Pin_10); //如果成立,清除GPIOH第10个端口,即让灯亮。 reset:清零、重置
else
GPIO_SetBits(GPIOH,GPIO_Pin_10); //否则,就让端口10的灯灭
break;
case R_LED: //右转向灯
if(swch)
GPIO_ResetBits(GPIOH,GPIO_Pin_11); //如果成立,清除GPIOH第11个端口,即让灯灭。 reset:清零、重置
else
GPIO_SetBits(GPIOH,GPIO_Pin_11); //否则,就让端口11的灯灭
break;
}
}
右击SET(81行左右,在注释里),点击Go To Definition Of 'SET',进入到下列函数:
观察857行,我们发现,RESET被赋值为0,SET被赋值为非0 。
右击L_LED,点击Go To Definition Of 'L_LED',进入到tba.h里。
将#include "sys.h" 添加到tba.h里。如下图:
首先确定任务板操作的是哪几个端口,如何确定?通过任务板转向灯控制函数的下面这两条语句确定
if(swch) //如果swch等于SET(即1),代表左转向灯打开
GPIO_ResetBits(GPIOH,GPIO_Pin_10); //清除GPIOH第10个灯清零
可以看到左转是对GPIOH第10个灯清零,于是我们打开sys.h(右击上一张图片里的sys.h,点击 open document "sys.h")的第55行,如下
复制#define PHout(n),粘贴到tba.h里,并将这个端口宏定义为一个变量:
#define Tba_L_LED PHout(10) //将任务板的左转向灯端口PHout(10)宏定义为Tba_L_LED变量
#define Tba_R_LED PHout(11) //将任务板的右转向灯端口PHout(11)宏定义为Tba_R_LED变量
改写完后如图所示:
右转类似,上面已经写出。
调用(已测,都可用):
Tba_L_LED = 0; //任务板左转向灯开启
Set_tba_WheelLED(L_LED,SET);//任务板左转向灯开启,这里的SET也可以用非零正数代替
Tba_L_LED = 1; //任务板左转向灯关闭
Set_tba_WheelLED(L_LED,RESET);//任务板左转向灯关闭
Tba_R_LED = 0; //任务板右转向灯开启
Set_tba_WheelLED(R_LED,SET);//任务板右转向灯开启
Tba_R_LED = 1; //任务板右转向灯关闭
Set_tba_WheelLED(R_LED,RESET);//任务板右转向灯关闭
形式参数只有一个速度,原因是循迹无需给定小车要行驶多少码盘值,循迹的原理是让小车从任意位置,沿着黑线行驶至下个十字路口处,当循迹板扫描到黑线时,小车停止运行;或者从协议上看,循迹的主指令为0x06,对应的副指令只有速度值,没有码盘值。
由于任务板转向灯控制函数的代码:当1时灯端口灯灭,swch = 0时端口灯亮,与常理相反,所以我们将左转向灯和右转向灯if(swch) ……else …… 的两条语句调换顺序,换成我们符合我们正常逻辑的顺序。最终代码如下:
最后,使用时调用此函数即可:
Tba_R_LED = 1; //任务板左转向灯开启
Tba_R_LED = 0; //任务板左转向灯关闭
Tba_R_LED = 1; //任务板右转向灯开启
Tba_R_LED = 0; //任务板右转向灯关闭
例如:
- 点赞
- 收藏
- 关注作者
评论(0)