STC15系列单片机之串口初始化

什么是串口

简单理解就是一个电脑和单片机之间沟通的桥梁,从电脑角度考虑,我要发送信息给单片机,我需要什么,肯定是需要一个数据线对吧,将我要传给单片机的信息通过数据线发送过去,这就需要一个数据线端口,这个端口就是TXD,
那单片机要接受电脑传过来的值,那肯定需要一个插数据线的端口,用来接受数据值,这个端口就是RXD;反过来一样,单片机需要一个发送端口TXD,电脑需要一个接收端口RXD。
串口通信硬件连接
所以,如何使用串口进行发送数据和接收数据呢,现在开始跟我走,保证学会

第一步、看懂数据手册

原理篇

打开对应的数据手册,我用的是STC15W4K58S的数据手册,不过定时器一是通用型的,不影响初学者的理解(我也是初学者,所以我懂初学者的难,所以保证每一步都是小白步伐)
找到串行口通信章节,选择工作模式,建议刚开始学习选择(8位UART ,波特率可变)也就是模式一
串行口选择
工作原理
这个原理的话去看下视频链接:(链接: link
不想看的我简单总结一下也很容易理解:发送时,将数据写入SBUF,然后打开发送控制器TI,这样一帧数据就传输完成了;接收时,数据进入移位寄存器,然后打开接收控制器开关RI。将数据写入SBUF,这时我们只需要读取这个SBUF中的值就行,一般处理方法就是将SBUF中的值放到一个数组中。
原理虽然很简单,但是配置对于初学者还是很难,我们一步一步走,

串口配置篇,

如果一步都不会,可以先用STC-ISP生成 一个 ,然后跟着配置
例如,我们要配置一个波特率为9600bsp,定时器模式选择1T,选用定时器1的16位自动重装载作为波特率发生器,然后选择复制代码到自己的程序中

当然这里面我们如果要使用串口中断,就要打开串口中断的开关ES =1和总中断开关EA =1;还可以配置优先级,PS = 0 / PS = 1;

自己一步一步配置篇

由于选择串行口一,就要打开串行口一的相关寄存器

我们需要根据串行口1的相关寄存器进行配置
按顺序有AUXR、SCON 、PCON、IE、IP,这些是关于串口的,还需要配置定时器的TCON 、TH、TL值,一共就配置这些(有的进行位操作就行,比如IE中的 EA =1(打开总中断),ES= 1,打开串口中断允许)
首先第一步SCON

可位寻址就是可以单独对某一个位进行赋值操作,比如TI = 1,
由数据手册可以得出我们要的值为方式一,SM0 = 0;SM1 = 1;SM2 =0 ,REN为是否接受应答,设置位允许 REN = 1,TB8和RB8为方式二和方式三的进行的操作,我们不用,即TB8= 0;RB8 = 0;T1和R1就是刚才前面提到的控制开关,发送或者接收完成由硬件自动置一,所以要软件置零,所以赋初值为0,所以SCON = 0101 0000 = 0X50

PCON 由于采用的串行口一,波特率不加倍,所以值为0000 0000,可写可不写,PCON = 0X00;

AUXR:采用不分频,这样速度较高,我们采用的是定时器1,所以T1x12 = 1
AUXR = 0100 0000 = 0X40,不过一般不这样写,因为如果对定时器二操作也采用直接赋值,就相当于再次给AUXR赋值00000100,将我们配置的定时器1不分频清除了,所以有
AUXR |= 0X40;//先逻辑或一下,这样就算再次传入值 逻辑或以后,我们的T1X12 =1 不变

AUXR &= 0XFE; 再与一个FE,FE = 1111 1110,就是将最低位清零,保证选择的是定时器1作为波特率发生器

TCON
学习到串口,定时器的配置应该是已经会了的,按照每一位进行配置就完事了


TH 和TL怎么算呢,以9600bsp举例

数据手册都会有计算方式
其中SYSCLK = 22118400HZ,波特率我们自己选择为9600
(65536-(65536-(22118400/(9600
4))= FDC0
那么TH = 0XFD
TL = 0XC0
至此,串口就配置完成,代码如下

void Uart1_Init(void)		//9600bps@22.1184MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器时钟1T模式
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0xC0;			//设置定时初始值
	TH1 = 0xFD;			//设置定时初始值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
	ES  = 1;            //打开串口中断允许
	EA  = 1;            //打开总中断
}

如果引入串口中断的话就要知道中断号,如图所示

void Uart1_Isr(void) interrupt 4//函数名可以不一样,中断号必须为4
{
if(RI == 1)//接收完成后由硬件自动置一
{
	RI = 0;//由软件置零
}
}

困了困了,仅供学习,哪里错了可以私信我哦!

物联沃分享整理
物联沃-IOTWORD物联网 » 串口初始化配置详解

发表评论