串口说白了,就是初始化后,用中断接收发送字符而已。
TXD 是 80C51 单片机的P3.1口,RXD 是80C51 单片机的 P3.0口
T1 溢出率 是定时器1的溢出率 ,SMOD是发送速率倍频的16分频,T1每溢出一次发送一位,每次发送完后TI申请中断,就是串口每次发送完一个字节去申请一个中断,每接受完一个字节它也要申请一次中断。接受完了通过移位寄存器SBUF 取走。发送也用SBUF。
SCON是一个特殊功能寄存器,用以设定串行口的工作方式、接受/发送控制以及设置状态标志:
串行口控制寄存器SCON
它用于定义串行口的工作方式及实施接收和发送控制。字节地址为98H(它是一个字节),其各位定义如下表:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
SM0、SM1:串行口工作方式选择位,其定义如下:
SM0、SM1 | 工作方式 | 功能描述 | 波特率 |
0 0 | 方式0 | 8位移位寄存器 | Fosc/12 |
0 1 | 方式1 | 10位UART | 可变 |
1 0 | 方式2 | 11位UART | Fosc/64或fosc/32 |
1 1 | 方式3 | 11位UART | 可变 |
UART为异步传输。因此一般用方式1了,方式23是9/11位的,不常用的。而真正实用的,用串口实现串行通信的是方式1。在方式1时,只有开中断允许标志位和接收到数据后,才会申请中断,单片机才会响应中断。
严格来说,51单片机的串口方式0,并不是用于串口通信的,只用于在RXD,TXD引脚上接有74LS164,串入/并出,或74LS165,并入串出。也就是只能与串行芯片配合使用的。串口方式0是同步移位工作模式,波特率是固定的,没法改变波特率。一般用于串转并或并转串的应用中。到时候再用就好了。
REN:接收允许控制位。由软件置位以允许接收,又由软件清0来禁止接收。
TB8: 是要发送数据的第9位。在方式2或方式3中,要发送的第9位数据,根据需要由软件置1或清0。例如,可约定作为奇偶校验位,或在多机通讯中作为区别地址帧或数据帧的标志位。(是最后一位,多用来进行校验吧)
RB8:接收到的数据的第9位。在方式0中不使用RB8。在方式1中,若(SM2)=0,RB8为接收到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。
TI:发送中断标志。在方式0中,第8位发送结束时,由硬件置位。在其它方式的发送停止位前,由硬件置位。TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的方法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。TI必须用软件清0。
RI:接收中断标志位。在方式0,当接收完第8位数据后,由硬件置位。在其它方式中,在接收到停止位的中间时刻由硬件置位(例外情况见于SM2的说明)。RI置位表示一帧数据接收完毕,可用查询的方法获知或者用中断的方法获知。RI也必须用软件清0。
串行发送中断标志TI和接收中断标志RI是同一个中断源,CPU事先不知道是发送中断TI还是接收中断RI产生的中断请求,所以,在全双工通信时,必须由软件来判别。复位时SCON所有位都清0.
51单片机SBUF意思是SBUF串行口数据缓冲寄存器,分为输入和输出,但使用zhi时用同一个名字。比如MOV SBUF,A(是输出dao),MOV A,SBUF(是输入)。SBUF既是接收缓冲器又是发送缓冲器,同一时间只能为一种,要么接收,要么发送。a=SBUF是把接收缓冲器中的数据复制给a。SBUF=a是把a中的数据复制给发送缓冲器。通过读写缓冲器SBUF实现数据收发功能。
SBUF简介:
SBUF全称serial data buffer,中文名称“串行数据缓冲器”。
这个重叠的地址靠读/写指令区分:串行发送时,CPU向SBUF写入数据。
99H表示发送SBUF;串行接收时,CPU从SBUF读出数据,99H表示接收SBUF。
串行口中有两个缓冲寄存器SBUF,一个是发送寄存器,一个是接收寄存器。
SBUF在物理结构上是完全独立的。它们都是字节寻址的寄存器,字节地址均为99H。
异步通信
异步通信数据格式一般为字符格式
一个字符一个字符地传输,每个字符一位一位的传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符间没有固定的间隔要求。每一个字符的前面都有一位起始位(低电平),字符本身由5-7位数据位组成,接着字符后面是一位校验位(也可以没有校验位),最后一位或一位半或两位停止位,停止位后面是不定长的空闲位。停止位和空闲位都规定为高电平,这样就保证了起始位开始处有一个下跳沿。
同步通信(了解即可)
同步通信就比如说是老师发作业本,约定学习委员来取作业本。建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步,而且传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符之间不留间隙,即保持位同步关系,也保持字符同步关系。
同步通信使用的数据格式根据采用的控制规程(通信双方就如何交换信息所建立的一些规定和过程称为通信控制规程),可分为面向字符型和面向位型两种,面向字符型数据格式又有单同步,双同步,和外同步之分。三个同步方式均以2个字节的冗余检验码CRC作为一帧信息的结束。
单同步:发送方先发送一个同步字符,再传送数据块,接收方检测到同步字符后接收数据
双同步:发送方先传送2个同步字符,再传送数据块,接收方检测到同步字符后接收数据;
外同步:用一条专用线来传送同步字符,以实现收发双方同步操作同步通信中,在数据开始传送前用同步字符来指示(常约定1~2个),并由时钟来实现发送端与接收端的同步,我们使用QQ的文件传输功能就可以看做是一个同步通信的例子,首先传文件的双方必须说好一个传文件的时间,如果双方有一个不在线上,就不能传输。其次,发送方发送文件命令后,接收方要确认是否接收,这个就是建立文件传输的过程,一旦传输开始,所有文件数据必须连续的传输过去,任何中断都将导致传输失败。
根据串行通信格式及约定(如同步方式、通信速率、数据块格式等)不同,形成了许多串行通信接口标准,如常见的:
UART(串行异步通信接口)
USB(通用串行总线接口)
I2C(集成电路间的串行总线)
SPI(串行外设总线)
485总线、CAN总线接口等。
这个就是RS232
假设数据传送的速率是120字符/s,波特率即为1200 b/s。每一位的时间即为1/1200。
P3.0,3.1是默认的串口管脚, P3.6,3.7 是可以通过寄存器设置串口连接到这两个管脚。
内部串口只有一个,可以在这两个脚之间切换