51单片机双机通信

news2024/9/25 23:14:12

对于这个51单片机双机通信,之前无聊做的玩的,但是既然写了一篇51单片机串行口通信的博客,那就顺便出来供大家学习,希望能够帮助到一些刚刚接触51单片机的朋友。废话不多讲,直接上正题。

1、实习任务

1.1 任务目的 

通过单片机之间的双机通信设计,进一步学习定时器的功能和编程使用,理解穿行通信与并行通信两种通信方式的异同,掌握串行通信的重要指标:字符帧和波特率,初步了解MCS-51系列单片机串行口的使用方法。

1.2 任务要求 

本任务是建立一个简单的单片机串行口双机通信测试系统。系统中,发射与接收各用一套STC89C51单片机电路,成为甲机和乙机。编制程序,使甲、乙双方能够进行串行通信。要求:将甲机内的多个数据(例如1,3,4,6,7,5共六个数据)发送个乙机,并在乙机的六个数码管上显示出来。

 2、系统总体设计

2.1 设计思路 

STC89C52单片机双机通信可以采用串口通信的方式。首先要确定串口通信的参数,包括波特率、数据位、停止位和校验位。编写发送程序和接收程序,可以使用C语言编写程序,在发送端将要传输的数据存储在发送缓冲区中,然后根据协议依次发送每个字节。在接收端收到数据后,根据协议依次读取每个字节并存储到接收缓冲区中。使用定时器或者外部终端等方式实现异步通信。可以在发送端通过定时器产生中断来发送数据,而在接收端通过外部中断的方式接收数据。实现数据的校验,为保证数据的完整性和正确性,可以使用校验位、CRC等方式实现数据校验。进行调试和测试,设计完成后,可以通过实际测试来验证通信的可靠性和稳定性,针对不同情况进行调整和优化。需要注意的是,在进行STC89C52单片机双机通信时,应根据具体实际情况进行选择和调整,比如要考虑到硬件电路的设计和外界干扰等因素,保证通信的稳定和可靠性。

2.2 设计结构框图 

3、51单片机双机通信原理图、仿真图及实物图

3.1 原理图 

原理图的组成是:两个51单片机最小系统,还有一个按键及一个数码管显示。至于51最小系统的知识,我已经在前面的博客讲解过了,不懂得朋友可以翻看我之前的博客的。这里没有画USB转TTL下载模块,由于资源有限,就只能在开发板上下载好程序之后再把芯片拿出来放到自己制作的手工电路板了。

3.2 仿真图 

没有允许仿真如下图:

仿真图也是很简单的。 

开始的时候乙机数码管初始化为0。按一下按键就送发1,后面相应的发送2、3、4、5、6、7、8、9,然后又从0开始发。

3.3 实物图 

上图是发送数据0的现象。

上图是发送数据9的现象。

4、程序

甲机(主机)是属于发送机,按键发送数据;乙机(从机)属于接收机,接收后数码管显示出甲机(主机)发送个数据。 甲机(主机)只发不接,乙机(从机)只接不发。

甲机(主机) 

main.c

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"
sbit KEY = P1^7;//按键口
unsigned char flag;
unsigned char count;
unsigned char DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main()
{
	P2=0xc0;
	UartInit();		
	while(1)
	{	
		P2=DSY_CODE[count];	
		if(KEY==0)
		{
			Delay(20);
			if(KEY==0)
			{
				flag=1;
				count++;
			}
			while(!KEY);
		}
		if(count>9)count=0;
        if(flag)
        {
            flag=0;
             switch(count)
            {
                case 0:UART_SendByte(0);break;
                case 1:UART_SendByte(1);break;
                case 2:UART_SendByte(2);break;
                case 3:UART_SendByte(3);break;
                case 4:UART_SendByte(4);break;
                case 5:UART_SendByte(5);break;
                case 6:UART_SendByte(6);break;
                case 7:UART_SendByte(7);break;
                case 8:UART_SendByte(8);break;
                case 9:UART_SendByte(9);break;        
            }
        }

	}
}


void TR_process(void) interrupt 4
{
        if(RI)
        {
                RI = 0;               
        }
}

Delay.c


void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

UART.c

#include <REGX52.H>

void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;			//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES=1;		//串口中断允许控制位
	EA=1;		//中断允许总控制位
}


void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;
}

UART.h

#ifndef __UART_H__
#define __UART_H__

void UartInit();
void UART_SendByte(unsigned char Byte);

#endif

 乙机(从机)

main.c

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"
unsigned char DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main()
{
	P2=0xc0;
	UartInit();		//串口初始化
	while(1);
}

void UART_Routine() interrupt 4
{
        if(RI)
        {
            RI=0;		
            switch(SBUF)
            {
                case 0x00: P2=DSY_CODE[0];break;
                case 0x01: P2=DSY_CODE[1];break;
                case 0x02: P2=DSY_CODE[2];break;
                case 0x03: P2=DSY_CODE[3];break;
                case 0x04: P2=DSY_CODE[4];break;
                case 0x05: P2=DSY_CODE[5];break;
                case 0x06: P2=DSY_CODE[6];break;
                case 0x07: P2=DSY_CODE[7];break;
                case 0x08: P2=DSY_CODE[8];break;
                case 0x09: P2=DSY_CODE[9];break;
            }
        }
        if(TI)
        {
            TI=0;
        }
}

Delay.c


void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

UART.c

#include <REGX52.H>


void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;			//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES=1;		//串口中断允许控制位
	EA=1;		//中断允许总控制位
}


void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;
}

/*
void UART_Routine() interrupt 4
{
	if(RI==1)
	{
		
		RI=0;
	}
}
*/

UART.h

#ifndef __UART_H__
#define __UART_H__

void UartInit();
void UART_SendByte(unsigned char Byte);

#endif

最后提醒一下,这里我使用的数码管是共阳数码管的,如果使用共阴数码管的朋友则是不符合我的代码、原理图、仿真图的,因为共阴数码管和共阳数码管的公共端的接法是不一样的,这里就不多说关于数码管的知识了,感兴趣的朋友可以自己去了解。

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

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

相关文章

AIGC人工智能辅助开发:提升效率、优化代码、实现智能编程

文章目录 1. 什么是AIGC人工智能辅助开发&#xff1f;2. AIGC的优势和应用场景2.1 提升开发效率2.2 优化代码质量2.3 实现智能编程 3. 如何用好AIGC人工智能辅助开发&#xff1f;3.1 选择合适的AIGC工具3.2 理解AIGC的工作原理3.3 逐步应用AIGC辅助开发3.4 主动参与AIGC的学习和…

Raki的读paper小记:RWKV: Reinventing RNNs for the Transformer Era

Abstract&Introduction&Related Work 研究任务 基础模型架构已有方法和相关工作 RNN&#xff0c;CNN&#xff0c;Transformer稀疏注意力&#xff08;Beltagy等人&#xff0c;2020年&#xff1b;Kitaev等人&#xff0c;2020年&#xff1b;Guo等人&#xff0c;2022年&am…

组合模式——树形结构的处理

1、简介 1.1、概述 树形结构在软件中随处可见&#xff0c;例如操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等。如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题。组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形…

Flowable-中间事件-补偿中间抛出事件

定义 补偿中间抛出事件用于触发一个补偿&#xff0c;当执行到达补偿中间抛出事件时触发该流程已完成活动 的边界补偿事件&#xff08;Compensate Boundary Interrputing Event&#xff09;&#xff0c;完成补偿操作后自动执行后继路线。 图形标记 补偿中间抛出事件显示为普通…

【elasticsearch系】1.初识玩转elasticSearch

首先给大家介绍下我使用的版本是7.17.3这个版本&#xff0c;关于之前6.x的版本还是有些区别的。 elasticSearch Elasticsearch 是一个分布式文档存储。Elasticsearch 不是将信息存储为列式数据行&#xff0c;而是存储已序列化为 JSON 文档的复杂数据结构。存储文档时&#xff0…

PHP8的数据类型-PHP8知识详解

在PHP8中&#xff0c;变量不需要事先声明&#xff0c;赋值即声明。 不同的数据类型其实就是所储存数据的不同种类。在PHP8.0、8.1中都有所增加。以下是PHP8的15种数据类型&#xff1a; 1、字符串&#xff08;String&#xff09;&#xff1a;用于存储文本数据&#xff0c;可以使…

【深度学习】High-Resolution Image Synthesis with Latent Diffusion Models,论文

13 Apr 2022 论文&#xff1a;https://arxiv.org/abs/2112.10752 代码&#xff1a;https://github.com/CompVis/latent-diffusion 文章目录 PS基本概念运作原理 AbstractIntroductionRelated WorkMethodPerceptual Image CompressionLatent Diffusion Models Conditioning Mec…

【13】STM32·HAL库-正点原子SYSTEM文件夹 | SysTick工作原理、寄存器介绍 | printf函数使用、重定向

目录 1.sys文件夹介绍&#xff08;掌握&#xff09;2.deley文件夹介绍&#xff08;掌握&#xff09;2.1deley文件夹函数简介2.2SysTick工作原理2.3SysTick寄存器介绍2.4delay_init()函数&#xff08;F1&#xff09;2.5delay_us()函数&#xff08;F1&#xff09;2.6delay_ms()函…

网络安全-防御需知

目录 网络安全-防御 1.网络安全常识及术语 资产 漏洞 0day 1day 后门 exploit APT 2.什么会出现网络安全问题&#xff1f; 网络环境的开放性 协议栈自身的脆弱性 操作系统自身的漏洞 人为原因 客观原因 硬件原因 缓冲区溢出攻击 缓冲区溢出攻击原理 其他攻击…

Java另一种debug方法(not remote jmv debug),类似python远程debug方式

这种Debug类似python的debug方式&#xff0c;是运行时将业务代码及依赖推送到Linux并使用Linux的java运行运行程。只要本地能运行&#xff0c;就能自动将代码推送到Linux运行&#xff0c;不需打包及设置远程debug jvm参数&#xff0c;适合一些项目Debug调试 运行时会推送一些依…

Flowable-中间事件-空中间抛出事件

定义 空中间抛出事件是一个 Throwing 事件&#xff0c;在 intermediateThrowEvent 元素下不加入任何的事件定 义元素&#xff0c;就构成一个空中间抛出事件。它通常用于表示流程中的某个状态&#xff0c;在实际使用的过程中可 以通过添加执行监听器&#xff0c;来表示流程状态…

js原型以及原型链

目录 原型隐式原型显式原型constructornew操作符 重写原型对象原型链继承原型链继承借用构造函数继承组合构造继承 原型继承寄生继承组合寄生继承 原型继承关系 原型 在JavaScript中&#xff0c;每个对象都有一个内置属性[[prototype]]&#xff0c;这个属性指向一个另一个对象…

Nginx实现反向代理和负载均衡

Nginx安装 本文章主要介绍下&#xff0c;如何使用Nginx来实现反向代理和负载均衡&#xff0c;Nginx安装和基础知识&#xff0c;可参考我的这篇文章 Nginx安装。 Nginx实现反向代理 实现反向代理需要准备两台Nginx服务器。一台Nginx服务器A&#xff0c;ip为 192.168.206.140&…

Linux下查找python路径

本地目前装了几个版本的python&#xff0c;这里记录下查找python路径的方法。 1&#xff1a;whereis命令 whereis python2&#xff1a;which命令 which python与whereis相似&#xff0c;但which会返回第一个找到的执行文件的位置。 3&#xff1a;find命令 find命令可以搜索系…

Power BI-云端报表定时刷新--ODBC、MySQL、Oracle等其他本地数据源的刷新(二)

ODBC数据源 一些小众的数据源无法直接连接&#xff0c;需要通过微软系统自带的应用“ODBC数据源”连接。 1.首次使用应安装对应数据库的ODBC驱动程序&#xff0c;Mysql的ODBC驱动需要手动安装 2.在web服务中进行数据源的配置 Mysql数据源 1.Powerbi与Gateway第一次连SQL…

❤️创意网页:创意视觉效果粒子循环的网页动画

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

【雕爷学编程】MicroPython动手做(15)——掌控板之AB按键2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

【嵌入式Linux项目】基于Linux的全志H616开发板智能家居项目(语音控制、人脸识别、安卓APP和PC端QT客户端远程操控)有视频功能展示

目录 一、功能需求 二、开发环境 1、硬件&#xff1a; 2、软件&#xff1a; 3、引脚分配&#xff1a; 三、关键点 1、设计模式之工厂模式 2、wiringPi库下的相关硬件操作函数调用 3、语音模块的串口通信 4、线程 5、摄像头的实时监控和拍照功能 6、人脸识别 四、编…

❤️创意网页:炫酷的网页 - 创造华丽粒子动画

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

操作系统攻击:早期WindowsMS10-046漏洞

目录 概述 漏洞成因 利用过程 漏洞复现 漏洞修复 概述 本次介绍早期的windows高危漏洞——MS10_046_SHORTCUT_ICON_DLLLOADER &#xff0c; 该漏洞可以通过浏览器跳转网络资源的方式利用&#xff0c;结合xss攻击用户的系统 危险性极高。 漏洞成因 漏洞成因&#xff1a; m…