51单片机串口通信笔记.rtf

上传人:赵** 文档编号:46687458 上传时间:2022-09-27 格式:RTF 页数:10 大小:143.65KB
返回 下载 相关 举报
51单片机串口通信笔记.rtf_第1页
第1页 / 共10页
51单片机串口通信笔记.rtf_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《51单片机串口通信笔记.rtf》由会员分享,可在线阅读,更多相关《51单片机串口通信笔记.rtf(10页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、串行口控制寄存器 SCON 字节地址 98H,可位寻址,格式如图所示。scon 寄存器结构 scon d7 d6 d5 d4 d3 d2 d1 d0 sm0 sm1 sm2 ren tb8 rb8 ti ri 位地址 9fh 9eh 8dh 9ch 9bh 9ah 99h 98h(1)SM0、SM1串行口 4 种工作方式的选择位 表 串行口的 4 种工作方式SM0 SM1 方式 功 能 说 明 0 0 0 同步移位寄存器方式(用于扩展 I/O 口)0 1 1 8 位异步收发,波特率可变(由定时器控制)1 0 2 9 位异步收发,波特率为 fosc/64 或 fosc/32 1 1 3 9 位异

2、步收发,波特率可变(由定时器控制)(2)SM2 多机通信控制位 用于方式 2 或方式 3 中。当串行口以方式 2 或方式 3 接收时,如果 SM2=1,只有当接收到的第 9 位数据(RB8)为“1”时,才将接收到的前 8 位数据送入SBUF,并置“1”RI,产生中断请求;当接收到的第 9 位数据(RB8)为“0”时,则将接收到的前 8 位数据丢弃。如果 SM2=0,则不论第 9 位数据是“1”还是“0”,都将前 8 位数据送入 SBUF 中,并置“1”RI,产生中断请求。在方式 1 时,如果 SM2=1,则只有收到停止位时才会激活 RI。在方式 0 时,SM2 必须为 0。(3)REN允许串行

3、接收位 由软件置“1”或清“0”。REN=1 允许串行口接收数据。REN=0 禁止串行口接收数据。(4)TB8发送的第 9 位数据方式 2 和 3 时,TB8 是要发送的第 9 位数据,可作为奇偶校验位使用,也可作为地址帧或数据帧的标志。=1 为地址帧,=0 为数据帧(5)RB8接收到的第 9 位数据方式 2 和 3 时,RB8 存放接收到的第 9 位数据。在方式 1,如果 SM2=0,RB8 是接收到的停止位。在方式 0,不使用 RB8。(6)TI发送中断标志位方式 0 时,串行发送第 8 位数据结束时由硬件置“1”,其它工作方式,串行口发送停止位的开始时置“1”。TI=1,表示一帧数据发送

4、结束,可供软件查询,也可申请中断。CPU 响应中断后,向 SBUF 写入要发送的下一帧数据。TI 必须由软件清 0。(7)RI接收中断标志位 方式 0 时,接收完第 8 位数据时,RI 由硬件置 1,其它工作方式,串行接收到停止位时,该位置“1”。RI=1,表示一帧数据接收完毕,并申请中断,CPU 从接收 SBUF 取走数据。该位状态也可软件查询。RI 必须由软件清“0”。特殊功能寄存器 PCON 字节地址为 87H,没有位寻址功能。spcon d7 d6 d5 d4 d3 d2 d1 d0 SMOD xx xx xx xx xx xx xxSMOD:波特率选择位。例如:方式 1 的波特率的计

5、算公式为:方式 1 波特率=(2SMOD/32)定时器 T1 的溢出率也称 SMOD 位为波特率倍增位。串行口的 4 种工作方式方式 0 同步移位寄存器输入/输出方式,常用于外接移位寄存器,以扩展并行 I/O 口。8 位数据为一帧,不设起始位和停止位,先发送或接收最低位。波特率固定为 fosc/12。帧格式如下:d0 d1 d2 d3 d4 d5 d6 d7.1.方式 0 发送 当 CPU 执行一条将数据写入发送缓冲器 SBUF 的指令时,产生一个正脉冲,串行口即把 SBUF中的 8 位数据以fosc/12 的固定波特率从 RXD 引脚串行输出,低位在先,TXD 引脚输出同步移位脉冲,发送完

6、8位数据置“1”中断标志位 TI。2.方式 0 接收 REN=1,接收数据,REN=0,禁止接收。REN=1,允许接收。向串口的 SCON 写入控制字(置为方式 0,并置“1”REN 位,同时 RI=0)时,产生一个正脉冲,串行口即开始接收数据。RXD 为数据输入端,TXD 为移位脉冲信号输出端,接收器也以 fosc/12 的固定波特率采样 RXD 引脚的数据信息,当收到 8 位数据时置“1”RI。表示一帧数据接收完.方式 0 下,SCON 中的 TB8、RB8 位没有用到,发送或接收完 8 位数据由硬件置“1”TI 或 RI,CPU 响应中断。TI 或 RI 须由用户软件清“0”,可用如下指

7、令:CLR TI;TI 位清“0”CLR RI;RI 位清“0”方式 0 时,SM2 位必须为 0。方式 1 SM0、SM1=01方式 1 一帧数据为 10 位,1 个起始位(0),8 个数据位,1 个停止位(1),先发送或接收最低位。帧格式如下:d0 d1 d2 d3 d4 d5 d6 d7.方式 1 波特率=(2SMOD/32)定时器 T1 的溢出率 SMOD 为 PCON 寄存器的最高位的值(0 或 1)。1方式 1 发送 方式 1 输出时,数据由 TXD 输出,一帧信息为 10 位,1 位起始位 0,8 位数据位(先低位)和 1 位停止位 1。当执行一条数据写发送缓冲器 SBUF 的指

8、令,就启动发送。发送开始时,内部发送控制信号变为有效。将起始位向 TXD 输出,此后,每经过一个 TX 时钟周期,便产生一个移位脉冲,并由 TXD 输出一个数据位。8 位数据位全部发送完毕后,置“1”TI。2方式 1 接收 数据从 RXD(P3.0)脚输入。当检测到起始位的负跳变时,开始接收数据。定时控制信号有两种):接收移位时钟(RX 时钟,频率和波特率相同)和位检测器采样脉冲(频率是 RX 时钟的 16 倍,1 位数据期间,有 16 个采样脉冲),当采样到 RXD 端从 1 到 0 的跳变时就启动检测器,接收的值是 3 次连续采样(第 7、8、9 个脉冲时采样)进行表决以确认是否是真正的起

9、始位(负跳变)的开始。当一帧数据接收完,须同时满足两个条件,接收才真正有效。RI=0,即上一帧数据接收完成时,RI=1 发出的中断请求已被响应,SBUF 中的数据已被取走,说明“接收 SBUF”已空。SM2=0 或收到的停止位=1(方式 1 时,停止位已进入 RB8),则收到的数据装入 SBUF 和 RB8(RB8 装入停止位),且置“1”中断标志 RI。若这两个条件不同时满足,收到的数据将丢失。方式 29 位异步通信接口。每帧数据均为 11 位,1 位起始位 0,8 位数据位(先低位),1 位可程控的第 9 位数据和 1 位停止位。帧格式如下。方式 2 波特率=(2SMOD/64)fosc

10、1方式 2 发送发送前,先根据通讯协议由软件设置 TB8(例如,双机通讯时的奇偶校验位或多机通讯时的地址/数据的标志位)。2方式 2 接收 SM0、SM1=10,且 REN=1。数据由 RXD 端输入,接收 11 位信息。当位检测到 RXD 从 1 到 0 的负跳变,并判断起始位有效后,开始收一帧信息。在接收器完第 9 位数据后,需满足两个条件,才能将接收到的数据送入 SBUF。(1)RI=0,意味着接收缓冲器为空。(2)SM2=0 或接收到的第 9 位数据位 RB8=1 时。当上述两个条件满足时,接收到的数据送入 SBUF(接收缓冲器),第 9 位数据送入 RB8,并置“1”RI。若不满足两

11、个条件,接收的信息将被丢弃。方式 3SM0、SM1=11,串口为方式 3。波特率可变的 9 位异步通讯方式,除波特率外,方式 3 和方式 2 相同。方式 3 波特率=(2SMOD/32)定时器 T1 的溢出率多机通讯要保证主机与所选择的从机实现可靠地通讯,必须保证串口具有识别功能。SCON 中的 SM2 位就是满足这一条件而设置的多机通讯控制位。原理:在串行口以方式 2(或方式 3)接收时,若 SM2=1,表示置多机通讯功能位,这时有两种可能:(1)接收到的第 9 位数据为 1 时,数据才装入 SBUF,并置中断标志 RI=1 向 CPU 发出中断请求;(2)接收到的第 9 位数据为 0 时,

12、则不产生中断标志,信息将抛弃。若 SM2=0,则接收的第 9 位数据不论是 0 还是 1,都产生 RI=1 中断标志,接收到的数据装入SBUF 中。应用上述特性,便可实现 MCS-51 的多机通讯。设多机系统中有一主机和 3 个 8031 从机,如下图。主机的 RXD 与从机的 TXD 相连,主机 TXD 与从机的 RXD 端相连。从机地址分别为 00H、01H、02H。多机通讯工作过程:(1)从机串行口编程为方式 2 或方式 3 接收,且置“1”SM2 和 REN 位,使从机只处于多机通讯且接收地址帧的状态。(2)主机先将从机地址(即准备接收数据的从机)发给各从机,主机发出的地址信息的第 9

13、位为 1,各从机接收到的第 9 位信息 RB8 为 1,且由于 SM2=1,则置“1”RI,各从机响应中断,执行中断程序。在中断服务子程序中,判主机送来的地址是否和本机地址相符合,相符则该从机清“0”SM2 位,准备接收主机的数据或命令;若不符,则保持 SM2=1 状态。(3)接着主机发送数据帧,此时各从机串行口接收到 的 RB8=0,只有地址相符合的从机系统(即已清“0”SM2 位的从机)才能激活 RI,从而进入中断,在中断程序中接收主机的数据(或命令);其它的从机因 SM21,又 RB8=0 不激活中断标志 RI,不能进入中断,接收的数据丢失。前图所示的多机系统是主从式,由主机控制多机之间

