day_2.51单片机串口通信

51单片机串口通信

定义:
计算机通信:计算机与外部设备或计算机与计算机之间的信息交换。
并行通信:数据字节的各位用多条数据线同时进行传送。
串行通信:将数据字节分成一位一位的形式在一条数据线上逐个地传送。

一.串口通信概念:
1.异步通信:通信的发送和接收设备使用各自的时钟控制数据的发和收。要求收发设备时钟尽可能一致。
2.以字符(构成帧)为单位进行传输,字符与字符之间的间隙是任意的;每一个字符中的相邻位之间的时间间隔是相同的;
3.数据格式:起始位 LSB X X X X X X MSB 校验位 停止位共11位。
4.同步通信:发送方控制接收方时钟,使双方时钟完全同步;
5.串行通信的传输方向:单工、半双工、全双工。
6.错误校验:
Ⅰ奇偶校验:
奇校验:8位数据后一位与前面8位中“1”的个数之和应为奇数;
偶校验:****************************************************偶数;
检验是否一致,不一致则数据传输出错。
Ⅱ代码和校验:
发送方对所发数据块求和,产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据,并求和,与所收到校验和比较,看是否相符。不符则传输出错。
Ⅲ循环冗余校验:通过某种数学运算实现有效信息与校验位之间的循环校验。
二.串口通信原理
1.传输速率:
比特率:每秒钟传输二进制代码的位数。单位:位/秒(bps)。
1bit(位)1byte(字节) 1kb=1024byte
8bit=1byte 范围:0000 0000~FFFF FFFF表示 0 ~256个数。
传的速度越快,那么距离要越近。
2.TTL 电平转 RS232 电平用 MC1488;RS232转TTL电平用 MC489;RS232C距离小于15米,最高速率20kbps;
3.RS-422A 接口。输出驱动器为双端配合驱动器,传输速率90Kbps时,传输距离可达1200米。全双工。
4.RS-485,两线,半双工。设备可加中继器。传输1200米,速率可达1Mbps.
三.51单片机的串行口资源。
1.两个物理上独立的 接收、发送缓冲器SBUF,占用同一地址。发送和接收不会产生重叠。
2.串行口控制寄存器SCON(98h):控制寄存器SCON(图片来源与所购开发板附赠PPT,侵删)
①SM2,多机通信控制位,方式0时必为0,方式1时,SM2=1,只有接收到有效停止位,RI(收中断标志)才置1
②REN,允许串行接收位,软置1,启动串行接收数据,软置0禁止接收;
③TB8,方式2、3中发送数据的第9位,可软件规定其作用
④RB8,方式2,3中收到的第9位,方式1时,SM2=0,RB8是收到的停止位。
⑤TI,发送中断标志位。发送完了自动硬件置1,向CPU发送中断申请,必须软清;
⑥RI, 接收中断标志位。收完了自动硬件置1,向CPU发送中断申请,必须软清;
3.PCON寄存器,可以位操作,SMOD=1,让波特率倍增。
4.工作方式:
①方式0:TXD(P3.1)发送移位脉冲,RXD(P3.0)输出数据,低位在前,高位在后,波特率固定;
②方式1:10位数据异步通信口。TXD发送引脚,RXD接收引脚,一位起始位,8位数据位,一位停止位;
③方式2、3:11位数据异步通信口,起始位、9位数据位、停止位。9位数据位最后一位发送时为TB8,接收时为RB8;方式二的波特率固定为晶振频率的1/32或1/64;方式3的波特率由定时器T1的溢出率决定;
5.波特率计算:
①方式0(晶振频率的1/12)、2固定波特率(2SMOD /64 ×晶振频率);
②方式1、3的波特率=(2SMOD /32)乘(T1的溢出率);
③T1作为波特率发生器,自动重装载(方式2);
四、串口使用步骤;
1.确定T1的工作方式;(TMOD);
2.计算初值(TH1,TL1);
3.启动T1;(TR1=1);
4.确定串行口控制(SCON);
5.五个中断源复习;
①/INT0 (P3.2), 外部中断0,P3.2引脚低电平或下降沿信号 ,中断号0;
②T0, ------- ------定时器0中断 ,定时/计数器0计数回0 溢出,中断号1;
③/INT1(P3.3),外部中断1,P3.3引脚低电平或下降沿信号,中断号2;
④T1 定时器1中断,定时/计数器1计数回0 溢出,中断号3;
⑤TI/RI 串行口中断 串行口完成接收一帧数据引起中断,中断号4;
五、例程
功能:PC发送单片机数据,单片机把收到的发给PC。
注意:PC发送接收波特率与写入单片机的程序的波特率要一致。
1.串口初始化;SMOD、T1的TH1,TL1、总中断EA=1;TR1=1;

void Usart_Int()//初始化函数
{
	TMOD=0X20;
	TH1=0XF3;
	TL1=OXF3;
	PCON=0X80;//SMOD=1,倍频
	TR1=1;//定时器1启动
	SCON=0X50;//串口中断控制寄存器
	ES=1;//串口中断开关
	EA=1;//总中断开关
}

2.串口中断函数;

void Ustart() interrupt 4
{
	unsigned char recieve_date;
	recieve_date=SBUF;
	RI=0;//接收中断标志位
	SBUF=recieve_date;//收到的数据再发回去
	while(!TI);//等待发送完成;
	TI=0;//清0等待下次发送;
}

(普中单片机学习笔记)

猜你喜欢

转载自blog.csdn.net/jun8086/article/details/104298282