串口通讯:各个字节一位一位传输
包括 异步通信和同步通信
同步通信:保持位同步也保持字符同步
传输速率:
比特率:每秒钟传输二进制代码的位数
波特率:每秒钟调制信号变化的次数,每秒钟发送的位数
在基带传输中,比特率和波特率相同
异步通信:前有 起始位,后有 校验位,停止位
一、工作方式寄存器SCON
RI 接收中断标志位;接收结束时,会由硬件置1,向CPU发出中断请求;同时由软件进行复位
TI 发送中断标志位;发送结束时,会由硬件置1,向CPU发出中断请求;同时由软件进行复位
TB8 用来存放发送的第九位,因为是8位进制,第九位没地方了
RB8 用来存放接收的第九位
REN 串行接收允许位;0--允许接收;1--禁止接收
串行口的工作方式,由SM0和SM1两位共同控制
0 0 (方式0)位移寄存器
0 1 (方式1)10位异步收发器(8位数据)波特率可变
1 0 (方式2)11位异步收发器(9位数据)
1 1 (方式3)11位异步收发器(9位数据)波特率可变
二、工作方式寄存器PCON
只用到第七位SMOD,但是PCON 没有位寻址,操作SMOD直接操作这个寄存器
即 PCON=0xfe;
SMOD是波特率是否加倍的选择,0--加倍;1--不加倍
三、波特率
定义:串行口每秒钟发送的位数;用定时器T1作为波特率发生器(利用了工作方式2)
可用工具进行计算
四、串口的操作步骤
1、设置波特率,设置定时器T1为工作方式2 { 八位自动重装定时/计数器 }(TMOD寄存器)TMOD=0x20;赋初值高8位TH0和低8位TL0;
2、设置工作方式;设置SCON寄存器为工作方式1 SCON=0x50--[0101 0000];设置PCON寄存器,决定波特率是否加倍(看最高位)
3、打开中断,EA=1;ES=1(串行中断允许位)
4、开始工作计时,TR1=1,TCON控制寄存器(因为是用T1计时器,所以是TR1)
SCON=0x50---
#include <reg52.h>
#include"bstv51.h"
void UsartConfiguration()
{
TMOD=0x20;//0010 0000;T1高4位控制,工作方式2 { 八位自动重装定时/计数器 }
TH1=0xfd;//初始值
TL1=0xfd;
SCON=0x50;//0101 0000;0 1? ?(方式1)10位异步收发器(8位数据)波特率可变
EA=1;//开大门
ES=1;//开串行中断允许位
TR1=1;//开始计时工作
}
void main()
{
bstv51_init();
UsartConfiguration();//调用串口通讯函数
while(1)
{}//空转
}
void xyh() interrupt 4//中断函数
{
uchar date;
date=SBUF;//取数据
RI=0;//接收中断标志位,接收结束,软件复位=0
SBUF=date;//发送数据,把数据传回去
while(!TI);//发送中断标志位,当TI=0时,while语句内为真【真就是1】,执行这个语句,不断重复
//当TI=1,即发送结束时,while语句为假,不执行,进行下一个语句
TI=0;//软件复位
}