|
/*********************************************************************
*
* 基于CC2541蓝牙模块与单片机的串口通信,控制L298N电机电机驱动模块
* 驱动电机前进、后退、左转、右转并配置相关LED显示灯
*
*********************************************************************/
#include <ioCC2540.h>
#include <reg52.h>
#include <intrins.h>
unsigned char tmp;
unsigned int c=0;
sbit ledboard1=P0^7; //LED大灯
sbit led2=P2^0; //加速灯 (绿色)
sbit led3=P2^1; //前进灯 (白色)
sbit led4=P2^2; //倒车灯 (蓝色)
sbit led5=P2^3; //左转向灯 (黄色)
sbit led6=P2^4; //右转向灯 (黄色)
sbit led7=P2^5; //刹车灯 (红色)
sbit IN1=P0^0;
sbit IN2=P0^1; //电机A信号输入
sbit IN3=P0^2;
sbit IN4=P0^3; //电机B信号输入
sbit led1=P0^6; //数据接收指示灯
sbit trig=P2^6; //超声波接口
sbit echo=P2^7;
void init(); //串口初始化
void send(unsigned char a); //单字节发送函数
void ctrl(); //接收处理函数
void main()
{
init();
while(1)
{
if(RI==1) //是否有数据到来
{
RI = 0;
tmp = SBUF; //暂存接收到的数据
ctrl();
}
}
}
void init() //串口初始化
{
ES=0; //关中断
SCON = 0x50; // REN=1允许串行接受状态,串口工作模式1,10 //位UART(1位起始位,8位数据位,1位停止位, //无奇偶校验),波特可变
TMOD = 0x20; //定时器1工作于方式2,8位自动重载模式,用 //于产生波特率
TH1=TL1=0xFD; //波特率9600 (本次测试采用晶振为11.0592)
PCON &= 0x7f; //波特率不倍增
TR1 = 1; //定时器1开始工作,产生波特率 //发送标志位置1
TI=0; //接收标志位置0
RI=0;
EA=0;
ES=1;
IN1=0; //初始化设置
IN2=0; //电机A制动
IN3=0;
IN4=0; //电机B制动
ledboard1=0; //LED大灯灭
led2=0; //加速灯灭
led3=0; //前进灯灭
led4=0; //倒退灯灭
led5=0; //左转向灯灭
led6=0; //右转向灯灭
led7=0; //制动灯、刹车灯灭
}
void send(unsigned char a) //单字节数据发送
{ //注意:若单片机TXD(P3.1)无上拉能力,必须在P3.1端接上拉电阻。本次测试需要接上拉电阻
TI=0;
SBUF=a;
while(TI==0);
TI=0;
if(c%2) //发送指示灯标志,每接收一次,led指示灯亮灭交替
led1=1;
else
led1=0;
c++;
}
void ctrl() //接收处理函数
{
switch(tmp)
{
case 1:
tmp=0x01; //收到字符1,电机A、B正转,车子前进,前进灯点亮,其他灯灭
IN1=1;
IN2=0; //电机A正转
IN3=1;
IN4=0; //电机B正转
led3=1; //前进灯点亮
led2=0; //加速灯
led4=0; //倒退灯
led5=0; //左转向灯
led6=0; //右转向灯
led7=0; //制动灯、刹车灯
send(tmp); break;
case 2:
tmp=0x02; //收到字符2,电机A、B反转,车子后退 ,倒车灯亮
IN1=0;
IN2=1; //电机A反转
IN3=0;
IN4=1; //电机B反转
led4=1; //倒退灯点亮
led2=0; //加速灯灭
led3=0; //前进灯灭
led5=0; //左转向灯灭
led6=0; //右转向灯灭
led7=0; //制动灯、刹车灯灭
send(tmp); break;
case 3:
tmp=0x03; //收到字符3,电机A反转,电机B正转,车子左转
IN1=0;
IN2=1; //电机A反转
IN3=1;
IN4=0; //电机B正转
led5=1; //左转向灯点亮
led2=0; //加速灯灭
led3=0; //前进灯灭
led4=0; //倒退灯灭
led6=0; //右转向灯灭
led7=0; //制动灯、刹车灯灭
send(tmp); break;
case 4:
tmp=0x04; //收到字符4,电机A正转,电机B反转,车子右转
IN1=1;
IN2=0; //电机A正转
IN3=0;
IN4=1; //电机B反转
led6=1; //右转向灯点亮
led2=0; //加速灯
led3=0; //前进灯
led4=0; //倒退灯
led5=0; //左转向灯
led7=0; //制动灯、刹车灯
send(tmp); break;
case 5:
tmp=0x05; //收到字符5,电机A、B制动,车子刹车
IN1=0;
IN2=0; //电机A制动
IN3=0;
IN4=0; //电机B制动
led7=1; //刹车灯点亮
led2=0; //加速灯
led3=0; //前进灯
led4=0; //倒退灯
led5=0; //左转向灯
led6=0; //右转向灯
send(tmp); break;
case 6:
tmp=0x06; //收到字符6
IN1=0;
IN2=0;
IN3=0;
IN4=0;
ledboard1=1; //led大灯点亮,电机制动
led2=0; //加速灯
led3=0; //前进灯
led4=0; //倒退灯
led5=0; //左转向灯
led6=0; //右转向灯
led7=0; //制动灯、刹车灯
send(tmp); break;
default: //其他数字,电机刹车,所有灯熄灭
IN1=0;
IN2=0;
IN3=0;
IN4=0;
led2=0;
led3=0;
led4=0;
led5=0;
led6=0;
led7=0;
send(tmp);
}
}
|
评分
-
查看全部评分
|