当前位置: 首页 > news >正文

基于单片机的串行通信发射机设计

一、项目介绍

串行通信是一种常见的数据传输方式,允许将数据以比特流的形式在发送端和接收端之间传输。当前实现基于STC89C52单片机的串行通信发射机,通过红外发射管和接收头实现自定义协议的数据无线传输。

image-20230710135812115

二、系统设计

2.1 单片机选择

在本设计中,选择了STC89C52作为主控芯片。单片机具有较高的性能和丰富的外设资源,适合实现串行通信发射机功能。

2.2 矩阵键盘

采用4x4的矩阵键盘,用于接收用户输入的指令。通过扫描矩阵键盘的按键状态,可以获取用户需要发送的数据。

2.3 红外发射管和接收头

选择具有较高发射功率和较长发射距离的红外发射管,并配合红外接收头进行数据传输。当红外接收头检测到红外光时,输出低电平;没有检测到红外光时,输出高电平。

2.4 矩阵键盘扫描

利用矩阵键盘的行列扫描原理,实时检测用户按键状态,并将按键值保存在变量中供后续使用。

2.5 数据转换和红外发送

根据自定义的协议格式,将用户按键值转换为红外控制码。通过IO口驱动红外发射管发送红外控制码。

三、协议的约定

【1】自定义发送协议: 自定义发送协议需要约定以下内容:

  • 帧格式:确定每一帧数据的起始标志、数据长度和校验信息等。常见的帧格式包括起始位、数据位、停止位和校验位。
  • 数据编码:确定将要发送的数据转换为比特流进行传输的方式。常见的编码方式有Manchester编码和Pulse-Width Modulation(PWM)编码。
  • 校验机制:确定是否需要添加校验位,以保证数据传输的准确性和完整性。常见的校验方式有奇偶校验、循环冗余校验(CRC)等。

例如,可以采用以下的帧格式作为示例:

  • 帧头:起始位,一个特定的比特用于标识帧的开始。
  • 数据字段:包含要发送的数据。
  • 校验位:用于检验帧数据的准确性。
  • 帧尾:停止位,一个特定的比特用于标识帧的结束。

【2】接收原理: 接收端通过红外接收头实现对发送端发送的红外控制码的接收和解码。接收原理包括以下步骤:

  • 红外信号接收:红外接收头接收红外光,并将接收到的光信号转换为电流信号。
  • 弱信号放大:对接收到的电流信号进行放大,以便进行后续处理。
  • 数据解码:根据约定的帧格式和编码方式,将接收到的比特流解码为原始数据。
  • 校验校准:对接收到的数据进行校验和校准,确保数据的准确性。

下面是发送端和接收端的代码:

发送端代码:

#include <reg52.h>// 定义红外发射管IO口
#define IR_LED P1// 发送一帧数据
void sendFrame(unsigned char data) {unsigned char i;// 发送起始位IR_LED = 0;DelayUs(300);for (i = 0; i < 8; i++) {// 发送数据位IR_LED = data & 0x01;DelayUs(300);data >>= 1;}// 发送停止位IR_LED = 1;DelayUs(300);
}// 主函数
void main() {unsigned char sendData = 0x55;  // 要发送的数据while (1) {sendFrame(sendData);  // 发送一帧数据DelayMs(1000);}
}

接收端代码:

