红外通信模块、NEC红外收发模块(3)——两个单片机交互控制小车

先上两个图:

单片机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)		//9600bps@11.0592MHz
{
	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)		//9600bps@11.0592MHz
{
	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的代码就粘贴完成了,下面我们看一下效果吧,如下:

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小材大用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值