14、 的通讯,从机和从机的通讯只能经主机才能实现。7.4 波特率的制定方法方式 0、方式 2 的波特率是固定的;方式 1、方式 3 波特 率由定时器 T1 的溢出率来确定。7.4.1 波特率的定义波特率的定义。对于定时器的不同工作方式,波特率的范围不一7.4.2 定时器 T1 产生波特率的计算(1)方式 0 波特率时钟频率 fosc1/12,不受 SMOD 位的值的影响。若 fosc=12MHz,波特率为 fosc/12 即 1Mb/s。(2)方式 2 波特率=(2SMOD/64)fosc 若 fosc=12MHz:SMOD=0 波特率=187.5kb/s;SMOD=1 波特率=375kb/s (

15、3)方式 1 或方式 3 时,波特率为:波特率=(2SMOD/64)T1 的溢出率实际设定波特率时,T1 常设置为方式 2 定时(自动装初值)这种方式不仅操作方便,也可避免因软件重装初值而带来的定时误差。实际使用时,为避免烦杂的初值计算,常用的波特率和初值 X 间的关系列成表 7-2(P148),以供查用。表 7-2 有两点需要注意:(1)时钟振荡频率为 12MHz 或 6MHz 时,表中初值 X 和相应的波特率之间有一定误差。例如,FDH 的对应的理论值是 10416 波特(时钟 6MHz)。与 9600 波特相差816 波特,消除误差可以调整时钟振荡频率 fosc 实现。例如采用的时钟振荡

16、频率为11.0592MHz。(2)如果串行通讯选用很低的波特率,例如,波特率选为 55,可将定时器 T1 设置为方式 1 定时。但在这种情况下,T1 溢出时,需用在中断服务程序中重新装入初值。中断响应时间和执行指令时间会使波特率产生一定的误差,可用改变初值的方法加以调整。例 7-3 若 8031 单片机的时钟振荡频率为 11.0592MHz,选用 T1 为方式 2 定时作为波特率发生器,波特率为 2400b/s,求初值。上述结果可直接从表 7-2 中查到。这里时钟振荡频率选为 11.0592 MHz,就可使初值为整数,从而产生精确的波特率。方式 1 无中断式#include void Send

17、(void);void rec(void);int statu=0;char dat;void main(void)TMOD=0 x20;TH1=0 xfd;TH0=0 xfd;TR1=1;PCON=0 x00;SCON=0 x50;TI=1;while(1)rec();Send();void Send()int i=0;if(TI&statu)TI=0;SBUF=dat;while(!TI);statu=0;void rec()if(RI)dat=SBUF;RI=0;statu=1;方式 1 中断式#include char str10;int len=0;void main(void)in

18、t i=0;TMOD=0 x20;TH1=0 xfd;TH0=0 xfd;TR1=1;PCON=0 x00;SCON=0 x50;EA=1;ES=1;while(1)if(len=10)int i;ES=0;SBUF=n;while(!TI);TI=0;for(i=0;i10;i+)SBUF=stri;while(!TI);TI=0;SBUF=n;while(!TI);TI=0;ES=1;len=0;rec()interrupt 4if(RI)strlen=SBUF;RI=0;ES=0;SBUF=strlen;while(!TI);TI=0;ES=1;len+;/使用 printf,scanf

19、#include#include void main(void)int x,y,z;unsigned int a8=0 x01,0 x02,0 x04,0 x08,0 x10,0 x20,0 x40,0 x80;unsigned int i,j;P0=1;SCON=0 x50;TMOD=0 x20;/定时器设置主要是波特率/TCON=0 x40;TH1=0 xe8;TL1=0 xe8;TI=1;TR1=1;while(1)for(j=0;j8;j+)for(i=0;i20000;i+);P0=aj;printf(Good morning!n);for(j=0;j8;j+)for(i=0;i20

20、000;i+);P0=0 xff-aj;printf(input x and yn);scanf(%d%d,&x,&y);z=x+y;printf(x+y=%dnn,z);/网上程序例子#include#include unsigned char ch;bit read_flag=0;void init_serialcom(void)/串口通信初始设定 SCON=0 x50;/UART 为模式 1,8 位数据,允许接收 TMOD|=0 x20;/定时器 1 为模式 2,8 位自动重装 PCON|=0 x80;/SMOD=1;TH1=0 xFD;/Baud:19200 fosc=11.0592M

21、Hz IE|=0 x90;/Enable Serial Interrupt TR1=1;/timer 1 run TI=1;/向串口发送一个字符 void send_char_com(unsigned char ch)SBUF=ch;while(TI=0);TI=0;/串口接收中断函数 void serial()interrupt 4 using 3 if(RI)RI=0;ch=SBUF;read_flag=1;/就置位取数标志 main()init_serialcom();/初始化串口 while(1)if(read_flag)/如果取数标志已置位,就将读到的数从串口发出 read_flag=0;/取数标志清 0 send_char_com(ch);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com