教你如何在51单片机上模拟串口通信!!!

我们可以不使用单片机本身带有的串口,而自己用程序去模拟一个串口并达到和本身的串口具有同样的功能,

首先,我们需要用到CH340串口模块,大家可以上某宝自行购买。

正面:

反面:

然后我们需要了解一下这串口模块上的引脚:

5V  :与VCC短路为5V TLL输出(电源和信号输出都是5V

VCC:可以与3.3V5V用跳帽连接

3.3V:与VCC短路为3.3V TLL输出(电源和信号输出都是3.3V

TXD:发送数据端口(与单片机上的接收引脚用杜邦线连接)

RXD:接收数据端口(与单片机上的发送引脚用杜邦线连接)

GND:地线

因为我是有另外一条串口提供了51单片机的电源,所以就没连接5V和VCC,只与单片机连发送、接收和地端口。

现在,让我们一起了解一下串口通信协议是怎样的

我们可以将该协议分成三部分

一、            起始信号

二、            数据位

三、            结束信号

首先,串口主要有发送和接受两个主要功能,

发送

比如说我们需要发送一个0X48的十六进制数,它的二进制为 01001011

则过程为

一、起始信号

  默认电平为高(1),先将发送端的引脚电平拉低(0)持续104us,来作为一个起始信号

二、八个数据位

  数据的发送,是从最低位开始到最高位一位一位发送的,每一个数据位都需要持续104us,

三、结束信号

  需要将发送端的引脚电平拉高(1)持续104us以上。

接收

其实接收也很好理解的,怎样发送就怎样接收,只是看接收的技巧而已

比如说刚刚发送的0X48从主机发送到了单片机上,我们需要接收

则过程为

一、起始信号

  我们需要读取到它的起始信号,就是当它把你的接收端引脚持续拉低104us之后,就可以当作是开始接收了。

二、八个数据位

  因为是八个数据位了,所以所接收的数据也会按照发送一样一个一个发送,我们只要去读取这时候的引脚电平就好。

三、结束信号

  最后也是一样,再需要确认一次结束信号,读取电平是否为高电平,如果全部确认成功后,就可以认为是接收一个有效的数据了。

下面为个人图解

理论已经说完,接下来就是怎样用代码实现了

那我们一步一步开始吧

第一、创建工程

第二、创建延时函数

代码:

 1 void Delay_us(int x)      //微秒
 2 {
 3    while( x-- != 0 )
 4    {
 5       _nop_();
 6       _nop_();
 7    }
 8 }
 9 void Delay_ms(int x)        //毫秒
10 {
11    int i,j;
12    while( x-- !=0 )
13    {
14       for(j=0;j<10;j++)
15       for(i=0;i<85;i++);
16   }
17 }

这里的Delay.c里面有两个延时函数,一个为微秒级,一个为毫秒级。

我们还需要再创建一个Delay.h头文件来向外声明这两个函数。

头文件的话,我们还需要把它的路径添加到工程里,步骤如图

我不把这两个函数写进main.c的原因是如果以后写的代码过长了,全部都堆在主函数里的话不方便管理,而这样分开的话可以降低他们的耦合关系,下面也同理了。

第三、串口函数

这里的函数创建和上面的步骤是一样的了

发送函数:

代码:

void vFn_Uart_Send(unsigned char uContent)
{
   unsigned int i;
   unsigned char uSendContent =0xff;         //定义一个发送数据的变量
   uSendContent = uContent;                //将要发送的值赋给该变量

   //起始信号
   P05 = 0;                            //P05作为发送端的引脚
   Delay_us(61);                         //延迟104us

   //数据发送
   for(i=0;i<8;i++)
   {
    P05 = uSendContent & 0x01;               //将所要发送的八位数据的最低位和0x01进行于运算,若最低位为1,相于后的结果为1,则P05电平为高,否则为0
    uSendContent = uSendContent >> 1;         //将第二位数据位移到最低位,重复进行七次移动
    Delay_us(61);  

   }  

   //结束信号
   P05 = 1;                            //将该引脚电平拉高
   Delay_us(61);                         //延时104us
}
 

这里的104us延迟函数,我已经用示波器测试过时间的了,是可以直接使用的。

因为烧写时候不同的频率也会造成延时函数改变,所以大家有条件的话,也可以自己具体去测量一下的

接收函数:

代码:

void vFn_Uart_Receive()
{
   unsigned int i;
   unsigned char uContent = 0x00;        //定义一个用于接收数据变量

        //起始信号
   if(P21 == 0)                    //判断是否接收到起始信号
   {
     Delay_us(29);                  //延时52微秒
       if(P21 == 0)                 //再判断一次接收端电平是否被拉低
       {
       //数据接收
         for(i=0;i<8;i++)
         {
             uContent = uContent >> 1;   //将值右移一位
             Delay_us(61);           //延时104微秒
             if(P21 == 1)           //判断是否为高电平
             {
               uContent |=  0x80;     //若为1则与0x80进行或运算(加上0x80也是一样的道理)
             }
         }
      }
        Delay_us(61);                //延时104微秒

      //结束信号
     if(P21 == 1)                  //判断电平是否被拉高
     {
      vFn_Uart_Send(uContent);         //将uContent的值用发送函数发送出来
      Delay_ms(1000);
      }
  }
}

这里讲解一下接收函数,我们知道起始信号拉低后,有104us的延时,延时完后就是八个数据位了,如果我们每一次都等完104us再去读取引脚的电平的话可能会不太稳定,所以我们可以在每个电平中间去读取,这个时候是最稳定的。下面为图解

第四、主函数编写

因为都把函数放到了其他文件中,这样主函数会看的比较简洁,我们也直接调用相关的函数就行了,主函数使用也没有太多的要求。

这里的话是需要每写完一个函数就去测试的,不过我是已经是全部测试通过的了,然后大家就还是写完一个测试一个,因为一次性写完所有函数然后马上通过的机率不大,还是要修改很多东西

然后我用的是下载软件是这个,烧写的时候我们需要将IRC的频率改成12MHz进行烧写

串口助手的话,我用的是SSCOM,另外因为我这个单片机的主芯片是IAP15W4K48S4,里面的GPIO的波特率也设置为了9600,所以我们也需要将其设置为9600的波特率才能看到数据,不然就是一堆乱码了,再然后就是点击HEX显示和HEX发送了。

我们来看是已经发送出来了。

再就是测试接收了

这里是把接收直接放到while(1)里面跑,大家也可以使用定时器的,用中断去跑的话就更好了,这里只是一个小小的示范。

发送了0x52,也接收了0x52,成功了。

这样一来,我们也就完成模拟串口的收发了。

最后再教一下如何用模拟串口发送文字吧,非常简单的一个小函数,

代码

void vFn_Send_Word(unsigned char *s)
{
    while(*s)
    {
        vFn_Uart_Send(*s++);
    }
}

然后再在主函数调用就可以实现了。

我的关于51单片机模拟串口到这就结束了,谢谢大家。

原文地址:https://www.cnblogs.com/zhenghaoyu/p/10059848.html

时间: 2024-08-01 05:08:00

教你如何在51单片机上模拟串口通信!!!的相关文章

「51单片机」RS232串口通信代码分析

想来想去不知道要怎么样把232串口通信说清楚,想想还是直接把代码分析一遍吧... 重点是“常用波特率与定时器1的参数关系”这张表格!波特率的设置很重要! 一.串口初始化 void usart_init() { SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 TMOD = 0x20; //定时器工作方式2 PCON = 0x00; TH1 = 0xFD; //波特率9600.数据位8.停止位1.效验位无 (11.0592M) TL1 = 0xFD; ES = 1; //开

51单片机GPIO口模拟串口通信

51单片机GPIO口模拟串口通信 标签: bytetimer终端存储 2011-08-03 11:06 6387人阅读 评论(2) 收藏 举报 本文章已收录于: 分类: 深入C语言(20) 作者同类文章X 1 #include "reg52.h" 2 #include "intrins.h" 3 #include "math.h" 4 #include "stdio.h" 5 sbit BT_SND =P1^5; 6 sbit

stm32 普通IO口模拟串口通信

普通IO口模拟串口通信 串口通信协议 串口传输 默认 波特率9600 1起始位 1停止位 其他0 数据位是8位(注意图上的给错了). 传输时,从起始位开始,从一个数据的低位(LSB)开始发送,如图从左向右的顺序,对电平拉高或拉低,最后停止位时拉高. 波特率大小,改变延时时间即可.例如9600 波特率    根据公式 : 1/9600=0.000104s(大致) 也就是说每发送1bit延时104us (下面我用9600波特率来说,代码用的是19200) 串口发送       将电平拉低 延时104

单片机: EEPROM和串口通信

名称:IIC协议 EEPROM24c02 通过串口通信存数读取数据 内容:此程序用于检測EEPROM性能,測试方法例如以下:写入24c02一个数据,然后在内存中改变这些数据. 掉电后主内存将失去这些信息,然后从24c02中调入这些数据.看是否与写入的同样. 电脑通过串口发送一个十六进制的数据到单片机,存储进24c02,要求断电重新启动后在数码管上显示上一次发送的数据. (本例是1us机器周期,即晶振频率要小于12MHZ) #include <reg52.h> //头文件的包括 #include

【单片机实验】串口通信实验

实验三:串口通信实验 内容: (1)利用电脑串口与实验台串口进行连接: (2)根据帧格式定义.波特率定义,编程配置串口,并编写控制程序: (3)实现从电脑上输入控制字符,由单片机通过串口接收,并控制LED显示的功能: (4)对所编程序进行调试及验证. 要求: (1)掌握波特率的概念.学会编程设置波特率和工作方式: (2)掌握串口通信的编程控制方法: (3)理解解MAX232串口通信的硬件电路结构. 注意实验三,需要同学们自己编写程序,实现从电脑串口助手(利用单片机下载软件提供的串口调试助手),发

教你如何在WINDOWS Server2003上部署一个Asp.Net的网站

对于许多新手来说,如何在服务器上部署网站并不了解,这个教程希望对新手有帮助. 1.IIS服务器 2..Net Framework3.5 (方便起见,我们这里Framework说的都是指的这个版本) 这两个软件都需要我们自己手动操作安装到服务器里面.那到底是先装哪一个呢,为了方便起见,一般我们都先安装IIS服务器,然后再安装Framework. 当然偶也遇到过几次部署人员先安装了Framework再安装IIS服务器的,这样的操作步骤就会导致Framework不会被注册进IIS服务器里面.就是说在网

51单片机上实时多任务操作系统-教程

RTX51是用与8051系列的实时多任务RTOS 1. RTX 两个版本区别: RTX51 FULL:允许4个优先任务循环和切换,并行利用终端,支持邮箱系统的信号和消息传递 RTX TINY 子集,不支持占先式任务切换,不能进行信息处理 RTX的循环任务调度 准并行 利用内部定时器的中断实现定时 使用时不需要包含main()函数,自动从任务0开始 如果包含main()函数,则需要利用os-start-system 或 os-creat-task来启动 Example1: ps:注意事项: 关于K

教你如何在MSDN网站上下载文件

近日有不少朋友问我要系统镜像或者数据库镜像,其实并不是我不想直接给你们传,只是想让你们多了解点获得资源的方式,所以我就给他们介绍了MSDN.MSDN这个网站确实不错,有丰富的系统镜像,数据库镜像.邮件系统镜像.Office软件镜像等文件.但是,后来我发现很多人不会在这个网站下载资源,现在我来跟大家所说: 1.打开MSDN网站:http://msdn.itellyou.cn/?lang=zh-cn 2. 找到自己需要的资源:这里可以通过左边的分类导航查找也可以直接通过搜索栏搜索. 3.找到目标资源

深入理解51单片机串口通信

串口通信的基本认识 通信分为并行通信和串行通信,并行通信时的数据各个位同时传送,可以实现字节为单位通信,但通信线多占用资源,成本高.以前用到的的P1=0x55,一次给P1口的8个管脚分别赋值,同时进行信号输出,类似于8个车道可以过去8辆车,这样的形式是并行的,一般称P0,P1,P2,P3为51单片机的4组并行总线. 串行通信,就是一个车道,一个只能通过一辆车,如果一个0x55这样一个字节的数据要传输过去的话,假如低位在前,高位在后的话,那发送方式是:0-1-0-1-0-1-0-1,一位一位的进行