学习日志-C51-串口通信
串口控制LED灯亮灭
1.常见通信串口比较
分类1:
单工:只能由甲向乙传输信号,一根传输线。
半双工:数据可以在双方传输,但同一时刻只能单方传输,发送数据的同时不能接收数据,一根传输线。
全双工:数据可以在双方传输,发送数据的同时也能接收数据,需两根传输线。
分类2:
同步:双方都有时钟引脚,双方的时钟引脚连接在一起,信息帧为一次通信传送的数据,传输效率高。
异步:无CLK引脚,以固定格式的数据帧进行传输,一帧一帧进行传输,要求双方为相同的传输速度。以0为起始位,1为停止位,需要多用两位进行传输,有效传输效率为80%,因而传输效率低。
传输速度:
波特率:单位时间传输多少码元.
比特率:单位时间传输了多少个二进制位数。
2.初始化配置
(1) SCON
SCON为串行控制寄存器,初始化时选择模式1,TI、RI置0,因而SCON设置为0100 0000。
使用串行通信模式1时,其波特率可变,可变的波特率由定时器1提供,因而也需要对定时器1进行初始化,其初始化可参考定时器一节。
(2)PCON
(3)配置
可直接使用STC-ISP的串口波特率计算器得到代码。
按照开发板晶振标注配置系统频率,可按照图示进行配置。由于需使用定时器1,因而初始化函数加上语句EA=1;ES=1;将中断允许总开关和串口中断允许开关打开即可。
3.代码实现
该代码可实现串口输入控制LED亮灭。
(1)串口初始化函数
#include <REGX52.H>
void Uart1_Init() //[email protected]
{
PCON &= 0x7F; //首位置0,不加倍
SCON = 0x50; //工作方式1,并置REN为1,为串行允许接收状态
TMOD &= 0x0F; //设置定时器1模式
TMOD |= 0x20; //0010 0000,模式2
TL1 = 0xFA; //设置初值
TH1 = 0xFA; //设置初值
ET1 = 0; //定时器禁止中断
TR1 = 1; //定时器开启
EA=1; //中断允许总开关开启
ES=1; //允许串口中断
}
void UART_SendByte(unsigned char Byte)//由串口发送一个字节数据
{
SBUF=Byte;//令SBUF读入Byte的值,将数据写入SBUF即可发出
while(TI==0);//由TI发送完成标志位进行检测,发送完成跳出循环
TI=0;//让TI置0,复位
}
(2)主函数
#include <REGX52.H>
#include "UART.h"
void main()
{
Uart1_Init();//初始化
while(1)
{
}
}
void UART_Routine() interrupt 4//中断程序
{
if(RI==1) //接收标志位为1
{
P2=~SBUF; //接收为1,则接收数据,由于P2口为0时灯亮,因而取反
UART_SendByte(SBUF); //将收到的数据返回串口
RI=0; //接收标志位复位
}
}
串口助手区如上图所示,选取对应串口与波特率,输入AA,则LED8~LED1为1010 1010。