甲、乙机之间采用方式 1 双向串行通信,具体要求如下: (1)甲机的 k1 按键可通过串行口控制乙机的 LEDI 点亮、LED2 灭,甲机的 k2 按键控制 乙机的 LED1

这篇具有很好参考价值的文章主要介绍了甲、乙机之间采用方式 1 双向串行通信,具体要求如下: (1)甲机的 k1 按键可通过串行口控制乙机的 LEDI 点亮、LED2 灭,甲机的 k2 按键控制 乙机的 LED1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(原创)Proteus 虚拟仿真。甲、乙机之间采用方式 1 双向串行通信,具体要求如下:

(1)甲机的 k1 按键可通过串行口控制乙机的 LEDI 点亮、LED2 灭,甲机的 k2 按键控制乙机的 LED1 灭、LED2 点亮,甲机的 k3 按键控制乙机的 LED1和 LED2 全亮。

(2)乙机的 K4 按键可控制串行口向甲机发送 k4按键接下的次数,并显示在甲机 P0 口的数码管上。

【附上本实验的全部资源链接(代码+仿真文件)

点击前往下载】

仿真图

甲、乙机之间采用方式 1 双向串行通信,具体要求如下: (1)甲机的 k1 按键可通过串行口控制乙机的 LEDI 点亮、LED2 灭,甲机的 k2 按键控制 乙机的 LED1

以下是实验代码(分甲乙两机程序 不会编写请移步资源下载 里边是全部代码和仿真文件)

//甲机
#include<reg51.h>
unsigned char j=10;
char sign=1;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
void delay(unsigned char k){
	unsigned char i,j,h;
	for(h=0;h<k;h++){
		for(i=0;i<25;i++){
			for(j=0;j<20;j++);
		}
	}
}
void twoDigitDisplay(unsigned char num,unsigned char time,unsigned char portNumber){
	unsigned char box[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0xf82,0xf8,0x80,0x90};
	unsigned char k;
	if(portNumber==0){
		if(num<0||num>99||time<0){
			for(k=0;k<40;k++){
				P2=0x00;
			}	
		}else{		
			for(k=0;k<time;k++){
				unsigned char numR = num%10;
				unsigned char numL = num/10;
				P2=0x11;
				P0=box[numL];
				delay(12);
				P2=0x22;
				P0=box[numR];
				delay(12);
			}
		}
	}	
}
void main(){
	unsigned char sum=0;
	TR0=1;
	EA=1;
	ET0=1;
	TMOD=0x21;
	TH0=0xee;
	TL0=0x00;
	
	while(1){
		if(sign==1){
			//执行数据发送
			TR1=1;
			TMOD=0x20;
			TL1=0xfd;
			TH1=0xfd;
			SCON=0x40;
			PCON=0x00;
		}
		while(sign==1){
			//发送数据SBUF
			if(P10==0){SBUF=0xfe;while(TI==0);TI=0;continue;}				
			if(P11==0){SBUF=0xfd;while(TI==0);TI=0;continue;}				
			if(P12==0){SBUF=0xfc;while(TI==0);TI=0;continue;}				
			SBUF=0xff;
		}
		if(sign==-1){
			//执行数据接收
			TR1=1;
			TL1=0xfd;
			TH1=0xfd;
			SCON=0x50;
			PCON=0x00;
		}
		while(sign==-1){
			//接收数据SBUF
			if(SBUF==0xf0){
				sum++;
				twoDigitDisplay(sum,5,0);
			}
			if(SBUF==0x0f){
				twoDigitDisplay(sum,5,0);
			}
		}
	}
}
void int0() interrupt 1 {
	j--;
	if(j==0){
		TF0=0;
		TH0=0xee;
		TL0=0x00;
		sign=sign*(-1);			
		j=10;					
	}	
}
//乙机
#include<reg51.h>
unsigned char j=10;
char sign=1;
sbit P10=P1^0;
void main(){
	unsigned char increment=0;
	TR0=1;
	EA=1;
	ET0=1;
	TMOD=0x21;
	TH0=0xee;
	TL0=0x00;
	if(sign==1){
		//执行数据接收
		TR1=1;
		TL1=0xfd;
		TH1=0xfd;
		TMOD=0x20;
		SCON=0x50;
		PCON=0x00;
	}
	while(sign==1){
		//接收数据SBUF
		P2=SBUF;
	}
	if(sign==-1){
		//执行数据发送
		TR1=1;
		TL1=0xfd;
		TH1=0xfd;
		SCON=0x40;
		PCON=0x00;
	}
	while(sign==-1){
		//发送数据SBUF
		if(P10==0){
			SBUF=0xf0;
			while(TI==0);TI=0;
		}else{
			SBUF=0x0f;
			while(TI==0);TI=0;
		}
	}
}
void int0() interrupt 1 {
	j--;
	if(j==0){
		TF0=0;
		TH0=0xee;
		TL0=0x00;
		sign=sign*(-1);			
		j=10;					
	}	
}

实验心得

1.程序的核心思想

本程序采用定时中断it0 定时,每隔50ms两机转换一次接收和发送状态。甲机开始默认执行发送,乙机默认接收。双机定时一致,到了时间后甲机由发送转为接收。乙机由接收转为发送。这样可保证双机步调完全相反。但推测:采用这样的方法,机器长时间运行,双机步调将逐渐不协调。达不到长期使用的目的。

