寒假过去一半了,这两天重新开始学习。这里来个小结,51单片机的一些关于串口通信的寄存器/锁存器。
首先放上一段代码,来自郭天祥的51单片机教程
功能是:向单片机发送一个字符(比如e),然后单片机返回字符串“ I get e”,串口通信。
#include <reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar flag, a;
uchar code table[]=" I get ";
//串口初始化
void Serial_Init()
{
TMOD = 0x20; //设定T1定时器工作方式2
TH1 = 0xfd; //T1定时器装初值
TL1 = 0xfd; //T1定时器装初值
TR1 = 1; //启动T1定时器
REN = 1; //允许串口接收
SM0 = 0; //设定串口工作方式1
SM1 = 1; //同上
EA = 1; //开总中断
ES = 1; //开串口中断
}
void main()
{
Serial_Init();
while(1)
{
if(flag)
{
uchar i;
ES = 0;//先关闭串口中断防止干扰
for(i=0; i<7; i++)
{
SBUF = table[i];
while(!TI);//即等待发送完成,因为发送完成后TI由硬件置位
TI = 0;//清零以进行下一次发送
}
SBUF = a;//串行发送时,CPU向SBUF写入数据,sbuf的容量很大
while(!TI);
TI = 0;
ES = 1;
flag=0;
}
}
}
void ser() interrupt 4 //串口中断,接收,a相当于接收缓存
{
RI = 0;//接收完成后RI由硬件置1,中断里面清零以进行下一次接收
a = SBUF;//串行接收时,CPU从SBUF读出数据
flag = 1;
}
1.SBUF
引用百科:
全称:serial data buffer
串行数据缓冲器
串行口中有两个缓冲寄存器
SBUF,一个是发送寄存器,一个是接收寄存器,在物理结构
上是完全独立的。它们都是字节寻址的寄存器
,字节地址均为99H。
这个重叠的地址靠读/写指令区分:串行发送时,CPU向SBUF写入数据,此时99H表示发送SBUF;串行接收时,CPU从SBUF读出数据,此时99H表示接收SBUF。单片机串口程序参考。
之前学习的时候对SBUF一知半解,只是抄了代码,看了效果。这两天重新学习后得到一些新的认识。
首先是百科中提到的,串行口中有两个缓冲寄存器SBUF,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的。它们都是字节寻址的寄存器,字节地址均为99H。代码段中 SBUF=a 或者 SBUF = table[i] 都是CPU向SBUF写入数据,同时表示此时是发送状态, a=SBUF 是CPU从SBUF读出数据,同时表示此时是接收状态。也即0x99H这个重叠的地址靠读/写指令区分。
另外SBUF的容量很大,至少可以放200字节数据(200个字符)
2.TI/RI
SCON (Serial Port Control Register
) 在51单片机中代表这是串口控制寄存器
scon控制寄存器,它是一个可位寻址的专用寄存器,用于串行数据的通信控制,单元地址是98H,其结构格式如下:
SCON |
SM0 |
SM1 |
SM2 |
REN |
TB8 |
RB8 |
TI |
RI |
位地址 |
9FH |
9EH |
8DH |
9CH |
9BH |
9AH |
99H |
98H |
其中
TI:发送中断标志位
可寻址标志位。方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件置0。
RI:接收中断标志位
可寻址标志位。接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。
注:在串口中断处理时,TI、RI都需要软件置0,硬件置位后不可能自动清0,此外,在进行缓冲区操作时,需要ES=0,以防止中断出现。
代码中SBUF = table[i] 即发送后有 while(!TI) 即等待发送完成,因为发送完成后TI由硬件置位,然后 TI = 0 软件清零以进行下一次发送
RI也是一样,进入中断是因为PC通过串口向单片机发送了信息,单片机接收完成后RI由硬件置1, RI = 0 由软件清零以进行下一次接收。
3.ES
参考
这里,ES是中断允许寄存器IE的第5位(IE^4),表示
串行口中断允许(ES=1充许,ES=0禁止)。代码中首先ES=0,关闭串口中断防止干扰,先把要发的数据放到SBUF,全部放完后再ES=1,使能串口中断。
唔,如果昨晚效率高些就能早点总结完这个然后看can通信的代码了。。这里给自己小结下(其实是参考百科等资料把看懂的表达出来),对下一步有帮助。
51和stm32各有长短,stm32给nrf24l01的配置比较麻烦。。
嗯,新年快乐,马上快乐~