通信方式
并行通信
串行通信
- 异步串行通信

- 同步串行通信
串行通信制式 - 单工
- 半双工
- 全双工
串行通信的错误校验 - 奇偶校验:在发送数据时,数据位尾随的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;
}