紅外通訊模組、NEC紅外收發模組——學習之三——兩個微控制器互動控制小車
阿新 • • 發佈:2018-12-18
先上兩個圖:
微控制器A:
微控制器B:
現在實現的功能的是:
微控制器A控制微控制器B完成一定的任務,包括以下幾點:
- 微控制器A作為遙控器,資料的傳送端
- 微控制器A有微控制器和紅外線模組組成,完成的功能是:微控制器控制紅外模組,使得紅外模組向外傳送控制資料
- 微控制器B作為操作裝置,資料的接收端
- 微控制器B有微控制器、紅外模組、電機組成,完成的功能是:微控制器根據紅外模組接收到的資料進行控制小車的電機(前進,倒退,左拐彎,右拐彎,還是停止)
那如何完成這樣的功能呢?
因為紅外模組之前已經講到過,也有相應的程式碼實現。現在我們直接貼程式碼,大家可以自己研究研究,程式碼實現並不是很難,主要是注意兩個點:
- 微控制器的序列通訊的實現
- L293D晶片驅動電機的功能實現原理
掌握這兩點,基本上就可以實現了。
先給出微控制器A中實現的程式碼:
#include <stc12c5a60s2.h>
/*
微控制器A的程式碼實現
*/
/* 按鍵,上下左右中 */
sbit key_up = P2^0;
sbit key_down = P2^1;
sbit key_right = P2^2;
sbit key_left = P2^3;
sbit key_center = P2^4;
/* 函式的定義申明 */
void UartInit(void);
void delay();
void send_delay(int n);
void main()
{
UartInit();
ES = 1; // 序列口中斷允許控制位
EA = 1; // 總中斷控制位
while(1)
{
if(0 == key_up)
{
delay();
if(0 == key_up)
{
ES = 0;
TI = 1;
SBUF = 0XA1;
send_delay(10);
SBUF = 0XF1;
send_delay(10);
SBUF = 0X00;
send_delay(10);
SBUF = 0X00;
send_delay(10);
SBUF = 0X01;
send_delay(10);
while(!TI);
TI = 0;
ES = 1;
}
while(0 == key_up);
}
if(0 == key_down)
{
delay();
if(0 == key_down)
{
ES = 0;
TI = 1;
SBUF = 0XA1;
send_delay(10);
SBUF = 0XF1;
send_delay(10);
SBUF = 0X00;
send_delay(10);
SBUF = 0X00;
send_delay(10);
SBUF = 0X02;
send_delay(10);
while(!TI);
TI = 0;
ES = 1;
}
while(0 == key_down);
}
if(0 == key_right)
{
delay();
if(0 == key_right)
{
ES = 0;
TI = 1;
SBUF = 0XA1;
send_delay(10);
SBUF = 0XF1;
send_delay(10);
SBUF = 0X00;
send_delay(10);
SBUF = 0X00;
send_delay(10);
SBUF = 0X03;
send_delay(10);
while(!TI);
TI = 0;
ES = 1;
}
while(0 == key_right);
}
if(0 == key_left)
{
delay();
if(0 == key_left)
{
ES = 0;
TI = 1;
SBUF = 0XA1;
send_delay(10);
SBUF = 0XF1;
send_delay(10);
SBUF = 0X00;
send_delay(10);
SBUF = 0X00;
send_delay(10);
SBUF = 0X04;
send_delay(10);
while(!TI);
TI = 0;
ES = 1;
}
while(0 == key_left);
}
if(0 == key_center)
{
delay();
if(0 == key_center)
{
ES = 0;
TI = 1;
SBUF = 0XA1;
send_delay(10);
SBUF = 0XF1;
send_delay(10);
SBUF = 0X00;
send_delay(10);
SBUF = 0X00;
send_delay(10);
SBUF = 0X05;
send_delay(10);
while(!TI);
TI = 0;
ES = 1;
}
while(0 == key_center);
}
}
}
void delay() // 延時函式
{
int i,j;
for(i=0;i<200;i++)
{
for(j=0;j<200;j++);
}
}
void send_delay(int n) // 延時函式
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<200;j++);
}
}
void UartInit(void) // [email protected]
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位資料,可變波特率
AUXR &= 0xFB; //獨立波特率發生器時鐘為Fosc/12,即12T
BRT = 0xFD; //設定獨立波特率發生器重灌值
AUXR |= 0x01; //串列埠1選擇獨立波特率發生器為波特率發生器
AUXR |= 0x10; //啟動獨立波特率發生器
}
void Serial() interrupt 4
{
if(1 == TI) // 等待資料傳送成功
{
TI = 0;
}
}
微控制器B的程式碼:
#include <stc12c5a60s2.h>
/*
微控制器B的程式碼實現
*/
sbit EN = P1^0; // 電機輸入輸出1,2
sbit IN1 = P1^1; // 輸入1
sbit IN2 = P1^2; // 輸入2
sbit EN1 = P1^3; // 電機輸入輸出3,4
sbit IN3 = P1^4; // 輸入3
sbit IN4 = P1^5; // 輸入4
void delay();
void UartInit(void);
void main()
{
UartInit();
ES = 1; // 序列口中斷允許控制位
EA = 1; // 總中斷控制位
EN = 1; // L293D晶片1,2輸入端使能
EN1 = 1; // L293D晶片3,4輸入端使能
IN1 = 0; // 初始化
IN2 = 0; // 初始化
IN3 = 0; // 初始化
IN4 = 0; // 初始化
while(1)
{
}
}
void delay() // 延時函式
{
int i,j;
for(i=0;i<200;i++)
{
for(j=0;j<200;j++);
}
}
void UartInit(void) //[email protected]
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位資料,可變波特率
AUXR &= 0xFB; //獨立波特率發生器時鐘為Fosc/12,即12T
BRT = 0xFD; //設定獨立波特率發生器重灌值
AUXR |= 0x01; //串列埠1選擇獨立波特率發生器為波特率發生器
AUXR |= 0x10; //啟動獨立波特率發生器
}
void Serial() interrupt 4
{
unsigned char temp;
if(1 == RI) // 等待資料傳送成功
{
temp = SBUF;
if(1 == temp) // 右轉
{
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 0;
}
else if(2 == temp) // 後退
{
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
else if(3 == temp) // 停止
{
IN3 = 0;
IN4 = 0;
IN1 = 0;
IN2 = 0;
}
else if(4 == temp) // 左轉
{
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 1;
}
else if(5 == temp) // 前進
{
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
RI = 0;
}
}
微控制器A和B的程式碼就貼上完成了,下面我們看一下效果吧,如下: