一、51单片机的串口通信

关于51单片机串口通信的讲解的博客有很多,这里就不再详细讲解。下面给出程序
1.uart.h

#ifndef __UART__
#define __UART__typedef unsigned char u8;void UART_Init();
void UART_Send_Data(u8 byte);
u8 UART_Receive_Data();#endif

2.uart.c

#include "reg52.h"
#include "uart.h"
//串口初始化,设置波特率为9600,使用定时器1,晶振频率11.0592Mhz
void UART_Init()
{//设置波特率9600TMOD|=0x20;  //定时器1工作于自动重装载模式TH1=0xfd;TH0=0xfd;TR1=1; //启动定时器1ET1=0; //禁止定时器1中断PCON&=0x7f; //设置SMOD=0,波特率不加倍SCON=0x50; //工作于方式1  8位无校验异步通信的收发模式,并清空收发中断标志位EA=1;  //总中断允许ES=0;//禁止串口收发中断(本程序中不使用串口中断)
}
void UART_Send_Data(u8 byte)
{SBUF=byte;while(!TI);//等待串口数据发送完毕TI=0;//将发送中断标志位清0,为下次发送数据做准备
}
u8 UART_Receive_Data()
{u8 temp;while(!RI);//等待串口接收到数据(RI被置1)temp=SBUF;RI=0;//清空接收中断标志位,为下次接收做准备return temp;
}

串口数据收发既可以用中断的方式实现,也可以通过测试SCON寄存器的TI和RI位来实现。在完成一个字节的数据发送时,TI位被硬件置1,且必须由软件清0后才能继续发送下一个字节。而在接收到一个字节的数据后,RI被硬件置1,必须由软件清0后才能继续接收数据。在UART_Receive_Data()中,我们通过一个循环来等待RI位被置1,也就是等待外部设备将数据发送给单片机,一旦接收到了数据,我们就可以把接收到的数据返回。而 UART_Send_Data()也是类似的。

二、串口通信的Proteus仿真

首先编写一个主函数,完成将接收到的数据原样送回的功能,作为我们的测试程序。
main.c

#include "reg52.h"
#include "uart.h"
void main()
{u8 i;UART_Init();while(1){UART_Send_Data(UART_Receive_Data());}
}

①将编译生成的.HEX文件载入Proteus的单片机中,方法是:双击单片机,在出现的对话框中找到
这一栏
选择生成的.hex文件。
②在刚才的单片机设置的对话框中找到这一栏
将单片机时钟频率设置为11.0592MHz。这一步非常关键,因为上面的程序中使用的是9600的波特率,如果设置成了其他频率(比如常用的12MHz),会使实际的波特率与9600相差较大,超出允许的误差范围,使串口接收到错误的数据,如果你在后续中发现串口收到一堆乱码,很有可能是这一步没有设置。

完成以上两步后,这里介绍两种方式进行串口通信的仿真。

方式1

proteus中提供了Virtual Terminal,它实际上就是一个串口监视器,可以利用它直接向单片机的串口发送数据,也可以接受来自单片机串口的数据。
在左侧模式选择栏选择虚拟仪器模式
选择虚拟终端
与单片机的串口连接。(单片机的TX接虚拟终端的RX,单片机的RX接虚拟仪器的TX)
双击虚拟终端,进行如图设置(与单片机程序中的通信速率、格式一致)

运行仿真,会弹出一个黑色对话框。(如果没有的话,在菜单栏的DEBUG-Virtual Terminal下可以打开)

输入一个数字1,发现屏幕上出现了一个1。说明确实完成了前面main函数中接收数据并原样返回给的功能。这里你可能要问,屏幕上显示的1不是我输入的1吗?为什么说这里显示的1是单片机的串口在接收到‘1’之后返回的数据呢?因为Virtual Terminal默认是不会将你输入的字符显示在屏幕上的,如果把main函数中while(1)下的内容注释掉再编译后,你会发现无论你键盘上输入什么,Virtual Terminal上都不会显示出来。这就验证了Virtual Terminal默认情况下不会回显你输入的内容。

可以在虚拟终端的黑色方框内右击鼠标,勾选Echo Typed characters

此时在虚拟终端中输入一个1,你会发现屏幕上多了两个1。其中一个1是回显你输入的字符,另一个1则是由单片机串口发来的数据。

方式2

对于简单的验证单片机串口通信程序,上面的仿真方法已经足够。如果要模拟单片机与计算机的串口通信,可以用到COMPIM元件。进行如图连接(注意TX接TX,RX接RX)

COMPIM其实就是一个RS232串口的DB9连接器,用它可以模拟与计算机串口的连接。这个元件自动将单片机的TTL电平转换成了RS232电平,因此不必再用MAX232进行电平转换。(如果串口收到一堆乱码,需要注意是不是用了MAX232芯片,如果用了,去掉MAX232芯片,按上图连接即可解决乱码问题。)双击COMPIM设置其属性如下

这样就模拟了把单片机通过DB9连接器连接到计算机的COM3的过程。计算机上可能并没有这么多的COM口供我们使用,因此需要用软件虚拟出一对串口,这里用到了Virtual Serial Port软件。

点击右侧的Add Pair就可以生成一对虚拟的串口,这两个串口是连接在一起的。如果我们使用串口调试助手,打开COM3发送1个字符,再用串口调试助手打开COM4,就会接收到一个同样的字符。这也就证明了通过Virtual Serial Port生成的一对虚拟串口是连接在一起的。(串口调试助手的软件有很多,主要用于查看串口接收到的数据,以及通过串口发送数据。)
这里,我虚拟了COM3口和COM4口。其中COM3口已经与上面的COMPIM连接了。此时打开串口调试助手软件,选择COM4口,如下设置

在发送窗口输入1,并发送

此时数据通过与COM4连接的COM3口,传送给了单片机,单片机又将1回送给COM4口,因此串口调试助手的接收窗口也收到一个1,说明成功仿真了上面编写的程序。

51单片机串口通信的程序实现与Proteus仿真相关推荐

  1. 51单片机串口通信【收集学习向】

    本篇整理了学习51串口通信过程中看到的一些比较好的文章,有很多的超链接.并根据自己遇到的情况分析了串口传输乱码的一些原因. 目录 1.原理知识 2.测试程序和虚拟仿真 3.电路设计与公母口连线 电路设 ...

  2. 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    目录 1. 串口通信原理 2. 51单片机串口通信 2.1 串口简要模式图 2.2 相关寄存器 (1)PCON.SCON.SBUF (2)IE.IPH.IP (3)配置T1定时器 2.3 波特率和系统 ...

  3. 51单片机串口通信模板_深入理解51单片机串口通信及通信实例

    串口通信的原理 串口通信(SerialCommunications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一 ...

  4. 51单片机串口通信模板_51单片机串口通信

    51 单片机串口通信 51 单片机串口通信(转载) 2009-03-03 18:22 一.串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计 算机端,而且也能实现计算机对单 ...

  5. 51单片机~串口通信(讲解+代码)

    51单片机~串口通信 (一)计算机串行通信原理: 综上:所以在设置的时候,经常将SCON设置为0X50==0101 0000 ,使用方式1. (二)工作: 中断控制 led灯,每发送一条指令灯亮或灭( ...

  6. 51单片机串口通信发送以及接收代码详解1

    #include <reg51.h> //实验现象:单片接收电脑发送的字符串,并发回给PC端的代码.//函数声明 void uart_init(void); void uart_seng_ ...

  7. 51单片机串口通信发送以及接收代码详解2

    #include <reg51.h> //实验现象:在电脑端没按下发送的时候,单片一直给电脑发送aaa字符串: //实验现象:在电脑端按下发送的时候,结束字符串aaa的发送代码,执行单片接 ...

  8. 51单片机PID算法控制无刷直流电机proteus仿真

    51单片机PID算法控制无刷直流电机proteus仿真 1.五个按键,停止/启动,正转,反转,加速,减速 2.显示lcd1602,第一行设置速度set= 3.第二行实际速度speed= r/min 4 ...

  9. 基于51单片机HX711的电子秤称重计价proteus仿真程序设计

    设计要求 1.利用压力传感器检测重量信号,经放大和A/D转换,送单片机进行处理,并在液晶屏上显示出被称重量值: 2.最小显示单位为1克: 3.量程超过报警值蜂鸣器报警 资料下载地址:基于51单片机HX ...

  10. 51单片机8通道自动温度检测系统仿真+ Proteus仿真

    51单片机8通道自动温度检测系统仿真+ Proteus仿真 Proteus仿真 程序代码(汇编代码,格式为.asm) 导入方式: CLR P3.7 MAIN:MOV 38H,#00HMOV 39H,# ...

最新文章

  1. 产品经理要读什么书?怎么读?
  2. 高并发大流量专题---8、动态语言的并发处理
  3. gil php,网络编程之多线程——GIL全局解释器锁
  4. 对比俩个字符串的相似度
  5. Linux 命令简单介绍第一课笔记
  6. 11 、图解2个node环境下replica shard是如何分配的
  7. 昨天写的档,今天就被转盗,51CTO老大们来管管
  8. 39. 二叉树的深度(C++版本)
  9. 魔兽世界忘记账号角色服务器,魔兽世界里我知道了他的游戏角色名字怎样查到他的战网通行证...
  10. 【Java 多线程 8】同步容器与并发容器
  11. 新版智能广告点击要饭网单页网站源码
  12. WebRTC-NACK、Pacer和拥塞控制和FEC
  13. click与onclick的区别
  14. 解读《Superhuman AI for multiplayer poker》
  15. 展示正在活动时间内的活动,过期活动不显示
  16. A - Artwork Gym - 101550A
  17. 坐标范围计算显示缩放级别zoom自适应显示地图
  18. iphone个人热点无法开启_为什么苹果手机上的个人热点一直在转不能打开啊
  19. WHQL认证环境部署攻略四  结果查看测试报告
  20. 文本分词并统计出现次数最高的几个词Python

热门文章

  1. android加速度传感器 源码,Android项目源码利用加速度传感器实现计步
  2. 无lnternet_为什么无internet访问权限,无lnternet访问权限怎么办
  3. app界面设计规范及缺陷
  4. Windows 2003 从Oracle 9201 update to 9208
  5. 计算机画图照片大小,电脑自带的画图工具怎么调整图片的大小?
  6. java 新浪短网址生成器_新浪短网址链接生成器 2020最新新浪t.cn短链接在线生成接口推荐...
  7. 如何制作出漂亮精致的思维导图?MindNow来帮你
  8. android 指纹比对方法,指纹识别功能方面对比_手机Android频道-中关村在线
  9. 计算机电源多低无法使用吗,怎么确定电脑电源供电不足?
  10. RestTemplate源码剖析:Encode