① 甲机发送数据:甲机发送的数据SBUF由P1端口的三个开关的状态控制,交由乙机接收。
② 乙机接收数据:乙机接收甲机传送的SBUF,对其进行选择判断,从而让甲机P0端口的LED灯展示不同的效果。
③ 乙机发送数据:乙机在每次执行发送任务时,都会向甲机发送一个0xf0或者0x0f,默认为0xf0但当乙机的p10端口按钮按下时,乙机就会发送另外一个数据0x0f,交付甲机。
④ 甲机接收数据:甲机根据乙机穿来的数据SBUF的值作出判断。如果是0x0f, sum变量自增一然后用twoDigitDisplay(sum,5,0) 函数进行显示。如果是0xf0 ,sum变量值不增,直接交给twoDigitDisplay(sum,5,0) 函数显示。

2.实验中遇到的问题

由于编程较为匆忙,实验未将switch替换成button,导致开关k1到k3按下时必须手动断开才能进行下次状态的切换。而且数码管显数会有微小的闪烁,推测延时函数delay参数设置存在问题。
感兴趣的朋友可以继续改进,欢迎与我交流。文章来源地址https://www.toymoban.com/news/detail-482990.html

本文完全原创 请尊重劳动果实 欢迎转发 点赞 不定时更新更多单片机实验内容。

最后附上本实验的全部资源链接(代码+仿真文件)

点击前往下载

到了这里,关于甲、乙机之间采用方式 1 双向串行通信,具体要求如下: (1)甲机的 k1 按键可通过串行口控制乙机的 LEDI 点亮、LED2 灭,甲机的 k2 按键控制 乙机的 LED1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ENSP:三个路由器两台主机,要求两台主机之间可以通信

    首先配置两台主机的IP PC1 PC2 重命名三台路由设备并配置端口IP: R1 R2 R3 下面进行配置关键步骤,路由之间的连通 ps:设置路由之间的联通命令是 ip route-static 目标网段 子网掩码 下一跳IP 在此处需要注意的是主机与自己的路由之间是不用管的,默认设置好网关后就是通的,而不

    2024年02月12日
    浏览(82)
  • python模块websockets,浏览器与服务器之间的双向通信

    一、简介 WebSocket是一种在Web浏览器和服务器之间进行实时双向通信的协议。它通过建立一条持久的连接,允许服务器主动向客户端推送数据,实现实时性和双向通信的能力。 与传统的HTTP请求-响应模式不同,WebSocket提供了一个长时间运行的连接,可以在客户端和服务器之间进

    2024年02月21日
    浏览(42)
  • Linux系统编程:采用管道的方式实现进程间通信

    目录 一. 进程间通信概述 二. 管道的概念  三. 通过管道实现进程间通信 3.1 实现原理 3.2 匿名管道创建系统接口pipe 3.3 管道通信的模拟实现 3.4 管道通信的访问控制规则 3.5 管道通信的特点 四. 通过匿名管道实现进程池 4.1 进程池的概念 4.2 进程池的模拟实现 五. 命名

    2024年02月12日
    浏览(38)
  • Java线程之间通信方式

    在实际开发时,一个进程中往往有很多个线程,大多数线程之间往往不是绝对独立的,比如说我们需要将A和B 两个线程的执行结果收集在一起然后显示在界面上,又或者比较典型的消费者-生产者模式,在这些场景下,线程间通信成了我们必须使用的手段,那么线程之间怎么通

    2024年02月09日
    浏览(36)
  • vue组件之间通信方式

    一、全局事件总线 范围 :任意组件间 步骤 :1、创建事件总线 第一种方式:通过自定义事件总线方式 局部引用 第二种方式:通过原型绑定 main.js 局部引用 解绑事件 二、props和$emit 范围 :父子组件间 父组件 子组件 三、Vuex(状态管理) 范围 :多个组件之间共享状态,可以

    2024年03月10日
    浏览(42)
  • 微服务之间的通信方式

    目录 微服务之间的通信方式 根据场景选择对应的通信方式 异步通信区别与选择 .Net示例 java示例 微服务之间的通信方式常见的有以下几种: 同步通信:微服务之间通过请求-响应的方式进行通信,例如RESTful API和RPC。通信过程中,请求方需要等待响应方的返回结果,因此可靠

    2024年02月05日
    浏览(33)
  • vue 组件之间通信的方式

    1.父向子版  父组件设置自定义属性 子组件props接收 2.子向父版 父组件设置自定义方法并绑定接收的方法 子组件触发方法  3.全局事件总线   4.Vuex 用这个的话首先要装包或者创建工程的时候选择这个选项手脚架会给你装好 5.路由 抽象一点说路由也算通信方式的一种吧 这种

    2024年01月18日
    浏览(37)
  • 【Docker】docker中容器之间通信方式

    点击跳转:Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务全套(质量有保证,内容详情) 容器重启后,ip会发生变化。通过容器ip访问不是一个好的方案。 通过宿主机的 ip:port 访问,只能依靠监听在暴露出的端口的进程来进行有限的通信。 容器之间通信不能用 l

    2024年02月15日
    浏览(46)
  • AI生成--Vue组件之间通信方式有哪些

    Vue组件之间通信方式有以下几种: 父子组件通信:父组件可以通过props传递数据给子组件,子组件通过$emit触发事件通知父组件。 兄弟组件通信:可以通过共同的父组件作为中介,兄弟组件通过 e m i t 和 emit和 e mi t 和 on触发和监听事件实现通信。 跨级组件通信:可以使用p

    2024年02月08日
    浏览(36)
  • 07-Vue技术栈之(组件之间的通信方式)

    前言: 组件之间通信的方式有很多种,比如 props 、 自定义事件 、 全局事件总线 、 消息订阅与发布 、 父链与子组件索引 、 插槽 、 Vuex 等都可以实现组件之间的通信。在这里我将介绍以下三种通信方式。 它是一种组件间通信的方式,适用于: 子组件 === 父组件 使用场景

    2024年02月07日
    浏览(92)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包