100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 红外通信模块 NEC红外收发模块(3)——两个单片机交互控制小车

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

时间:2020-08-17 11:48:05

相关推荐

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

先上两个图:

单片机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)//9600bps@11.0592MHz{PCON &= 0x7F;//波特率不倍速SCON = 0x50;//8位数据,可变波特率AUXR &= 0xFB;//独立波特率发生器时钟为Fosc/12,即12TBRT = 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,2sbit IN1 = P1^1; // 输入1sbit IN2 = P1^2; // 输入2sbit EN1 = P1^3; // 电机输入输出3,4sbit IN3 = P1^4; // 输入3sbit IN4 = P1^5; // 输入4void 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,即12TBRT = 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的代码就粘贴完成了,下面我们看一下效果吧,如下:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。