STC89C52单片机 串口通信(学习笔记)

串口是一种通信接口,可以让两个串口设备互相通信,传输数据 吧啦吧啦(这句是废话)。

首先,我们需要一个CH340模块,这个模块是USB转串口的模块

大概长这样子

2e53a8995f3c4622bd5affccbf67cbcc.png

有些电脑也自带串口通信接口(电平标准与51单片机不一致),这里不作讨论。

串口的连接:

简单的双向串口通信由两根线(TXD发送端和RXD接收端)

TXD和RXD要交叉连接

当只需要单项的数据传输时可以只接通一根线

当电平标准不一致时,需要加电平转换芯片

211749dbcd4146f4a715a5fb52f1f9cb.png

电平标准:

TTL电平:+5v表示1,0v表示0;

RSS232电平:-3v- -15v表示1,+3-+15表示0;

RS485电平:两线压差+2- +6v表示1,-2—-6v表示0(差分信号)

 

STC89C52(以下简称单片机)有一个UART,定义在P3.0RXD与P3.1TXD

单片机的UART由四种工作模式:

模式0:同步移位寄存器

模式1:8位UART波特率可变(常用)

模式2:9位UART波特率固定

模式1:9位UART波特率可变

 

串口的参数:

波特率:串口通信的速率(发送和接受各位数据位之间的间隔时间)

检验位:用于数据的验证

停止位:用于数据帧之间的间隔

 

串口模式图:

0eaee10c5293484b8a99128a89ec2f74.png

 

靠T1定时器的溢出率来控制频率,再经过2分频和16分频来得到最终波特率

当发送或接受时TI和RI将产生一个中断。

SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接受寄存器

串口相关寄存器:

57ae21edbd454767b879705cbcbff582.png

虽然看着多,挺吓人的,但其实并不复杂,一共就5个需要新知道的,我们来一一拆解

SCON:串行控制寄存器

SM0和SM1用于定义串口模式,一共4种,上面说过。TI(需要如那件复位)和RI也一样说过

但是SM0有一个复用功能,当PCON寄存器中SMOD0为1时,这一位用于错误帧检测,当检测到一个无效停止位时,通过UART接收器设置该位。

REN:置位(1)为允许接受数据,复位(0)为禁止接收数据

SBUF:上面说过

PCON:电源管理寄存器,实际也就用到前两个

SMOD:波特率选择位,当它置位时,通信方式1,2,3的波特率加倍,当复位时,各工作方式加倍。(其实我没太懂)

SMOD0:指定SM0的功能,是错误帧检测还是设置串口工作模式。

 

说了这么多,上代码

初始化函数:

void UART_Init(){    //4800bps@11.0592MHz
    SCON = 0x50;        //8位数据,可变波特率
    PCON = 0x80;        //使能波特率倍速位SMOD
    TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xF4;		//设定定时初值
	TH1 = 0xF4;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
    
    EA = 1;        //设置中断使能
    ES = 1;        //设置串口中断
}

发送数据:

void sentByte(char data_msg)
{
	   SBUF = data_msg;
	   while(!TI);//用于检测是否发送完成
	   TI = 0;
}

就是这么的朴实无华,很简单吧?

接收数据:

将接收到的数据写入P2寄存器

void UART_Routine() interrupt 4{
    if(RI == 1){
        P2 = SBUF;
        UART_SendByte(SUBUF);
        RI = 0;
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值