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/(96004))= 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; //打开总中断
}
如果引入串口中断的话就要知道中断号,如图所示文章来源:https://www.toymoban.com/news/detail-460223.html
void Uart1_Isr(void) interrupt 4//函数名可以不一样,中断号必须为4
{
if(RI == 1)//接收完成后由硬件自动置一
{
RI = 0;//由软件置零
}
}
困了困了,仅供学习,哪里错了可以私信我哦!文章来源地址https://www.toymoban.com/news/detail-460223.html
到了这里,关于串口初始化配置详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!