|
/*********************************************************************
*
* 基于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);
}
}
|
評分
-
查看全部評分
|