前言
接触过单片机的人都知道串口通信,可以通过另一个短文了解,其中入门的应该就是串口通信了。UART全拼的个人理解为通用的异步接收和发送。常见两根短线作为通信线,一般使用TXD和RXD标记。对于两块通信的芯片来说,接收和发送是相对的,因此TXD和RXD需要交叉相连。
通过Arduino和51单片机的的简单实例分析
个人感觉,通信方式在不同的运行环境中实现的方式不同,但实现了信息可理解的交换。
在51单片机中实现的情况下
参考程序:https://blog.csdn.net/m0_72853403/article/details/130672863
需要做的设置:串口寄存器选择,时间计数器,时间初值(时间决定了发送的波特率),中断设置
工作流程:先设置寄存器等,其他都在中断中进行,通过数据寄存器SBUF对串口接收和发送的数据进行接收和发送,通过寄存器SCON中的TI和RI判断接收或发送是否完成,注意的是这两个标志位需要在软件中清零。
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void main()
{
UsartInit(); // 串口初始化
while(1);
}
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;
while (!TI);
TI = 0;
}
void Usart() interrupt 4
{
if (RI == 1) //如果接收标志位为1,接收到了数据
{
P2 = ~SBUF; //读取数据,取反后输出到LED
UART_SendByte(SBUF); //将受到的数据发回串口
RI = 0; //接收标志位清0
}
}
在Arduino中的程序分析
和上面相比arduino的程序是建立在抽象的接口函数一样。我们不需要了解硬件知识就可以完成设置,其他的配置交给编译器就行。根本需要考虑中断和时间,只要通过给定的接口函数简单设置波特率和发送的数据就i行。
void setup() {//设置波特率
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() { //数据发送
// put your main code here, to run repeatedly:
Serial.print("test\n");
delay(1000);
}
实际结果分析
通过使用串口助手更有力的展示数据的发送可以独立硬件实现互通
在arduino IDE中显示串口数据
使用一个串口助手查看串口中的数据
总结
通过上面两种串口输出数据的查看,发现数据没有问题。一般在学习51单片机中会经常使用串口助手,但在arduino中直接使用IDE 就可以查看。但是两种编程环境的硬件确实可以能够进行信息有效交互。