Arduino和C51之串口通信
概述
详细
一、串口通信
串口通信(Serial CommunicaTIons)的概念非常简单,串口按位(bit)发送和接收字节。串口用于ASCII码字符的传输,通信使用3根线完成,分别是地线、发送线、接收线.由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据,其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须要匹配。
二、51单片机串口通信
51单片机实现串口通信时会用到的寄存器:SCON、TMOD、PCON
-
SCON:特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志
SCON寄存器中位的定义:
设置SM0和SM1确定串行口工作方式:
-
TMOD:用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1
TMOD寄存器中位的定义:
定时/计数器的工作方式主要有以下四种:
-
PCON:电源管理寄存器
PCON寄存器中位的定义:
在串口通信时,我们主要使用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的初始值,使用了软件进行计算:
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; //清除发送完成标志位 }
打开串口调试助手 -- 修改波特率、停止位、数据位等
接着,通过串口调试助手,你可以发送任意你想发送的东西给单片机,这里:
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"); } } }
打开右上角--->串口调试器 -- 修改波特率等
1. 发送1 ----- LED灯亮
2. 发送0 ----- LED灯灭
五、总结
本文通过串口点灯实验介绍了51单片机和Arduino串口的使用,后续文章会讲解传感器的使用,并使用串口打印传感器信息,感谢你的支持。
六、项目结构图