单片机双机通信控制跑马灯

news2024/11/24 11:56:48

实验要求

两个单片机各驱动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博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_64066303/article/details/134101256?spm=1001.2014.3001.5501

查询控制

当面对一个题目的时候可以进行分解,我这里是将题目分解成了以下三个部分:LED跑马灯、独立按键、双机通信。

LED跑马灯

之前经常实现的是流水灯,这个跑马灯是类似,如果对移位掌握的不好的话,就建议还是采用数组来存储将对应点亮的LED灯,数组储存起来之后遍历数组就行了,因为他情况有有限,用数组储存最好理解了,我这里采用的是共阳极的接法,给0表示亮,1表示不亮,然后8根线对应01,用十六进制数来表示将LED点亮的状态。

独立按键

独立键盘接口设计(Keil+Proteus)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_64066303/article/details/134253686?spm=1001.2014.3001.5501这个的思路就是我给一个引脚接一个按钮,然后先给他赋值为1,如果读这个引脚他的值变成了0,就表示他被按下去了。

双机通信

串行口的工作原理及应用-CSDN博客icon-default.png?t=N7T8https://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为方式2
	TH1=0xFD;//波特率9600
	TL1=0xFD;
	SCON=0x50;//设置串口为方式1接收
	PCON=0x00;//SMOD=0
	TR1=1;//启动T1
	while(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为方式2
	TH1=0xFD;//波特率9600
	TL1=0xFD;
	SCON=0x50;//设置串口为方式1接收
	PCON=0x00;//SMOD=0
	TR1=1;//启动T1
	while(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博客icon-default.png?t=N7T8https://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为方式2
	TH1=0xFD;//波特率9600
	TL1=0xFD;
	SCON=0x50;//设置串口为方式1接收
	PCON=0x00;//SMOD=0
	TR1=1;//启动T1
	EA=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;//禁止外部中断0
	SBUF=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为方式2
	TH1=0xFD;//波特率9600
	TL1=0xFD;
	SCON=0x50;//设置串口为方式1接收
	PCON=0x00;//SMOD=0
	TR1=1;//启动T1
	EA=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;//禁止外部中断0
	SBUF=0xFF;
	//数据送串口发送
	while(TI==0);//如果TI=0,表示没有发送完,循环等待
	TI=0;
	EX0=1;//中断返回前,打开外部中断0
}

 采用中断之后灵敏多了,大家快去试试吧!!!

总结

继续加油。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1297210.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于ssm校园短期闲置资源置换平台源码和论文

idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 环境&#xff1a; jdk8 tomcat8.5 开发技术 ssm 基于ssm校园短期闲置资源置换平台源码和论文755 摘要 校园短期闲置资源置换平台是校园短期闲置资源置换必不可少的一个部分。在校园短期闲置资源置换的整个过程…

07-2 Python模块和命名空间

1. 模块 概念&#xff1a;其实就是一个Python文件&#xff0c;正常文件有的变量&#xff0c;函数&#xff0c;类&#xff0c;模块都有 功能:模块可以被其它程序引入&#xff0c;以使用该模块中的函数等功能。 示例&#xff1a;test-module.py调用mymodule.py模块中的now_time…

Ubuntu编译文件安装SNMP服务

net-snmp源码下载 http://www.net-snmp.org/download.html 编译步骤 指定参数编译 ./configure --prefix/root/snmpd --with-default-snmp-version"2" --with-logfile"/var/log/snmpd.log" --with-persistent-directory"/var/net-snmp" --wi…

CSS3技巧36:让内容垂直居中的三种方式

让内容垂直居中&#xff0c;是一个很重要的应用情景&#xff0c;在很多场合都会需要。这也是面试的时候&#xff0c;一些考官喜欢拿来初面的小题目。 这里&#xff0c;小结下让内容垂直居中的三种方式。 当然&#xff0c;读者如果有更好的方法&#xff0c;也可以提出来。 基本…

scikit-learn实现线性回归

要学习scikit-learn,我们必须要到scikit-clearn的官网中去查看公式和原理 scikit-learn 官网 scikit-learn 中文社区 进入官网一以后我们找到回归&#xff0c;然后再有监督学习中找到线性模型 scikit-learn实现简单的线性回归 公式&#xff1a; L2范数是指向量中每个元素的平…

已通过考试和认证注册以及后续计划表

已通过考试和认证注册以及后续计划表 软考 - 计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试信息系统集成及服务项目管理人员工程类考试计划你关注的证书样子 软考 - 计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试 高级 信息系统项目管理师&…

vite+vue3实现动态路由

在做这个动态路由的时候踩了很多坑&#xff0c;其中大部分是粗心了 动态菜单主要是导入的方式 import.meta.glob 参考&#xff1a;功能 | Vite 官方中文文档 1、多层路由渲染&#xff08;用3层路由做demo&#xff09; 拿到接口的数据是后台直接处理好的结构&#xff0c;但是…

3_CSS层叠样式表基础

第3章-CSS层叠样式表基础 学习目标(Objective) 掌握标签选择器的使用掌握类选择器的使用了解id选择器和通配符选择器掌握font属性和color属性的应用 1.HTML的局限性 如果要改变下高度或者变一个颜色&#xff0c;就需要大量重复操作 总结&#xff1a; HTML满足不了设计者的需…

OpenCL学习笔记(三)手动编译开发库(win10+mingw64)

前言 有的小伙伴仍然在使用mingw编译器&#xff0c;这时只能重新编译opencl的sdk库。本文档简单记录下win10下&#xff0c;使用mingw11.20编译的过程&#xff0c;有需要的小伙伴可以参考下 一、安装所需软件 1.安装git&#xff0c;教程比较多&#xff0c;不再重复 2.安装cm…

放大镜是否可以会聚光线?为什么?

放大镜是否可以会聚光线&#xff1f;为什么&#xff1f; 实验日期&#xff1a;2019年8月24日 操作用具&#xff1a;放大镜&#xff0c;手电筒&#xff0c;一张白纸 猜 测&#xff1a;放大镜可以会聚光线&#xff0c;因为放大镜是凸透镜&#xff0c;凸透镜可以会聚光线。 实…

C#-快速剖析文件和流,并使用

目录 一、概述 二、文件系统 1、检查驱动器信息 2、Path 3、文件和文件夹 三、流 1、FileStream 2、StreamWriter与StreamReader 3、BinaryWriter与BinaryReader 一、概述 文件&#xff0c;具有永久存储及特定顺序的字节组成的一个有序、具有名称的集合&#xff1b; …

Nacos 2.3.0 正式发布,堪称最强!

2023年12月7日&#xff0c;Nacos 2.3.0&#xff0c;正式发布了它的最新版本。经过一个多月社区的精心测试与优化&#xff0c;新版本在功能和性能上均有显著提升。 Nacos 2.3.0的发布&#xff0c;可以说是一场关于配置管理的小型革命。它不仅仅是一个版本的迭代&#xff0c;更是…

Mybatis XML 多表查询

这篇需结合 <<Mybatis XML 配置文件>>那一篇博客一起看 工作中尽量避免使用多表查询,尤其是对性能要求非常高的项目 我们之前建了个用户表(代码在Mybatis XML配置文件那篇博客里),这次再建一个文章表,代码如下 : -- 创建⽂章表 DROP TABLE IF EXISTS articleinf…

armbian系统安装和卸载snmp服务(SNMPV2操作版本)

文章目录 说明基知干净卸载snmp服务并清除配置文件安装SNMPSNMPV2远程连接配置基本设备信息查询问题Errors were encountered while processing: snmpdCannot adopt OID…… 说明 由于各位小伙伴&#xff0c;可能在安装过程中出现意外或者其他情况&#xff0c;本文先说明卸载步…

金融专题 | 对复杂的金融工具进行设计、定价和对冲分析

金融行业使用 Financial Instruments Toolbox™ 执行现金流建模和收益率曲线拟合分析、计算价格和敏感度、查看价格演变&#xff0c;并使用普通股权和固定收益建模方法执行对冲分析。 借助该工具箱&#xff0c;您可以创建新的金融工具类型&#xff0c;使用参数拟合模型和息票剥…

预训练--微调

预训练–微调 一个很简单的道理&#xff0c;如果我们的模型是再ImageNet下训练的&#xff0c;那么这个模型一定是会比较复杂的&#xff0c;意思就是这个模型可以识别到很多种类别的即泛化能力很强&#xff0c;但是如果要它精确的识别是否某种类别&#xff0c;它的表现可能就不…

html、css类名命名思路整理

开发页面时&#xff0c;老是遇到起名问题&#xff0c;越想越头疼&#xff0c;严重影响开发进度&#xff0c;都是在想名字&#xff0c;现在做一下梳理&#xff0c;统一一下思想&#xff0c;希望以后能减少这块的痛苦。 命名规则 [功能名称]__[组成部分名称]--[样式名称] 思路…

小红书自动点赞工具,其成功分享与引流攻略从入门到精通

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、小红书引流的优势 小红书作为一个社交电商平台&#xff0c;具有巨大的引流潜力。其独特的UGC&#xff08;用户生成内容&#xff09;模式使得用户可以轻松地分享自己的购物心得…

python主流开发工具排名,python开发工具有哪些

本篇文章给大家谈谈python的开发工具软件有哪些&#xff0c;以及python主流开发工具排名&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 python中用到哪些软件 一、Python代码编辑器1、sublime Textsublime Text是一款非常流行的代码编辑器&#xff0c;支持P…

Python渗透测试——一、数据包的编辑工具——Scapy

Python渗透测试 一、Scapy简介二、Scapy中的分层结构三、Scapy中的常用函数四、在Scapy 中发送和接收数据包五、Scapy 中的抓包函数 一、Scapy简介 提到数据包(这里泛指帧、段和报文等)的构造&#xff0c;我们首先需要了解协议和分层这两个概念。在“互联世界的规则一协议”中…