上节课我们学习了串口的理论部分,这节课我们要来学习实操部分。
要想实现单片机通过串口向电脑端发送数据,我们首先要来配置寄存器。
1.配置SCON
SCON寄存器中的SM0配置为0,SM1配置为1决定了串口工作在模式一,也就是8位UART, 波特率可变的工作模式。REN置1表示能接收到电脑端的数据(本节实验可置1也可以置0,因为暂时不用接收电脑端发送过来的数据),所以SCON=0x50或者0x40。这样SCON寄存器就配置完成了。
2.配置PCON
PCON中只需要把最高位SMOD0配置为1,使波特率加倍即可。所以PCON=0x80;。这样PCON就配置好了。
SBUF不需要配置,只需要赋值或者被赋值即可。
本实验串口需要配置的内容就这么多。
3.配置TH1定时器
本实验需要用到定时器1,通过定时器1的溢出来约定波特率,通过分频来控制收发器的采样时间,由于本实验不需要中断,所以定时器1中断无需打开
TMOD &= 0x0F; //设置定时器模式,定时器1
TMOD |= 0x20; //设置定时器模式,定时器1
TL1 = 0xF3; //设置定时初始值,系统生成
TH1 = 0xF3; //设置定时重载值,系统生成
ET1 = 0; //禁止定时器中断,本程序只需要定时器溢出即可,不需要产生中断
TR1 = 1; //定时器1开始计时
本实验的定时器采用8为重装,不需要在中断内部重新赋初值。
目前为止,本节课所需配置的所有东西都已配置完成。
接下来我们看原理图:
第一个SBUF是写入数据,当8位数据全部写好后,通过TI发送出去,发送完成后TI置1,需要软件复位。
第二个SBUF是接收数据,当接受控制器接收好数据后,移入SBUF,接收完成后RI置1,需要软件复位。
定时器T1通过溢出率来约定波特率,控制收发器采样时间。
接下来我们看写完的代码:
首先,我们要写一个UART_SendByte(unsigned char Byte)函数来发送SBUF里面的数据,这时SBUF在左边,是被赋值的对象,当主函数调用这个函数时,参数为sec,每次调用后sec++,在函数内部,通过while循环判断TI是否为1,如果不为1则死循环,直到TI为1为止,数据才算发出去。数据发送完成后,软件复位TI=0;通过单片机的快速扫描,这个函数就实现了每隔一段时间,单片机串口向电脑端发送递增的数据。 主函数内部的 Delay(1)是为了消除晶振带来的误差。
所以本实验的第一个代码就完成了。
接下来我们看本实验的第二个代码:电脑端发送数据控制led
这个代码相比于上一个代码,我们需要用到UART的中断,所以我们在配置寄存器的时候,还需要将UART的中断打开,即ES=1,EA=1,当TI和RI其中一个中断信号经过时,都会产生中断。
我们来看代码实现:
在中断内部,我们首先要判断产生的中断信号是TI还是RI,只有RI中断信号可进入中断要操作的程序,此时的SBUF在等号右边,是赋值给P2口,由电脑端直接写入,此时电脑就可以直接通过写入的数据控制led亮灭,写入成功后,在利用上个代码中的发送SBUF,将数据原封不动的返回电脑,最后再将RI置0,为下一次带电脑控制led做准备。
QS:为什么SBUF作为发送数据的时候,不需要用到中断,而作为接收端的时候则需要呢?
答:当SBUF作为发送端时,只需要发送数据到电脑端上,并不需要单片机产生任何操作,所以不需要打断单片机的主程序,进入中断执行另一个程序。
当SBUF作为接收端时,电脑通过发送数据控制led,单片机需要做出相应操作,所以需要中断。