单片机80c51的串行口

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

80C51的串行口
下面是学习过程中的一些总结:
总括:计算机与外界信息的交换称为通信,主要有两种方式:并行通信:传输速度快,但传输线较多,价格较贵。

串行通信:数据的各位按顺序一位一位发送或接收。

大多数单片机都配置了SCI串行口,主要有两种方式:
1、异步通信:每个字符为一帧,要包括:
起始位、数据位、校验位、停止位。

每帧数据之间的时间间隔是不固定的,字符间的同步依靠通信
协议实现;帧内每一位数据的同步依靠收、发时钟实现
2、同步通信:信息流中的字符与字符间和字符内部位与位之间都
需要一个同步时钟。

,可以把许多字符组成一个信息组,也称为一帧。

串行通信数据传输速率:
意义是每秒钟传送多少个二进制数。

一般异步通信在:50~9600bit/s
同步通信在:100~2Mbit/s
我们称之为比特率,但在二进制的情况下,比特率和波特率数值相同,故而一般称作“波特率”。

串行口简介:
组成:两个数据缓冲寄存器SBUF
一个串行口控制寄存器SCON
一个输入移位寄存器
串行口波特率发生器用于控制串行通信的速率(由内部的分频器和控制开关电路组成),它的振荡源可以来自单片机的振荡频率
f OSC,也可以来自定时/计数器的时钟输出。

外界数据通过引脚RXD(P3.0)输入。

数据先逐位进入输入移位寄存器,在进入接收寄存器(SBUF),在接收器中采用了双缓冲结构,避免数据重叠(因为CPU是被动的)。

要发送的数据通过发送控制器控制逻辑门电路经输出移位寄存器一位一位输出到TXD(P3.1)。

串行口控制寄存器SCON:
SM0,SM1为串行方式选择位,可以有四种方式;
SM2为多机通信控制位,在方式2、3中配合发送/接收数据的第九位(TB8/RB8)对主机发来的数据识别并处理。

REN为允许串行接收位,要由软件控制置1为允许接收。

TI、RI为发送/接收中断标志位。

注意:在发送完数据后硬件会自动置TI为1,若要继续发送,必须用软件清零。

准备接收时,首先要清零RI,接收完8位数据后硬件会自动置RI为1,然后执行读数据指令MOV A,SBUF,然后一定要清RI为0。

波特率的设置:
方式0:时钟频率的1/12,不受SMOD位影响。

方式2: (2SMOD/64)*f osc
方式1和3:(2SMOD/32)*T1溢出率
T1溢出周期:(12/f osc)*(256-X)和定时器有关了
我们一般是根据波特率计算溢出初值X。

串行口工作方式:
由于我们最常用的是方式1,故重点介绍如下:
执行MOV SBUF,A指令时,CPU将一个数据写入发送缓冲寄存器,就启动发送器发送。

发送完一帧数据后,TI置1,通知CPU可以发送下一个数据了。

接收时,首先置RI为0,REN为1;CPU开始从RXD采样,当发现1至0的负跳变时,确定是起始位0。

当停止位到来之后送入RB8,RI=1,申请中断,通知CPU取走SBUF中数据。

计算机仿真可以看出,方式一下的波特率误差最小,数据最稳定。

总的来说,方式2,3均为11位异步通信方式,只是波特率的设置方法不同。

发送或接收时和数据的第九位相关,联系到一个应用领域即多机通信。

多机通信:
80C51的串行通信方式2、3有一个专门的应用领域:多机通信
主要靠主从机之间正确的设置与判断多机通信控制位SM2和发送/接收数据的第九位(D8)。

主机发送地址帧数据:MOV SCON,#0D8H //11011000
置TB8为以表示1地址帧
所有从机初始化SM2=1,处于接收地址帧的状态
MOV SCON,#0F0H //11110000 当从机接收到主机发来的信息后,若RB8=1,则置RI=1,中断后判断发来的地址与自己是否相符。

若相符,SM2=0;
准备接收数据帧;并向主机返回地址核对;
主机发送数据时,置TB8=0,此时各个从机都处于接收状态,但只有SM2=0的那个从机才可以接收到数据。

注意:这里都是方式3;
下面举例示范:
#include<reg52.h>
#define uchar unsigned char
uchar i;
sbit D0=P1^0;
sbit D1=P1^1;
sbit D2=P1^2;
sbit D3=P1^3;
sbit D4=P1^4;
sbit D5=P1^5;
sbit D6=P1^6;
sbit D7=P1^7;
void chuankou(void) //串口初始化函数
{
TMOD=0X20; //设置中断工作方式寄存器为00100000:
//方式2(自动重载)
//在方式2下,16位的定时/计数器被拆
//成两个:寄存器THI用以保持初值,TL0
//计数,若溢出,则置//位中断。

TH1=0Xfd;
TL1=0xfd;//以11.0592MHZ为晶振,波特率为9600时的初值;
TR1=1;
SCON=0X50;//01010000:串口方式1,REN置1;
EA=1;//总中断打开
ES=1;
}
void main(void)
{
void chaunkou();
while(1) //大循环
{
while(!RI); //等待RI置1 ,通知CPU从SBUF中取走数据
RI=0; //软件清0,继续循环采样
i=SBUF;
switch(i)
{
case 0x01:D0=~D0;break; //取反
case 0x02:D1=~D1;break;
case 0x03:D2=~D2;break;
case 0x04:D3=~D3;break;
case 0x05:D4=~D4;break;
case 0x06:D5=~D5;break;
case 0x07:D6=~D6;break;
case 0x08:D7=~D7;break; //使用串口调试助手发送数据,CPU根据SBUF接收到的数据使对应的LED亮;
}
}
}
编译:keilc中
在target中设置频率:11.0592MHZ,并生成hex文件;
利用USB转串口芯片,启动串口调试助手。

在STC中下载时要把串口助手中的端口关闭,否则串口复用会报错。

在串口助手中选择端口(不同的计算机不一样,我的是COM5)
选择十六进制数发送(不然发送的是ASCII码),输入01并点击手动发送,会看到LED1被点亮。

即完成了单片机接收电脑发送数据的实验。

以上是学习中的总结,参考了相关书籍和文档,也经过实验验证叙述不清晰不到位的地方望见谅,或者和我交流。

微信号:yr0868。

相关文档
最新文档