1. 程式人生 > >紅外通訊模組、NEC紅外收發模組——學習之三——兩個微控制器互動控制小車

紅外通訊模組、NEC紅外收發模組——學習之三——兩個微控制器互動控制小車

先上兩個圖:

微控制器A:

微控制器B:

現在實現的功能的是:

微控制器A控制微控制器B完成一定的任務,包括以下幾點:

  • 微控制器A作為遙控器,資料的傳送端
    • 微控制器A有微控制器和紅外線模組組成,完成的功能是:微控制器控制紅外模組,使得紅外模組向外傳送控制資料
  • 微控制器B作為操作裝置,資料的接收端
    • 微控制器B有微控制器、紅外模組、電機組成,完成的功能是:微控制器根據紅外模組接收到的資料進行控制小車的電機(前進,倒退,左拐彎,右拐彎,還是停止)

那如何完成這樣的功能呢?

因為紅外模組之前已經講到過,也有相應的程式碼實現。現在我們直接貼程式碼,大家可以自己研究研究,程式碼實現並不是很難,主要是注意兩個點:

  1. 微控制器的序列通訊的實現
  2. 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的程式碼就貼上完成了,下面我們看一下效果吧,如下: