单片机双机通信控制跑马灯
实验要求
两个单片机各驱动8个LED灯,构成两个跑马灯,要求甲单片机LED的点亮方式是从上至下,首先是最上面第一个点亮、其次是前两个点亮、其次是前三个点亮……直至8个灯全部点亮,8个灯全部灭,重复这个过程,乙单片机就是从下至上重复这个过程。按下甲单片机的独立按键S1,则乙单片机LED按照甲单片机的跑马灯方向运行三次,在继续原定程序;按乙单片机的独立按键S2,则甲单片机LED按照乙单片机的跑马灯方向先运行三次,在继续原定程序。
参考链接
串行口的工作原理及应用-CSDN博客
外中断的应用-CSDN博客
LED数码管的静态显示与动态显示(Keil+Proteus)_proteus数码管显示-CSDN博客
独立键盘接口设计(Keil+Proteus)-CSDN博客
51单片机入门之点亮LED灯_如何用单片机点亮led灯_yongy_u的博客-CSDN博客
51单片机中断笔记 - 知乎 (zhihu.com)
【51单片机实验笔记】开关篇(一) 独立按键_单片机 按键-CSDN博客
单片机 | 51单片机原理_c51单片机原理-CSDN博客
| 元器件 | Proteus关键字 |
| 51单片机 | AT89C51 |
| 按钮 | BUTTON |
| LED灯 | LED |
| 电阻 | RES |
| 电源 | POWER |
| 地 | GROUND |
Proteus软件操作
LED数码管的静态显示与动态显示(Keil+Proteus)_proteus数码管显示-CSDN博客
https://blog.csdn.net/weixin_64066303/article/details/134101256?spm=1001.2014.3001.5501
查询控制
当面对一个题目的时候可以进行分解,我这里是将题目分解成了以下三个部分:LED跑马灯、独立按键、双机通信。
LED跑马灯
之前经常实现的是流水灯,这个跑马灯是类似,如果对移位掌握的不好的话,就建议还是采用数组来存储将对应点亮的LED灯,数组储存起来之后遍历数组就行了,因为他情况有有限,用数组储存最好理解了,我这里采用的是共阳极的接法,给0表示亮,1表示不亮,然后8根线对应01,用十六进制数来表示将LED点亮的状态。
独立按键
独立键盘接口设计(Keil+Proteus)-CSDN博客
https://blog.csdn.net/weixin_64066303/article/details/134253686?spm=1001.2014.3001.5501这个的思路就是我给一个引脚接一个按钮,然后先给他赋值为1,如果读这个引脚他的值变成了0,就表示他被按下去了。
双机通信
串行口的工作原理及应用-CSDN博客
https://blog.csdn.net/weixin_64066303/article/details/134761169?spm=1001.2014.3001.5501双机通信就是两个单片机的RX和TX交换连接,其中有两个变量,如果接收到/发送完数据就会产生中断变成1,我们要做的就是控制这两个变量,一旦接收到就执行其他的操作,传输数据的话需要双方规定好波特率。
这个我最开始想复杂了,还想读取一边LED输出口的状态传递给另一个单片机来显示,其实就只需要传递让另一个单片机知道就行了,直接定义两个输出的数组就行了,应该从上到下,一个从下到上。
甲机和乙机的代码几乎一样,就是输出的数组不一样,大家理解其中一个就可以了。
甲机
//甲机
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//定义跑马灯数组
uchar code paomadeng1[]={0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0xFF};
uchar code paomadeng2[]={0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0xFF};#define S1 P1^7//延时程序
void delay(uint t){uchar i;while(t--)for(i=0;i<200;i++);
}void main(){uchar i,j,k;TMOD=0x20;//设置定时器T1为方式2TH1=0xFD;//波特率9600TL1=0xFD;SCON=0x50;//设置串口为方式1接收PCON=0x00;//SMOD=0TR1=1;//启动T1while(1){while(RI==0){//如果RI=0,表示没有接收到数据//正常走马灯for(i=0;i<=8;i++){P2=paomadeng1[i];delay(123);//判断按钮是否被按下P1=0xFF;if((P1&0x80)!=0x80){delay(5);if(S1==0){//按钮被按下SBUF=0xFF;//数据送串口发送while(TI==0);//如果TI=0,表示没有发送完,循环等待TI=0;}}}}for(j=0;j<3;j++){//重复三次for(k=0;k<=8;k++){P2=paomadeng2[k];delay(123);}}RI=0;//软件清零}
}
乙机
//乙机
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//定义跑马灯数组
uchar code paomadeng1[]={0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0xFF};
uchar code paomadeng2[]={0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0xFF};#define S1 P1^7//延时程序
void delay(uint t){uchar i;while(t--)for(i=0;i<200;i++);
}void main(){uchar i,j,k;TMOD=0x20;//设置定时器T1为方式2TH1=0xFD;//波特率9600TL1=0xFD;SCON=0x50;//设置串口为方式1接收PCON=0x00;//SMOD=0TR1=1;//启动T1while(1){while(RI==0){//如果RI=0,表示没有接收到数据//正常走马灯for(i=0;i<=8;i++){P2=paomadeng2[i];delay(123);//判断按钮是否被按下P1=0xFF;if((P1&0x80)!=0x80){delay(5);if(S1==0){//按钮被按下SBUF=0xFF;//数据送串口发送while(TI==0);//如果TI=0,表示没有发送完,循环等待TI=0;}}}}//跳出循环表示接收到数据for(j=0;j<3;j++){//重复三次for(k=0;k<=8;k++){P2=paomadeng1[k];delay(123);}}RI=0;//软件清零}
}
原理图
正常运行
S1按钮被按下
S2按钮被按下

中断控制
外中断的应用-CSDN博客
https://blog.csdn.net/weixin_64066303/article/details/134360733?spm=1001.2014.3001.5501就是把查询要执行的函数主体写到中断服务函数,为了让他能够直接执行我在循环中还加了一个break,就是为了让按钮更加灵敏一点。
甲机
//甲机
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//定义跑马灯数组
uchar code paomadeng1[]={0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0xFF};
uchar code paomadeng2[]={0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0xFF};//延时程序
void delay(uint t){uchar i;while(t--)for(i=0;i<200;i++);
}void main(){uchar i,j,k;TMOD=0x20;//设置定时器T1为方式2TH1=0xFD;//波特率9600TL1=0xFD;SCON=0x50;//设置串口为方式1接收PCON=0x00;//SMOD=0TR1=1;//启动T1EA=1;//总中断允许EX0=1;//INT0开中断IT0=0;//选择外部中断为低电平触发方式while(1){if(RI==0){//如果RI=0,表示没有接收到数据//正常走马灯for(i=0;i<=8;i++){P2=paomadeng1[i];delay(123); //有数据传过来直接中断if(RI!=0){//break;}}}else{for(j=0;j<3;j++){//重复三次for(k=0;k<=8;k++){P2=paomadeng2[k];delay(123);}}RI=0;//软件清零}}
}//用于串口传递数据
void int0() interrupt 0 using 0{EX0=0;//禁止外部中断0SBUF=0xFF;//数据送串口发送while(TI==0);//如果TI=0,表示没有发送完,循环等待TI=0;EX0=1;//中断返回前,打开外部中断0
}
乙机
//乙机
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//定义跑马灯数组
uchar code paomadeng1[]={0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0xFF};
uchar code paomadeng2[]={0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0xFF};//延时程序
void delay(uint t){uchar i;while(t--)for(i=0;i<200;i++);
}void main(){uchar i,j,k;TMOD=0x20;//设置定时器T1为方式2TH1=0xFD;//波特率9600TL1=0xFD;SCON=0x50;//设置串口为方式1接收PCON=0x00;//SMOD=0TR1=1;//启动T1EA=1;//总中断允许EX0=1;//INT0开中断IT0=0;//选择外部中断为低电平触发方式while(1){if(RI==0){//如果RI=0,表示没有接收到数据//正常走马灯for(i=0;i<=8;i++){P2=paomadeng2[i];delay(123); //如果有信息传过来,直接中断if(RI!=0){break;}}}else{for(j=0;j<3;j++){//重复三次for(k=0;k<=8;k++){P2=paomadeng1[k];delay(123);}}RI=0;//软件清零}}
}//用于串口传递数据
void int0() interrupt 0 using 0{EX0=0;//禁止外部中断0SBUF=0xFF;//数据送串口发送while(TI==0);//如果TI=0,表示没有发送完,循环等待TI=0;EX0=1;//中断返回前,打开外部中断0
}
采用中断之后灵敏多了,大家快去试试吧!!!
总结
继续加油。
相关文章:
单片机双机通信控制跑马灯
实验要求 两个单片机各驱动8个LED灯,构成两个跑马灯,要求甲单片机LED的点亮方式是从上至下,首先是最上面第一个点亮、其次是前两个点亮、其次是前三个点亮……直至8个灯全部点亮,8个灯全部灭,重复这个过程,…...
微信小程序:button微信开放能力打开客服会话分享到聊天框
文档 https://developers.weixin.qq.com/miniprogram/dev/component/button.html 打开客服会话 按钮关键属性 open-type"contact"功能按钮 <button class"mo-open-type"open-type"contact"> </button>分享 <button class&q…...
【数据结构】——队列实现二叉树的功能
前言:二叉树的实现方式多种多样,有数组实现满二叉树,有链表实现完全二叉树,今天我们就用队列来实现二叉树。 创建二叉树: typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTre…...
【已解决】Win7虚拟机安装VMtools报错
在做以前的实验的时候发现要用到Win7虚拟机,于是就安装了一个Win7的虚拟机,但是发现屏幕太小,而且来回复制文本、复制文件太不方便了,索性就安装了VMtools,发现还安装不成– 情况1 报错:本程序需要您将此…...
华为OD机试真题-小明找位置-2023年OD统一考试(C卷)
题目描述: 小朋友出操,按学号从小到大排成一列;小明来迟了,请你给小明出个主意,让他尽快找到他应该排的位置。 算法复杂度要求不高于nLog(n);学号为整数类型,队列规模<10000; 输…...
2023.2版idea安装教程,现在jdk8已经过去式了,不同idea支持的jdk不同。升级jdk后idea也要随之升级
下载idea2023.2版本,下载之前需要删除之前的版本,一定要删除干净,删除程序要勾选那两个delete 下载路径:其他版本 - IntelliJ IDEA (jetbrains.com.cn) 选择2023.2版本 下载后进入安装程序,选择安装目录,然…...
CSS3技巧36:让内容垂直居中的三种方式
让内容垂直居中,是一个很重要的应用情景,在很多场合都会需要。这也是面试的时候,一些考官喜欢拿来初面的小题目。 这里,小结下让内容垂直居中的三种方式。 当然,读者如果有更好的方法,也可以提出来。 基本…...
空间运算设备-Apple Vision Pro
苹果以其在科技领域的创新而闻名,他们致力于推动技术的边界,这在他们的产品中表现得非常明显。他们尝试开发一项的新型突破性显示技术。在 2023 年 6 月 5 日官网宣布将发布 Apple Vision Pro 头戴空间设备,我们一起来了解一下 Apple Vision …...
cocos creator “TypeError: Cannot set property ‘string‘ of null
背景: 学习cocos creator时遇到"TypeError: Cannot set property string of null" 错误。具体代码如下:property({ type: Label })public stepsLabel: Label | null null;update(deltaTime: number) {this.stepsLabel.string Math.floor(…...
简谈MySQL的binlog模式
一、MySQL的binlog模式介绍 MySQL的binlog模式是一种日志模式,用于记录对MySQL数据库进行的更改操作。通过启用binlog模式,可以将数据库的更改操作记录到二进制日志文件中,以便在后续需要时进行恢复和复制。 要启用binlog模式,请…...
Linux 环境部署RabbitMQ
1.单机部署 我们在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一:在线拉取 docker pull rabbitmq:3-management 方式二:从本地加载(本文章带有mq安装包) docker load -i mq.tar 1.2.安装MQ 执行下面的命令来运行…...
【1day】泛微e-office OA系统xml.php 文件 SORT_ID 参数 SQL 注入漏洞学习
注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现...
智能无人零售:革新零售消费体验的未来
智能无人零售:革新零售消费体验的未来 在当今数字化时代,智能无人零售正以惊人的速度改变着我们的购物方式和消费体验。这一新兴领域的发展,为消费者带来了前所未有的便利和个性化选择。 智能无人零售是指利用先进的智能技术和自动化系统&…...
代币化对网约车区块链平台的影响
The effects of tokenization on ride-hailing blockchain platforms 再一次分析一下一篇关于区块链的文章,这篇文章比较新,2023年发表在POMS上。 由于这篇文章跟之前那几篇关注假货的文章的重点不一样,所以需要仔细读一下他的INTRODUCTION…...
YOLOv7 学习笔记
文章目录 前言一、YOLOv7贡献和改进二、YOLOv7核心概念三、YOLOv7架构改进总结 前言 在深度学习和计算机视觉领域,目标检测一直是一个极具挑战性和实用性的研究领域。特别是在实时目标检测方面,准确率和速度之间的平衡成为了关键考量因素。YOLO…...
【51单片机系列】74HC595实现对LED点阵的控制
本文是关于LED点阵的使用,使用74HC595模块实现对LED点阵的控制。 文章目录 一、8x8LED点阵的原理1.1 LED点阵显示原理1.2 LED点阵内部结构图1.3 开发板上的LED点阵原理图1.4 74HC595芯片 二、使用74HC595模块实现流水灯效果三、 使用74HC595模块控制LED点阵对角线亮…...
Canal笔记:安装与整合Springboot模式Mysql同步Redis
官方文档 https://github.com/alibaba/canal 使用场景 学习一件东西前,要知道为什么使用它。 1、同步mysql数据到redis 常规情况下,产生数据的方法可能有很多地方,那么就需要在多个地方中,都去做mysql数据同步到redis的处理&…...
C++的继承语法
在面向对象编程中,继承是一种强大的机制,允许一个类(子类)从另一个类(父类)继承属性和方法。C是一种支持面向对象编程的编程语言,通过其灵活而强大的继承语法,开发者可以构建更加模块…...
C# .NET平台提取PDF表格数据,并转换为txt、CSV和Excel表格文件
处理PDF文件中的内容是比较麻烦的事情,特别是以表格形式呈现的各种数据。为了充分利用这些宝贵的数据资源,我们可以通过程序提取PDF文件中的表格,并将其保存为更易于处理和分析的格式,如txt、csv、xlsx,从而更方便地对…...
spring boot学习第五篇:spring boot与JPA结合
1、准备表,创建表语句如下 CREATE TABLE girl (id int(11) NOT NULL AUTO_INCREMENT,cup_Size varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,age int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8mb4 COLLATEutf8mb4…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...
