查阅stc89c51手册后总结:
STC89C52有1个UART。
STC89C52的UART有四种工作模式:
- 模式0:同步移位寄存器;
- 模式1:8位UART,波特率可变(常用);
- 模式2:9位UART,波特率固定;
- 模式3:9位UART,波特率可变;
相关重要的寄存器:
具体如下:
SCON:串口控制寄存器(可位寻址)
重点是相关模式的配置和TI/RI的软硬件置位和清零
SCON = 0x40/0x50 的由来,将四个工作模式的0或1带入上方表中的8位换算成0x的16进制。
TI: 发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,必须用软件复位;
RI:接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到停止位的中间时刻由内部硬件置位,即RI=1(例外情况见SM2说明),必须由软件复位,即RI=0。
4.2 PCON:电源控制寄存器(不可位寻址)
主要配置波特率是否加倍,在此只做了解,因为可以软件配置。
5.1 发送数据流程
初始化:
• Step1:配置串口控制寄存器SCON为0x50
• Step2:配置电源控制寄存器PCON(计算波特率);
• Step3:配置定时器T1(串口通信只能用定时器1,只能使用8位自动重装工作模式),启动定时器T1;
• Step4:禁止定时器T1中断;
配置好后,删掉AUXR的配置,这是新型单片机的端口,C51并没有,而且千万不要忘了两个中断总开关EA/ES的配置
因为串口通信的底层代码和基础知识都是配置时序逻辑,所以要利用定时器时刻检测,当检测到发送数据时,此时时序会发生变化,在定时器的配置不断扫描下会判断进入中断服务函数。查询手册串口中断向量对应的中断次序号如下图:
所以要进行 interrupt 4 中断服务函数的配置
串口发送函数,将字节传给串行口数据缓冲寄存器SBUF (实际上时两个缓冲器分别进行读写的操作)
由于TI为 发送中断请求标志位,发送结束后硬件自动置1,所以while(TI==0)TI = 0说明此时Byte写给SBUF的操作还未完成,当TI置1后说明已经完成,此时需要软件清0.
RI为接收中断请求标志位,在ISP上发送字节后,字节被写入SBUF且触发串口中断,进入中断服务函数4,RI硬件置1,然后进行服务函数的编写后将RI软件清0。
大概配置流程如上,实现具体功能主要配置串口服务函数,在后续会继续更新。