【PROTEUS-51单片机串口通信仿真】

这篇具有很好参考价值的文章主要介绍了【PROTEUS-51单片机串口通信仿真】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概要

本次实验对51单片机的串口进行了双机通信的仿真,实现了51单片机的简单双机通信;现对本次仿真的结构及实现的功能做简要的介绍,
本次仿真主要构成:主机U1-MASTER、从机U2-SLAVE、以及LED显示部分(第一部分显示主机接收到的信息、第二部分显示从机接收到的信号);
实现的功能:主机通过串口发送信息给从机,从机接收到信息后通过从机旁边LED显示;从机通过串口发送信息给主机,主机收到后通过旁边LED显示。
简单的通信协议:通信双方均选用9600波特的传输速率,系统的主频为11.0952MHz,主机的呼叫号为0,即主机地址;从机的呼叫号为1,即从机地址,发送的数据以$为结束符号;通信时发送的数据为两部分,一是通信对象,二是内容。

仿真实图

1、主机部分:
c51仿真串口模型器件,proteus,单片机,嵌入式硬件
2、从机部分: c51仿真串口模型器件,proteus,单片机,嵌入式硬件
3、仿真效果图
c51仿真串口模型器件,proteus,单片机,嵌入式硬件

程序

1、主机程序

uart.c

#include "uart.h"

u8 RXstart; //开始接收
u16 RXData; //接收数据位
u16 temp[10] = {0};  //数组接收
int j = 0;


//串口初始化,定时器1模式2,波特率为9600bps,晶振频率11.592MHz
void UartInit()
{
	SCON = 0XD0;  //串口模式3,主从+波特率可变,允许接收,清空收发中断标志位
								//主机SM2不置位,从机SM2要置位
	
	TMOD = 0x20;  //设置定时器1为模式2,8位自动重装载模式
	TH1 = 0xfd;   //波特率计算式:[256-(K*Fosc)/(384*BaudeRate)]h
	TL1 = 0XFD;   
	TR1 = 1;     //开定时器1中断
	
	REN = 1;  //允许串口接收
	PCON &= 0X7F; //禁止波特率倍增K=1;
	ES = 1;   //开串口中断
	
	EA = 1;   //开总中断
	
}

//主机数据发送函数以$结束,主机先发地址TB8=1,后发数据TB8=0;
void UartSendData(u8 addr,u8 *str)
{

	TB8 = 1;  //发送地址
	SBUF = addr;  //通过SBUF发送出去
	while(!TI);  //判断是否发送成功,成功发送TI被置1,要手动复位
	TI = 0;  //复位
	
	TB8 = 0;  //发送数据
	while(*str != '\0')  //发送数组
	{
		SBUF = (*str);
		while(!TI);  //判断是否发送完一组数据
		TI = 0;
		str++;
	}
}


//主机接收数据,串口中断服务函数
void UartRData() interrupt 4  //串口中断服务函数
{
	
	ES = 0;  //关闭串口中断
	
	if(RI)   //再判断是否接收到数据,接收到数据RI会被置1
	{
		RXData = SBUF;  //接收数据
		
		if(RXData == MasterAddr0)  //判断是否呼叫本机
		{
			RXstart = 1;  //开始接收数据
			SM2 = 0;      //配置为接收数据模式
			j = 0;
		}

		if(RXstart) //判断是否接收过本地址
		{
			if(RXData != '$')  //判断是否接收到数据结束标志$
			{
				temp[j] = RXData;  //没有接收到结束标志$,正常保存数据
				j++;
			}
			else   //接收到数据结束标志$
			{
				RXstart = 0;  //数据接收结束
				SM2 = 1;   //重新配置为只接收地址,下次发送TB8=1才中断
				j = 0;
			}
		}
	}
	RI = 0;  //清除接收中断标志位
	ES = 1;  // 开串口中断
}

uart.h

#ifndef __UART_H
#define __UART_H

#include "reg52.h"

#ifndef u16
#define u16 unsigned int
#endif

#ifndef u8
#define u8 unsigned char
#endif

#define MasterAddr0 0   //主机号/地址

extern u16 temp[10];  //数组接收



void UartInit();
void UartSendData(u8 addr,u8 *str);
void UartRData();




#endif

main.c

#include "reg52.h"
#include "uart.h"

//从机地址SlaveAddr:0~9
#define SlaveAddr1 1   //从机号(地址)

extern u16 temp[10];  //数组接收
#define LED P0

void delay(u16 i);


void main()
{
	u8 i;
	
	UartInit();
	while(1)
	{
		
		UartSendData(SlaveAddr1,"168$");
		
		for(i=0;i<10;i++)
		{
			LED = temp[i];
			delay(50000);
		}
	}
}

void delay(u16 i)
{
	while(i--);
}


2、从机程序

uart.c

#include "uart.h"

u8 RXData;  //接收数据
u8 RXstart; //接收标志
u16 temp[10] = {0};  //数据缓存
int j;


//串口初始化函数,定时器1模式2,波特率9600bps,晶振频率11.0592MHz
void UartInit()
{
	SCON = 0XF0; //串口模式3,SM2接收地址,允许接收EN,清空收发标志
	
	TMOD = 0X20; //定时器1模式2,8位重装载模式
	TH1 = 0XFD;
	TL1 = 0XFD;
	TR1 = 1; //开定时器中断1
	
	PCON &= 0X7F;  //波特率不倍增
	ES = 1;  //开串口中断
	EA = 1;  //开总中断
	
}


//从机发送函数,从机发送给主机的数据帧要以字符‘0’开头,标识这是发给主机的
void SendData(u8 addr,u8 *str)
{
	TB8 = 1;//发送地址
	SBUF = addr;  //通过SBUF发送出去
	while(!TI);  //判断是否发送成功
	TI = 0;  //清除发送中断标志位
	TB8 = 0;  //发送数据
	
	while(*str != '\0')  //发送数组
	{
		SBUF = (*str);
		while(!TI);
		TI = 0;
		str++;
	}
}

//从机数据接收函数,$是结束标志
void ReData() interrupt 4  //串口中断服务函数
{
	ES = 0;  //关闭串口中断
	
	if(RI)  //再判断是否接收到数据
	{
		RXData = SBUF;  
		if(RXstart)  //判断是否接收过本地址
		{
			if(RXData != '\$')  //判断是否接收到结束标志$
			{
				temp[j] = RXData;  //没有接收到$,正常接收数据
				j++;
			}
			else
			{
				RXstart = 0;  //本次接收结束
				SM2 = 1;  //重新配置为只接收地址,下次发送TB8=1才中断
				j = 0;
			}
		}
		if(RXData == SlaveAddr)  //判断是否呼叫本机,地址范围:000-254(00-FE)
		{
			RXstart = 1;   //开始接收数据
			SM2 = 0;      //配置为接收数据模式
			j = 0;
		}
	}
	
	RI = 0;  //清除接收中断标志位
	ES = 1;  //重开串口中断
}




uart.h

#ifndef __UART_H
#define __UART_H

#include "reg52.h"

#ifndef u16
#define u16 unsigned int
#endif

#ifndef u8
#define u8 unsigned char
#endif

#define SlaveAddr 1  //从机号/地址

extern u16 temp[10];  //数据缓存



void UartInit();
void SendData(u8 addr,u8 *str);
void ReData();




#endif


main.c

#include "reg52.h"
#include "uart.h"

#define MasterAddr0 0  //主机号(地址)

extern u16 temp[10];  //数据缓存

#define LED P0

void delay(u16 i);

void main()
{
	u8 i;
	
	UartInit();
	while(1)
	{
		
		for(i=0;i<10;i++)
		{
			LED = temp[i];
			delay(50000);
		}
		SendData(MasterAddr0,"2$");
	}
}

void delay(u16 i)
{
	while(i--);
}


知识链接

1、串口相关寄存器

SCON串口控制寄存器;
TCON定时器控制寄存器
TMOD定时器/计数器模式控制寄存器
PCON电源控制寄存器
IE中断使用寄存器
c51仿真串口模型器件,proteus,单片机,嵌入式硬件

SCON串口控制寄存器

c51仿真串口模型器件,proteus,单片机,嵌入式硬件
c51仿真串口模型器件,proteus,单片机,嵌入式硬件
SM0、SM1:串口工作方式控制位
SM2:多机通信控制位(方式2、3),1允许,0不允许
REN:允许/禁止串行接收控制位
TB8:要发送的第9位数据,由软件清零,多机通信中地址(1)或数据(0)标志位
RB8:接收到的第九位数据
TI:发送中断请求标志位,软件复位
RI:接收中断请求标志位,软件复位

TCON定时器控制寄存器

c51仿真串口模型器件,proteus,单片机,嵌入式硬件
TF1:定时器/计数器1溢出标志
TR1:定时器1运行控制位,软件控制
TF0:定时器/计数器0溢出标志
TR0:定时器0运行控制位,软件控制
IE1:外部中断1使能位
IT1:外部中断1触发方式控制位
IE0:外部中断0使能位
IT0:外部中断0触发方式控制位

TMOD定时器/计数器模式控制寄存器

GATE:定时器1门控制位
C/T:计数器/定时器1选择位
M1、M0:定时器计数器1模式控制位
后四位为定时器0相关位

PCON电源控制寄存器

c51仿真串口模型器件,proteus,单片机,嵌入式硬件
SMOD:波特率选择位,1加倍,0不加倍

IE中断使能寄存器

c51仿真串口模型器件,proteus,单片机,嵌入式硬件
EA:总中断允许位
ES:串口中断允许位
ET1:定时器1溢出中断允许位
EX1:外部中断1中断位允许
ET0:定时器0溢出中断允许位
EX0:外部中断0中断位允许

总结

这一个拖了好久,一直没整,原因就不多说了,归纳了一下:还是要多尝试,试错的成本可能不低,但错过机会的成本更高,所以还是要多去尝试,不管结果如何。试过总是还是有机会的,没试过就一定没机会。
感觉还不是很熟悉,还是要多看多练习,多总结。文章来源地址https://www.toymoban.com/news/detail-791799.html

到了这里,关于【PROTEUS-51单片机串口通信仿真】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Proteus8仿真:51单片机使用串口进行双机通讯

    元器件 名称 电阻 RES 51单片机 AT89C51 电容 CAP 晶振 CRYSTAL BCD数码管 7SEG-BCD 串口初始化: 首先根据相关的串口寄存器编写对应的初始化代码: STC89C51单片机设有两个定时器/计数器,因定时器1有4种工作方式,而常选用定时器1的工作方式2(8位自动重装)作为波特率的溢出率。 串口

    2024年02月04日
    浏览(33)
  • proteus 仿真 at89c51 单片机八位抢答器,文末附源文件

    在网上没能容易地直接找到仿真文件,所以我把这个上传,希望对各位有所帮助。 倒是有不少好心人给出了图文教学和源代码,对他们表示感谢。我也是用这位老哥的代码和电路稍作了修改,感谢分享。 起初 led 数码管是熄灭的,按下 P2.1 的按钮 会将它们点亮,开始抢答。

    2024年02月09日
    浏览(39)
  • Proteus基于51单片机利用虚拟串口实现主从机的通信

    最近在学校做单片机课程实验时,需要在Proteus上实现串口的通信,具体要求如下: 在此记录一下本人的解题方案,首先Proteus中的原理图绘制如下 其中虚拟串口可在元件库中搜索COMPIM获得。 将原件按上图连接完毕后,将各个虚拟串口的收发波特率设置为19200,并分别赋予CO

    2024年02月08日
    浏览(31)
  • 单片机——C51实验含Proteus仿真(AD转换器(数字电压表),DA转换器(波形发生器))

    分为两部分:AD转换器实现数字电压表,DA转换器实现波形发生器(在仿真部分详细说明) 所用到的原理图:  AD转换器实现数字电压表部分         需要打开main函数中LCD_init(),ADC(),display()三个注释其中电压的输出显示用到了LCD1602关于这部分详情见(96条消息) 单片机——

    2024年02月08日
    浏览(44)
  • C51单片机串口发送数据的使用

             假如说电路板上没有CH340芯片,我们就要使用TTL转USB模块来进行电平的转换,然后将模块的RX接单片机的TX,模块的TX接单片机的RX,来进行接线连接。          在连接好连线后,我们打开计算机管理,来查看端口是否存在,如果没有,我们需要下载CH340驱动,

    2024年02月03日
    浏览(57)
  • [物联网工程]基于Protues仿真平台的C51/2单片机蓝牙串口通信控制继电器实验

    目录 实验目的 实验内容 仿真部分 实战部分 环境搭建 软件下载 仿真实验过程 模拟电路仿真 打开Proteus并创建新项目 绘制仿真电路图 程序实现 程序编写 程序导入 运行仿真 真实设备实战 硬件连接 程序实现 程序编写 程序导入 运行验证 总结拓展 掌握AT89C51蓝牙通信的工作原

    2024年03月20日
    浏览(48)
  • AT89C51单片机实现单片机串口互动(中断方式,单片机--单片机,应答)

     说一下功能:客户机发送0x01到服务机 2服务单片机应答0xf2到客户机 3客户机接收到0xf2,发送信息153432这6个数字到服务机 4client发送完信息后发送0xaa结束通信 5server接收到0xaa后回复0xaa结束通信,从此老死不相往来 看代码: 服务端代码:    

    2024年02月13日
    浏览(45)
  • 【Proteus仿真】【51单片机】贪吃蛇游戏

    本项目使用Proteus8仿真51单片机控制器,使用8*8LED点阵、按键模块等。 主要功能: 系统运行后,可操作4个按键控制小蛇方向。 B站演示视频:https://space.bilibili.com/444388619 视频地址:https://space.bilibili.com/444388619/video 专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联

    2024年02月06日
    浏览(38)
  • c51单片机16个按键密码锁源代码(富proteus电路图)

     注意了:这个代码你是没法直接运行的,但是如果你看得懂,随便改一改不超过1分钟就可以用

    2024年02月13日
    浏览(34)
  • 【Proteus仿真】【51单片机】智能温控风扇设计

    本项目使用Proteus8仿真51单片机控制器,使用LCD1602液晶、按键、蜂鸣器、L298N电机驱动模块、直流电机、DS18B20温度传感器等。 系统运行后,LCD1602显示传感器检测的温度值; 默认以自动模式运行,若按下K4键切换为手动模式,此时可以 通过K1和K2控制风扇加减速,风扇档位共

    2024年02月16日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包