蓝桥杯CT107D:串口通信

目录

简介

 工作原理

 Uart口的数据发送与接收

 串口控制寄存器SCON

 程序举例


简介

        串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。51单片机内部自带UARTUniversal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。

 工作原理

         串口通信可分为两种:并行通信与串行通信。

并行通信:指数据的各位同时发送或接受,每个数据位使用一条导线。

串行通信:指数据一位接一位地顺序发送或接受。

        串口通信有SPI、IIC、UART等多种。最常见最通用的是指UART,大多数情况下,串口通信是指UART。串口通信的制式有:单工、半双工、全双工三种模式。

        单工:两个设备之间只能有一个设备进行发数据。

        半双工:两个设备都可以进行数据的发送和接受,但是同一时刻只能有一种状态。

        全双工:两个设别可以同时进行数据的发送与接受。

 Uart口的数据发送与接收

        串行口中有两个缓冲寄存器SBUF,一个是发送寄存器,一个是接收寄存器。它们在物理上是完全独立的(可以理解为SBUF为一个人格分裂的人,虽然是一个人,但是却有两个意识,分行动,懂的都懂哈哈)。他们都是字节寻址的寄存器,字节地址均为99H。两个重叠的地址靠读/写指令区分

        串行发送时,CUP向SBUF写入数据,此时99H表示发送缓存SBUF。

        串行接收时,CUP向SBUF读出数据,此时99H表示接收缓存SBUF。

        数据发送:将数据放进SBUF里面后,内核会自动将数据发送出去,内容发送完成后,会将TI标志位置1.例如:发送数据程序可以写为:SBUF=数据/变量,举例:SBUF=0x58.

        数据接收:内核从串口接收到一个完整的数据后,会将RI标志位置1,用户用SBUF直接读出即可。接收举例:变量=SBUF,即dat=SBUF

 串口控制寄存器SCON

 SCON是串行控制寄存器,与TMOD类似。都是通过配置其开关来实现其功能的寄存器。

SM0与SM1是确定串行口工作模式的, 有下列工作模式,我们最常用的是方式1:8位UART,波特率可变。

SM2是当我们选择方式2、方式3时才会配置的,现在一般不理,置0。

REN:允许/禁止串行接收控制位。当REN=1时允许串行接收状态。REN=0时,禁止接收。

TB8、RB8是SCNON选择方式2、方式3时才会用到的位,我们现在同样置0。

TI:发送中断请求标志位。由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。

RI:接收中断请求标志位。当串行接收到第8位结束时,由内部硬件自动置位即RI=1,向主机请求中断,响应中断后必须使用软件复位,即RI=0。

        串行通信的中断请求:当一帧发送完成,内部硬件自动置位TI,即TI=1,请求中断处理;当接收完一帧信息时,内部内部硬件自动置位RI,RI=1,请求中断处理。换句话说,在配置SCON时,我们不需要对TI、RI进行配置,他们自己会置1。每当发送、接收一次循环结束时我们仅仅需要对二者使用软件复位即可。

        总结:我们配置SCON是可以直接记住 SCON=0x50即可。        

 程序举例

        1、 初始化串口为模式 1, 即 8 位 UART 模式, 波特率 9600, 允许接收
        2、 数据发送采用查询方式, 数据接收采用中断方式。
        3、 系统上电初始化之后, 单片机向上位机发送两个字节:0x5a 和 0x11(串口助手以十六进制 HEX 发送和显示)。
        4、 串口每成功接收到一个字节后, 在该字节基础上加 1,然后通过串口发送回上位机。
        5、 注意 89C52 单片机和 IAP15F2K61S2 单片机串口应用的差别, 使用 9600 波特率时, 晶振时钟选择 11.0592MHz。

#include "reg52.h"

sfr AUXR=0x8e;    //在reg51.h中我们没有定义AUXR,所以在这里定义一下

unsigned char urdat;

void SendByte(unsigned char dat)    //数据发送
{
	SBUF=dat;
	while(TI==0);
	TI=0;
}

void Close_Init()    //关蜂鸣器(我们的老朋友)
{
	P2=(P2&0x1f)|0xa0;
	P0=0x00;
}

void InitUart()
{
	TMOD=0x20;    //配置定时器1的设置,概念模糊的可以看看之前的文章。
	TH1=0xfd;
	TL1=0xfd;
	TR1=1;//启动定时器1
	
	SCON=0x50;
	AUXR &= 0x40;
	
	ES=1;
	EA=1;
}

void ServiceUart() interrupt 4
{
	if(RI==1)    //就是RI的软件置0
	{
		RI=0;
		urdat=SBUF;
		SendByte(urdat + 1);
	}
}

void main()
{
	Close_Init();
	InitUart();
	SendByte(0x5a);
	SendByte(0x11);
	while(1);
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值