Arduino和C51之串口通信 - demo例子集

时间:2024-02-29 17:02:56

Arduino和C51之串口通信

技术:51单片机、Arduino、串口通信
 

概述

本文主要讲解串口通信技术的使用方法,并通过串口点灯实验介绍了51单片机和Arduino串口的使用,为初学者学习串口知识提供帮助

详细

一、串口通信

串口通信(Serial CommunicaTIons)的概念非常简单,串口按位(bit)发送和接收字节。串口用于ASCII码字符的传输,通信使用3根线完成,分别是地线、发送线、接收线.由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据,其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须要匹配。

二、51单片机串口通信

51单片机实现串口通信时会用到的寄存器:SCON、TMOD、PCON

  • SCON:特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志

SCON寄存器中位的定义:

图片1.png

设置SM0和SM1确定串行口工作方式:

1544959796475054171.png

 

  • TMOD:用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1

TMOD寄存器中位的定义:

1544959804936011385.png

定时/计数器的工作方式主要有以下四种:

 

1544959813646032836.png

  • PCON:电源管理寄存器

PCON寄存器中位的定义:

1544959820506069548.png

在串口通信时,我们主要使用SMOD位将波特率翻倍,当:

1. SMOD=0:串口方式1,2,3时,波特率正常。

2. SMOD=1:串口方式1,2,3时,波特率翻倍。

 

三、51单片机串口控制LED灯

//UsartInit()对串口进行初始化
void UsartInit()        //设置串口
{
    SCON=0X50;   //设置为工作方式1
    TMOD=0X20;   //设置计数器工作方式2
    PCON=0X80;   //波特率加倍
    TH1=0XF4;    //计数器初始值设置,波特率:4800
    TL1=0XF4;
    ES=1;      //打开接收中断
    EA=1;      //打开总中断
    TR1=1;     //打开计数器
}

这里TH1和TL1的初始值,使用了软件进行计算:

图片6.png

 

void Usart() interrupt 4 //进入中断服务函数
{
    char receiveData;
             
    receiveData=SBUF;//出去接收到的数据,此时SBUF存放接收数据
    RI = 0;//清除接收中断标志位
    if(receiveData==\'1\') 
    {
        led=0;    //接收1时,打开LED灯
    }
    if(receiveData==\'0\') 
    {
        led=1;    //接收0时,关闭LED灯
    }
    SBUF=receiveData;
    while(!TI);    //等待发送数据完成
    TI=0;       //清除发送完成标志位
}

打开串口调试助手 -- 修改波特率、停止位、数据位等

1544959857982038113.png

接着,通过串口调试助手,你可以发送任意你想发送的东西给单片机,这里:

1. 输入1 ----- LED灯亮

2. 输入0 ----- LED灯灭

四、Arduino串口控制LED灯

  • 设置波特率:Serial.begin(9600);

  • 发送数据到串口:Serial.println(data);

  • 从串口接收数据:Serial.read();

测试代码如下:

 

char var;
void setup() 
{
  pinMode(13, OUTPUT);  //设置IO口13输出模式
  Serial.begin(9600);  //设置波特率
  Serial.println("Hello!PC,I\'m arduino!"); //发送数据到串口
}
void loop() 
{
    if (Serial.available())
    {
        var = Serial.read(); //从串口接收数据
        if (var == \'1\') 
        {
            digitalWrite(13, HIGH);
            Serial.println("LED is on!"); 
        }
        if (var == \'0\') 
        {
            digitalWrite(13, LOW);
            Serial.println("LED is off");
        }
    }
}

打开右上角--->串口调试器 -- 修改波特率等

1544959866684079160.png

1. 发送1 ----- LED灯亮

2. 发送0 ----- LED灯灭

五、总结

本文通过串口点灯实验介绍了51单片机和Arduino串口的使用,后续文章会讲解传感器的使用,并使用串口打印传感器信息,感谢你的支持。

六、项目结构图

 

图片9.png

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权