#include <reg52.h>// 定义红外接收头IO口
#define IR_RECV P2// 接收一帧数据
unsigned char receiveFrame() {unsigned char i;unsigned char data = 0;while (IR_RECV);  // 等待起始位DelayUs(150);for (i = 0; i < 8; i++) {DelayUs(300);data >>= 1;if (IR_RECV) {data |= 0x80;}}return data;
}// 主函数
void main() {unsigned char receivedData;while (1) {receivedData = receiveFrame();  // 接收一帧数据// 处理接收到的数据}
}

四、代码实现

下面是基于STC89C52单片机的串行通信发射机和接收机的整体代码,其中包括了4x4矩阵键盘的读取和红外数据传输的功能:

发射机代码:

#include <reg52.h>#define IR_LED P1
#define KEYBOARD P2// 发送一帧数据
void sendFrame(unsigned char data) {unsigned char i;// 发送起始位IR_LED = 0;DelayUs(300);for (i = 0; i < 8; i++) {// 发送数据位IR_LED = data & 0x01;DelayUs(300);data >>= 1;}// 发送停止位IR_LED = 1;DelayUs(300);
}// 读取矩阵键盘
unsigned char readKeyboard() {unsigned char row, col, keyVal;KEYBOARD = 0xF0;  // 设置行为高电平,列为低电平if (KEYBOARD != 0xF0) {  // 检测是否有按键按下keyVal = KEYBOARD;switch (keyVal) {case 0xE0: row = 0; break;case 0xD0: row = 1; break;case 0xB0: row = 2; break;case 0x70: row = 3; break;default: return 0xFF;}KEYBOARD = 0x0F;  // 设置列为高电平,行为低电平keyVal = KEYBOARD;switch (keyVal) {case 0x0E: col = 0; break;case 0x0D: col = 1; break;case 0x0B: col = 2; break;case 0x07: col = 3; break;default: return 0xFF;}// 根据行列计算键值return 4 * row + col + 1;}return 0xFF;  // 返回无效键值
}// 主函数
void main() {unsigned char sendData;while (1) {sendData = readKeyboard();  // 读取键盘数据if (sendData != 0xFF) {sendFrame(sendData);  // 发送一帧数据}}
}

接收机代码:

#include <reg52.h>#define IR_RECV P3// 接收一帧数据
unsigned char receiveFrame() {unsigned char i;unsigned char data = 0;while (IR_RECV);  // 等待起始位DelayUs(150);for (i = 0; i < 8; i++) {DelayUs(300);data >>= 1;if (IR_RECV) {data |= 0x80;}}return data;
}// 主函数
void main() {unsigned char receivedData;while (1) {receivedData = receiveFrame();  // 接收一帧数据// 处理接收到的数据}
}

相关文章:

基于单片机的串行通信发射机设计

一、项目介绍 串行通信是一种常见的数据传输方式&#xff0c;允许将数据以比特流的形式在发送端和接收端之间传输。当前实现基于STC89C52单片机的串行通信发射机&#xff0c;通过红外发射管和接收头实现自定义协议的数据无线传输。 二、系统设计 2.1 单片机选择 在本设计中&…...

MySQL数据库——多表查询(3)-自连接、联合查询、子查询

目录 自连接 查询语法 自连接演示 联合查询 查询语法 子查询 介绍 标量子查询 列子查询 行子查询 表子查询 自连接 通过前面的学习&#xff0c;我们对于连接已经有了一定的理解。而自连接&#xff0c;通俗地去理解就是自己连接自己&#xff0c;即一张表查询多次。…...

day53 动规.p14 子序列

- 1143.最长公共子序列 cpp class Solution { public: int longestCommonSubsequence(string text1, string text2) { vector<vector<int>> dp(text1.size() 1, vector<int>(text2.size() 1, 0)); for (int i 1; i < text1.size(…...

将docker打包成镜像并保存到本地

如果想重装系统&#xff0c;又不想破坏docker里面配好的环境&#xff0c;那么可以将docker镜像打包到本地进行保存。 1. 将docker打包成镜像 命令&#xff1a;docker commit 容器id 镜像名:tag 使用docker ps -a即可查看容器相关信息 docker commit dd25c7c6bf17 zm_cu101:c…...

Harmony数据存储工具类

使用的是mmkv 1、安装mmkv ohpm install @ohos/mmkv2、封装 import{MMKV, SerializeBase} from @ohos/mmkv/*** 数据存储工具类*/ class MMKVUtil{private filePath:string = private cachePath:string = private mmkv:MMKVprivate mmapID:string="MMKV"construct…...

ROS 2官方文档(基于humble版本)学习笔记(一)

ROS 2官方文档&#xff08;基于humble版本&#xff09;学习笔记&#xff08;一&#xff09; 一、安装ROS 2二、按教程学习1.CLI 工具配置环境使用turtlesim&#xff0c;ros2和rqt安装 turtlesim启动 turtlesim使用 turtlesim安装 rqt使用 rqt重映射关闭turtlesim 由于市面上专门…...

【数据结构】十字链表的画法

十字链表的基本概念 有向边又称为弧 假设顶点 v 指向 w&#xff0c;那么 w 称为弧头&#xff0c;v 称为弧尾 顶点节点采用顺序存储 顶点节点 data&#xff1a;存放顶点的信息firstin&#xff1a;指向以该节点为终点&#xff08;弧头&#xff09;的弧节点firstout&#xff1…...

使用rabbitmq进行支付之后的消息通知

订单服务完成支付后将支付结果发给每一个与订单服务对接的微服务&#xff0c;订单服务将消息发给交换机&#xff0c;由交换机广播消息&#xff0c;每个订阅消息的微服务都可以接收到支付结果. 微服务收到支付结果根据订单的类型去更新自己的业务数据。 相关技术方案 使用消息…...

【100天精通python】Day47:python网络编程_Web开发:web服务器,前端基础以及静态服务器

目录 1 网络编程与web编程 1.1 网络编程 1.2 web编程 1.3 前后端交互的基本原理 2 Web开发基础 2.1 HTTP协议 2.2 Web服务器 2.3 前端基础 2.3.1 HTML&#xff08;超文本标记语言&#xff09; 2. 3.2 CSS&#xff08;层叠样式表&#xff09; 2.3.3 JavaScript 2.…...

Web框架Beego

beego简介第一个beego项目beego项目结构分析bee 工具简介beego参数配置beego路由设置beego控制器介绍beego获取参数beego ORMbeego orm高级查询beego 原生sql查询beego 模板语法指南beego模板处理...

Kubernetes(K8s)基本环境部署

此处只做学习使用&#xff0c;配置单master环境。 一、环境准备 1、ip主机规划&#xff08;准备五台新机&#xff09;>修改各个节点的主机名 注意&#xff1a;关闭防火墙与selinux 节点主机名ip身份joshua1 kubernetes-master.openlab.cn 192.168.134.151masterjoshua2k…...

antd5:form组件底层封装库field-form-1.37.0启动

一开始node版本是18.16.0 npm install发现安装依赖成功 npm start发现启动出错 node:internal/crypto/hash:71this[kHandle] new _Hash(algorithm, xofLen);^Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:71:19)…...

深度学习经典检测方法的概述

深度学习经典的检测方法 two-stage&#xff08;两阶段&#xff09;&#xff1a;Faster-rcnn Mask-Rcnn系列 两阶段&#xff08;two-stage&#xff09;是指先通过一个区域提取网络&#xff08;region proposal network&#xff0c;RPN&#xff09;生成候选框&#xff0c;再通过…...

viewpager2导致的mViews下标越界问题

viewpager2种在嵌套一个RecyclerView场景&#xff1a;左右滑动&#xff0c;上下滑动&#xff0c;出现mViews为null问题。 //RecyclerView布局为 new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL) 由于使用viewpager2导致布局缓存的销毁&#xff0c;会…...

无涯教程-JavaScript - NORMSDIST函数

NORMSDIST函数替代Excel 2010中的NORM.S.DIST函数。 描述 该函数返回标准正态累积分布函数。分布的平均值为0(零),标准偏差为1。使用此功能代替标准法线区域的表格。 语法 NORMSDIST (z)争论 Argument描述Required/OptionalZThe value for which you want the distributio…...

Mysql查询(SELECT)

基本查询&#xff1a;SELECT FROM SELECT 查询字段 FROM 表名; SELECT * FROM userinfo; 条件查询&#xff1a;用where表示查询条件 SELECT 查询字段 FROM 表名 WHERE 条件; 模糊查询&#xff1a;like %匹配0或多个字符&#xff0c;一般不用左模糊&#xff08;%放在左边&…...

基于JAVAEE技术的ssm校园车辆管理系统源码和论文

基于JAVAEE技术的ssm校园车辆管理系统源码和论文105 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 1.选题背景和意义 背景&#xff1a; 随着第二次工业革命后&#xff0c;内燃机的发明与完善&#xff0c;解…...

opencv-人脸识别

对https://blog.csdn.net/weixin_46291251/article/details/117996591这哥们代码的一些修改 import cv2 import numpy as np import os import shutil import threading import tkinter as tk from PIL import Image, ImageTkchoice 0# 首先读取config文件&#xff0c;第一行…...

九、idSpanMap使用基数树代替原本的unordered_map 十、使用基数树前后性能对比

九、idSpanMap使用基数树代替原本的unordered_map 我们原本的idSpanMap用的是STL容器中的unordered_map哈希桶&#xff0c;因为STL的容器本身是不保证线程安全的&#xff0c;所以我们在访问时需要加锁保证线程安全&#xff0c;这也就是我们写的内存池的性能的瓶颈点。因为我做…...

政府科技项目验收全流程分享

科技验收测试 &#xff08;验收申请→主管部门初审→科技厅审核→组织验收→归档备案→信用管理&#xff09;&#xff1a; &#xff08;一&#xff09;验收申请 项目承担单位通过省科技业务管理系统提交验收申请。 按期完成的项目&#xff0c;项目承担单位应当在项目合同书…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...