|
/*********************************************************************
*
* 基于CC2541藍(lán)牙模塊與單片機(jī)的串口通信,控制L298N電機(jī)電機(jī)驅(qū)動模塊
* 驅(qū)動電機(jī)前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)并配置相關(guān)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; //前進(jìn)燈 (白色)
sbit led4=P2^2; //倒車燈 (藍(lán)色)
sbit led5=P2^3; //左轉(zhuǎn)向燈 (黃色)
sbit led6=P2^4; //右轉(zhuǎn)向燈 (黃色)
sbit led7=P2^5; //剎車燈 (紅色)
sbit IN1=P0^0;
sbit IN2=P0^1; //電機(jī)A信號輸入
sbit IN3=P0^2;
sbit IN4=P0^3; //電機(jī)B信號輸入
sbit led1=P0^6; //數(shù)據(jù)接收指示燈
sbit trig=P2^6; //超聲波接口
sbit echo=P2^7;
void init(); //串口初始化
void send(unsigned char a); //單字節(jié)發(fā)送函數(shù)
void ctrl(); //接收處理函數(shù)
void main()
{
init();
while(1)
{
if(RI==1) //是否有數(shù)據(jù)到來
{
RI = 0;
tmp = SBUF; //暫存接收到的數(shù)據(jù)
ctrl();
}
}
}
void init() //串口初始化
{
ES=0; //關(guān)中斷
SCON = 0x50; // REN=1允許串行接受狀態(tài),串口工作模式1,10 //位UART(1位起始位,8位數(shù)據(jù)位,1位停止位, //無奇偶校驗),波特可變
TMOD = 0x20; //定時器1工作于方式2,8位自動重載模式,用 //于產(chǎn)生波特率
TH1=TL1=0xFD; //波特率9600 (本次測試采用晶振為11.0592)
PCON &= 0x7f; //波特率不倍增
TR1 = 1; //定時器1開始工作,產(chǎn)生波特率 //發(fā)送標(biāo)志位置1
TI=0; //接收標(biāo)志位置0
RI=0;
EA=0;
ES=1;
IN1=0; //初始化設(shè)置
IN2=0; //電機(jī)A制動
IN3=0;
IN4=0; //電機(jī)B制動
ledboard1=0; //LED大燈滅
led2=0; //加速燈滅
led3=0; //前進(jìn)燈滅
led4=0; //倒退燈滅
led5=0; //左轉(zhuǎn)向燈滅
led6=0; //右轉(zhuǎn)向燈滅
led7=0; //制動燈、剎車燈滅
}
void send(unsigned char a) //單字節(jié)數(shù)據(jù)發(fā)送
{ //注意:若單片機(jī)TXD(P3.1)無上拉能力,必須在P3.1端接上拉電阻。本次測試需要接上拉電阻
TI=0;
SBUF=a;
while(TI==0);
TI=0;
if(c%2) //發(fā)送指示燈標(biāo)志,每接收一次,led指示燈亮滅交替
led1=1;
else
led1=0;
c++;
}
void ctrl() //接收處理函數(shù)
{
switch(tmp)
{
case 1:
tmp=0x01; //收到字符1,電機(jī)A、B正轉(zhuǎn),車子前進(jìn),前進(jìn)燈點(diǎn)亮,其他燈滅
IN1=1;
IN2=0; //電機(jī)A正轉(zhuǎn)
IN3=1;
IN4=0; //電機(jī)B正轉(zhuǎn)
led3=1; //前進(jìn)燈點(diǎn)亮
led2=0; //加速燈
led4=0; //倒退燈
led5=0; //左轉(zhuǎn)向燈
led6=0; //右轉(zhuǎn)向燈
led7=0; //制動燈、剎車燈
send(tmp); break;
case 2:
tmp=0x02; //收到字符2,電機(jī)A、B反轉(zhuǎn),車子后退 ,倒車燈亮
IN1=0;
IN2=1; //電機(jī)A反轉(zhuǎn)
IN3=0;
IN4=1; //電機(jī)B反轉(zhuǎn)
led4=1; //倒退燈點(diǎn)亮
led2=0; //加速燈滅
led3=0; //前進(jìn)燈滅
led5=0; //左轉(zhuǎn)向燈滅
led6=0; //右轉(zhuǎn)向燈滅
led7=0; //制動燈、剎車燈滅
send(tmp); break;
case 3:
tmp=0x03; //收到字符3,電機(jī)A反轉(zhuǎn),電機(jī)B正轉(zhuǎn),車子左轉(zhuǎn)
IN1=0;
IN2=1; //電機(jī)A反轉(zhuǎn)
IN3=1;
IN4=0; //電機(jī)B正轉(zhuǎn)
led5=1; //左轉(zhuǎn)向燈點(diǎn)亮
led2=0; //加速燈滅
led3=0; //前進(jìn)燈滅
led4=0; //倒退燈滅
led6=0; //右轉(zhuǎn)向燈滅
led7=0; //制動燈、剎車燈滅
send(tmp); break;
case 4:
tmp=0x04; //收到字符4,電機(jī)A正轉(zhuǎn),電機(jī)B反轉(zhuǎn),車子右轉(zhuǎn)
IN1=1;
IN2=0; //電機(jī)A正轉(zhuǎn)
IN3=0;
IN4=1; //電機(jī)B反轉(zhuǎn)
led6=1; //右轉(zhuǎn)向燈點(diǎn)亮
led2=0; //加速燈
led3=0; //前進(jìn)燈
led4=0; //倒退燈
led5=0; //左轉(zhuǎn)向燈
led7=0; //制動燈、剎車燈
send(tmp); break;
case 5:
tmp=0x05; //收到字符5,電機(jī)A、B制動,車子剎車
IN1=0;
IN2=0; //電機(jī)A制動
IN3=0;
IN4=0; //電機(jī)B制動
led7=1; //剎車燈點(diǎn)亮
led2=0; //加速燈
led3=0; //前進(jìn)燈
led4=0; //倒退燈
led5=0; //左轉(zhuǎn)向燈
led6=0; //右轉(zhuǎn)向燈
send(tmp); break;
case 6:
tmp=0x06; //收到字符6
IN1=0;
IN2=0;
IN3=0;
IN4=0;
ledboard1=1; //led大燈點(diǎn)亮,電機(jī)制動
led2=0; //加速燈
led3=0; //前進(jìn)燈
led4=0; //倒退燈
led5=0; //左轉(zhuǎn)向燈
led6=0; //右轉(zhuǎn)向燈
led7=0; //制動燈、剎車燈
send(tmp); break;
default: //其他數(shù)字,電機(jī)剎車,所有燈熄滅
IN1=0;
IN2=0;
IN3=0;
IN4=0;
led2=0;
led3=0;
led4=0;
led5=0;
led6=0;
led7=0;
send(tmp);
}
}
|
評分
-
查看全部評分
|