简单的单片机串口通信

单片机串口通信

串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。

单工、半双工及全双工的区别

单工是对一个哑巴说活,半双工是两人用对讲机交流,全双工是两人激烈的吵架

使用方法

由于每个硬件都有一个开发手册,软件代码必须根据手册来写,因此代码并没有固定的。这里用51单片机来举例:
51单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选
择特殊功能寄存器PCON。
串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能。格式如下
在这里插入图片描述
其中SM0SM1按下列组合确定串行口的工作方式:
简单的单片机串口通信_第1张图片
SM2:允许方式2或方式3多机通信控制位。在方式2或方式3时,如SM2位为1,REN位为1,则从机处于只有接收到RB8位为1(地址帧)时才激活中断请求标志位RI为1,并向主机请求中断处理。被确认为寻址的丛机则复位SM2位为0,从而才接收RB8为0的数据帧。在方式1时,如果SM2位为1,则只有在接收到有效的停止位时才置位中断请求标志位RI为1;在方式0时,SM2 应为0。
REN:允许/禁止串行接收控制位。由软件置位REN,即REN=1为允许串行接收状态,可启动串行接收器RxD,开始接收信息。软件复位REN,即REN=0,则禁止接收。
TB8: 在方式2或方式3,它为要发送的第9位数据,按需要由软件置位或清0。例如,可用作数据的校验位或多机通信中表示地址帧/数据帧的标志位。
RB8: 在方式2或方式3,是接收到的第9位数据。在方式1,若SM2=0,则RB8是接收到的停止位。方式0不用RB8。
TI: 发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,必须用软件复位。
RI: 接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到停止位的中间时刻由内部硬件置位,即RI=1(例外情况见SM2说明),必须由软件复位,即RI=0。

当软件设置SCON的SM0、SM1为“01” 时,串行通信则以模式1工作。此模式为8位UART格式,一帧信息为10位:1位起始位,8位数据位(低位在先)和1位停止位。波特率可变,即可根据需要进行设置。TxD(TxD/P3.1)为发送信息,RxD(RxD/P3.0)为接收端接收信息,串行口为全双工接受/发送串行口。(具体的可以查看STC89C52芯片手册这里就不多说了)
因此需要先写出
SCON |= 0x1 << 6
这句代码代表SM0为0,SM1为1工作模式为1。
再然后确定波特率的设置,串行通信模式1的波特率=2SMOD/32×(定时器/计数器1溢出率)。
当 单片机工作在12T模式时,定时器的溢出率 = SYSclk/12/( 256 - TH1)。
SYSclk是系统频率。
TMOD |= 0x1<<5;// TR1 = 1; 启动定时器,让定时器工作
TCON |= 0x1 << 6; 定时器1的模式为1
TH1 = 0xFD;算出来的地址是16位的这是低8位 这里频率为9600
TL1 = 0xFD; 算出来的地址是16位的这是高8位
这样串口初始化就配置好了,可以通过

void sendByte(char byteData)
{
	SBUF = byteData; //启动发送 主机?行将数据写入发送缓冲器SBUF指令时启动发送
	while ( TI != 1); //发送的过程,该条件满足,while一直循环不做事情
	TI=0;         //TI软件清零
}

void sendString(char *pstr)
{
	while( *pstr != '\0'){
		
		sendByte(*pstr);
		pstr++;
	//	delay();
	}
}

int main()
{
	initUart();	
	while(1){

			  	sendString("hello\r\n");
				delay();

		}
	}	
	
	return 0;
}

来让51单片机传送给PC你设定的“hello”字符串了

你可能感兴趣的:(简单的单片机串口通信)