红外通信模块、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,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; // 输入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的代码就粘贴完成了,下面我们看一下效果吧,如下:
红外通信模块、NEC红外收发模块(3)——两个单片机交互控制小车相关推荐
- 红外通信模块、NEC红外收发模块(1)——红外模块调试
写这篇文章之前先看一下模块长什么样子,如图: 这个模块淘宝上一搜一堆,请各位学习者可以网上下载. 现在我们要验证一下这个模块是怎么工作的,先看他的引脚 GND RXD TXD 5V 引脚很简单,现在我 ...
- 【蓝桥杯单片机】红外接收及NEC红外通信协议
实验开发板为CT107D蓝桥官方板,编译环境为MDK5 目录 1 .红外发射和接收原理简述 2.蓝桥杯竞赛板所使用的红外一体化接收头 2.1.通信协议 2.2.实际驱动 工程下载地址: https:/ ...
- FPGA 24 工程模块 红外遥控(NEC协议)解码
FPGA 24 红外遥控(NEC协议)解码 主要功能 :设计了一个红外 NEC协议的解码模块 实现(设计)流程:通过遥控器发送的红外信号,外围红外信号接收传感器对数据进行接收,得到一个在基频上的高低电 ...
- STM32 NEC红外遥控器解码
STM32 NEC红外遥控器解码 红外遥控编码格式 一体化红外接收头 STM32显示遥控器按下的数字代码 代码片 总结 原文链接:https://www.yourcee.com/newsinfo/29 ...
- 使用PY003基于外部中断+定时器的方式实现NEC红外解码
写在前边 最近项目用到一款遥控器是38K红外载波,NEC协议的,找了很多帖子有看到用外部中断下降沿判断(但可惜判定数据的方式是while在外部中断里面死等的),有看到用100us定时器定时刷来判断,感 ...
- Android MediaTek 平台增加UART接口的红外模块支持,支持NEC红外遥控
目录 修改的文件: 文件修改说明: 这个是mtk 增加的uart和nec红外模块的支持 , 以下主要针对driver的增加 , 应用部分也有 需要的可以私. 这个 修改主要在 MediaTek 平台上 ...
- 红外通讯之红外遥控器让你的舵机转圈圈
2021年第一篇文章,祝各位开工大吉,开学大吉,公众号也正是更名为"嵌入式实验基地"~ 本次为各位小伙伴带来的是一种非常普遍且便宜易实现的短距离无线通讯-红外通讯,电视机.空调 ...
- 智能循迹避障小车C语言程序编写思路,基于单片机的智能小车红外避障循迹系统设计与制作...
余秀玲 余秀娟 摘 要:随着科技的高速发展,人们对生活质量的要求越来越高,无人驾驶汽车已经被广为研发和试用,由此智能小车的快速发展也是在情理之中.通过对基于单片机的智能小车的硬件及软件设计分析,实现红 ...
- 【红外技术】客户的问题:在我的应用中,到底是选择中波红外还是长波红外波段?(来自英国高级技术咨询业界巨头的权威回答)
整理时间:2020-02-16 整理内容:红外波段的选择 客户的问题:在我的应用中,到底是选择中波红外还是长波红外波段? 正式回答这个问题,还真是难. 因为我没有根据各种环境,气候等去做两个波段的对比 ...
最新文章
- java反射构造函数_【译】3. Java反射——构造函数
- java catch 空指针异常_关于Java:捕获空指针异常
- linux top p 乱码,将Linux top命令输入到指定文件时的乱码问题
- java 如何忽略异常_java中如何解决异常
- C++基础06-类与对象之new和malloc
- 飞鸽传书绿色版 部分数据库被陆续公开了
- CSS Margin(外边距)
- 试验设计第二版茆诗松课后题答案_茆诗松数理统计学答案
- 视频教程-QT教程--入门实战视频精讲-C/C++
- python中关于__new__和__init__的个人理解
- (拓扑排序+并查集)HDU - 1811 Rank of Tetris
- (P44)面向对象版表达式计算器:符号表SymbolTable的实现
- Python学习笔记——基础篇【第六周】——shutil模块
- 2013 CVPR点评
- 小知识:什么是build.prop?
- linux 局域网 提高网速,提高Linux系统网速的方法
- 仿射密码加密解密实现
- 小雉配置--支持向上向下兼容的 配置文件 兼容性 设计
- Javascript动态创建SVG圆弧
- scite使用日常收集