单片机-串口

通信方式

并行通信
串行通信

  • 异步串行通信
  • 同步串行通信
    串行通信制式
  • 单工
  • 半双工
  • 全双工
    串行通信的错误校验
  • 奇偶校验:在发送数据时,数据位尾随的1位为奇偶校验位。奇校验时,数据中的1的个数和校验位1的个数之和应为奇数;偶校验时,数据中的1的个数和校验位1的个数之和应为偶数。
  • 代码和校验
  • 循环冗余校验

RS232-TTL


波特率
每秒传输二进制代码的位数,1波特=1位/秒,单位为bps。
如每秒传输240个字符,每个字符有10位,波特率为2400bps。
波特率计算:

方式 波特率
方式0 fosc/12
方式1 (2^SMOD/32)*(T1溢出率)
方式2 (2^SMOD/64)*fosc
方式3 (2^SMOD/32)*(T1溢出率)

#电源管理寄存器PCON
字节地址为87H,不能位寻址。

位序号 D7 D6 D5 D4 D3 D2 D1 D0
位符号 SMOD SMOD0 LVDF P0F GF1 GF0 PD IDL

SMOD:串行口波特率

  • SMOD=0:串行口方式1,2,3,波特率正常。
  • SMOD=1:串行口方式1,2,3,波特率加倍。

T1溢出率:T1定时器溢出的频率


串行口结构

串行口控制寄存器SCON

位序号 D7 D6 D5 D4 D3 D2 D1 D0
位符号 SM0 SM1 SM2 REN TB8 RB8 TI RI

SM0 、SM1:工作方式选择位

  • 串行口有四种工作方式,由SM0 、SM1设定
SM0 SM1 方式 方式说明
0 0 0 同步移位寄存器方式
0 1 1 10位异步收发器(8位数据),波特率可变
1 0 2 11位异步收发器(9位数据),波特率固定
1 1 3 11位异步收发器(9位数据),波特率可变

SM2:多机通信控制位
REN:允许串行接收位

  • REN=1:允许串行口接收数据。
  • REN=0:禁止串行口接收数据。

TB8:方式2,3中发送数据的第9位。
RB8:方式2,3中接收数据的第9位。
TI:发送中断标志

  • 在方式0时,当串行发送第8位数据结束时,或在串行发送停止位的开始时,由内部硬件置1,向CPU发送中断申请。在中断服务程序中,必须用软件将其清0,取消此中断。

RI:接收中断标志位

  • 在方式0时,当串行接收第8位数据结束时,或在串行接收停止位的中间时,由内部硬件置1,向CPU发送中断申请。在中断服务程序中,必须用软件将其清0,取消此中断。

串口设置:

1、确定定时器T1的工作方式(编程TMOD寄存器)
2、计算T1的初值,装载TH1,TL1
3、启动T1(编程TCON中的TR1位)
4、确定串行口工作方式(编程SCON寄存器)
5、串行口工作在中断方式下时,要进行中断设置(编程IE,IP寄存器)
设置虚拟仿真串口如下:


打开虚拟串口软件Configure Virtual Serial Port Driver:

添加COM1、COM2,打开XCOM软件:

运行仿真:

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int
uchar flag,a,i;
uchar code table[]="I get ";

void init()
{
	TMOD=0x20;  //0010 0000 定时器T1工作方式2:8位初值自动重装的定时器/计数器
	TH1=0xfd;  //253,波特率为9600,SMOD置0
	TL1=0xfd;  //与TH1一样
	TR1=1;  //启动定时器
	REN=1;  //串行口控制寄存器SCON,允许串行接收位
	SM0=0;
	SM1=1;  //串行口工作方式为1
	EA=1;  //串行口工作在中断方式,编程中断允许IE寄存器,允许全局中断
	ES=1;  //打开串行口中断
}

void main()
{
	init();
	while(1)
	{
		if(flag==1)
		{
			ES=0;
			for(i=0;i<6;i++)
			{
				SBUF=table[i];
				while(!TI);
				TI=0;
			}
			SBUF=a;
			while(!TI);
			TI=0;
			ES=1;
			flag=0;
		}
	}
}

void ser() interrupt 4
{
	RI=0;
	a=SBUF;
	flag=1;
}
赞赏