




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,第9章 串行通信口,第一节 概述 第二节 模式0及其应用 第三节 模式1及其应用 第四节 模式2、3及其应用,2,MCU中常用的几种串行接口标准,串行接口:数据一位接一位顺序传送,可只用一根数据线传送多位信息。 UART:通用异步接收器/发送器 I2C:二线,芯片有地址,有总线争用机制,3,典型的I2C总线系统,4,用口线模拟串行总线,5,#include /要用到sfr #define uchar unsigned char sbit NCS=P10; sbit SCK=P11; sbit SI =P12; void shiftbyte(uchar byte); main() uchar
2、 data *p=0 x30; NCS=0; shiftbyte(0 xa);/由图中读出第一字节为0 xa0 shiftbyte(0 x23);/低8位地址 shiftbyte(*p); NCS=1; while(1); ,6,void shiftbyte(uchar byte)/将1字节数据由并变串由口线移出 uchar i; for(i=0; i8; i+) NCK=0; SI=(bit)(byte /左移1位 ,7,UART原理,收发双方约定通信帧格式、波特率等,根据波特率各自维持位定时,而帧的开始靠一位起始位确定。如波特率1000,每1ms移一位,收发速率不要求严格相等,只要在一帧的
3、范围内没有错开半位即可正确收发。,8,9,全双工和半双工,10,回忆8051结构特点:由单一内部总线连接各功能模块,通过特殊功能寄存器(SFR)集中控制。嵌入式结构,不同型号引脚定义和SFR定义有所不同,因此,从两个方面来认识和掌握某一个功能模块。 相关引脚功能 相关SFR功能,12,串行口相关引脚,13,串行口相关SFR,SCON: 串口控制寄存器 SBUF:数据缓冲器 PCON: 电源控制,最高位为波特率倍增器,串行接口内部结构示意图,15,发送控制器、接收控制器、输出门、输入移位寄存器以及2个物理上互相独立的接收/发送缓冲器(可同时发送和接收数据)。 发送缓冲器只能写入不能读出,接收缓冲
4、器只能读出不能写入。两个缓冲器可共用一个地址99H,不可按位寻址。 SBUF = 0 x55; /写发送缓冲器 rbyte = SBUF;/读接收缓冲器,串行口的构成及SBUF,16,SM0 SM1: 串行口操作模式选择位。可以确定串行口的四种模式之一(如下表):,串行口控制寄存器SCON,地址:98H,可以按位寻址,17,RI : 串行口完成一帧接收时置位(此时可以读取收到的1个字节),申请中断,CPU响应中断后应由软件清零; TI :串行口完成一帧发送时置位(此时可以发下一个字节),申请中断,CPU响应中断后应由软件清零; RB8: 在9位数据传送的模式2、3时,是接收到的第9位数据; T
5、B8: 在9位数据传送的模式2、3时,是将要发送的第9位数据; REN: 允许接收位,REN=1时允许接收; SM2:多机通信控制位。,串行口控制寄存器SCON,地址:98H,可以按位寻址,18,SMOD : 波特率倍增器,1: 加倍, 0:不加倍 ; IDL : 置1进入省电的待机状态(Idle); PD: 置1进入更省电的掉电状态(Power Down); GF0, GF1 : 通用标志,一般配合进出低功耗状态使用。,电源控制寄存器PCON,地址:87H,不可按位寻址,19,第一节 概述 第三节 模式1及其应用 第四节 模式2、3及其应用,第二节 模式0及其应用,20,串行口的模式0,特点
6、:串行口做同步移位寄存器用,在这种模式下: RXD(P3.0)作为数据线,低位在前; TXD(P3.1)作为移位脉冲输出端,每个机器周期移位一次,速率为Fosc/12。 模式0的主要功能是:可以使用一个串行口来扩展出8位、16位等并行口,且理论上可以扩展n*8位的并行口。相当于串并、并串转换。,21,22,模式0输出时序图,23,模式0输入时序图,输入过程也是有8051主动发起的,并送出时钟。这一点与模式1、2、3的情况不同,它们的输入是被动的,由RXD引脚上的负跳变启动。,24,例1 扩展1个16位并行输出口,并将16进制数1234H由扩展口输出。,25,#include sbit STB=
7、P10; void out16 (unsigned int dat16) STB=0; /* 4094进入串行移位状态 */ SBUF=dat16 /* main循环结束 */ ,编程实现,26,例2 扩展1个16位并行输入口,把由扩展口读入的16位数存入一个整型变量中。,27,#include sbit P_S=P10; unsigned int in16 (void) ; /*声明函数 */ main() unsigned int dat16; SCON=0 x0; REN=1; /* 串口模式, 允许接收 */ dat16=in16();/* 由扩展口读入的数存入变量中*/ while(
8、1); /* main循环结束 */ ,编程实现,28,unsigned int in16 (void) unsigned int tmp; P_S=1; P_S=0;/* 4014并行输入后立即进入串行移位状态 */ while( !RI ); RI=0; /*查询等高8位移完*/ tmp=SBUF; tmp=8; /* 读入后送到临时变量的高8位*/ while( !RI ); RI=0; /*查询等低8位移完*/ tmp+=SBUF; /*合成16位数*/ return (tmp); /* 返回得到的16位数 */ ,编程实现(续),29,第一节 概述 第二节 模式0及其应用 第四节 模
9、式2、3及其应用,第三节 模式1及其应用,30,特点: 10位传输格式 (1个起始位+8个数据位+1个停止位); 波特率: 可变波特率,由定时器T1的溢出率来确定,所以在此种模式下,首先要对T1进行初始化以确定串行口的波特率。,31,模式1帧格式,模式1原理示意图(发送部分),33,由写SBUF启动,在8位数据后加上一个停止位。 开始发送,但DATA无效,送出一个起始位 当零检测器全0,再作最后一次移位,并置TI,发送过程,34,发送时序,35,再做最后一次移位同时TI置1,发送1帧完成。,零检测器变化过程,模式1原理示意图(接收部分),37,在REN=1的条件下进行。串行口的接收控制器对RX
10、D线进行采样,其采样频率是接收波特率的16倍。当检测到RXD上有负跳变后,复位16分频计数器,当计数器计到第7 、 8 、9时,分别对RXD进行采样,若有2个以上的0,则认为检测到起始位并开始接收过程,此后每一位的判决都按照这种 “3取2” 的原则进行。 装载接收移位寄存器的数据进入SBUF中就完成了一帧的接收过程,但必须满足两个条件,否则数据丢失: RI=0,表示前面接收的数据已经被取走。 SM2=0或第9位为1。(对于模式1,第9位是停止位),接收过程,38,接收时序,39,移位寄存器变化过程,再作最后一次移位,并装入SBUF, 同时置位RI,接收1帧完成。,40,波特率(Baud Rat
11、e)计算(适用于模式1、3),在串行口的异步通讯中,发送方与接收方是两个互相独立的系统,它们的系统时钟可以各不相同。 在这种条件下使通讯正确的条件是:1,要有相同的帧格式;2,要有相同或相近的波特率(4%)。 模式1、3的波特率是由定时器T1的溢出率来决定的(另外PCON中的SMOD位起着波特率加倍的作用)。在编制串行口通讯(模式1、3)程序时,须对T1进行初始化。,41,波特率(Baud Rate)计算(适用于模式1、3),T1初始化的主要任务就是: 设置T1 工作在模式2,定时。8位自重装定时器。 根据晶振频率和需要的波特率,计算重装载值,分别送给TH1、TL1。 波特率计算公式:BR =
12、 T1溢出率 =(计数速率)/ 256 -(TH1) = (Fosc/12) / 256 -(TH1),42,因此得到,更多情况下,已知Fosc和BR,要计算TH1的重装载值,43,【举例】设系统时钟为11.0592MHz,要求波特率为1200,求TH1的重装载值。 【解】选SMOD=0,用上述公式,(TH1) = 256 -,32 * 12 *1200,11059200,=232=0E8H,因此得到TH1的重装载值为0E8H。,44,注意如果晶体频率是其它值,得到的装载值4舍5入,与标准波特率有一定误差,但一般只要误差不大仍能够正常通信。 【举例】设系统时钟为12MHz,要求波特率为1200
13、,求TH1的重装载值。 【解】选SMOD=0,用上述公式,(TH1) = 256 -,32 * 12 *1200,12000000,=229.95=230=0E6H,因此得到TH1的重装载值为0E6H,实际波特率为:,计算波特率的例子,=1201.9,45,常用波特率与晶体和T1设置对照表,46,例1,发送字符串 “Hello World!n” 至串口,要求波特率为1200,采用串口模式1,最高位约定做奇校验位,已知Fosc=11.0592MHz。,47,分析:奇偶校验,由于传输的是ASCII字符(0-7FH),只需要7位,对于模式1有8个数据位,将最高位做奇校验位,保证形成的8位中1的个数始
14、终是奇数个;接收方收到每一个字节后进行奇偶判断,若为奇则认为无误,若为偶则表示出错,这种方法可以检测出奇数个误码。 例如,若要发送0 x00,加奇校验位后变成0 x80;若要发送0 x01,加奇校验位后仍为0 x01。接收方判断无错后去掉最高位,还原需要的数据。,48,回忆PSW:程序状态字,存放指令执行后的有关状态,P: (PSW.0)奇偶标志位,用来标志累加器ACC中1的个数,可以用在串行通信中作奇偶校验判断。当P=1时,表明A中1的个数为奇数个,反之为偶数个。 ACC=0 x0;/* P=0 */ ACC=0 x80;/* P=1 */,49,分析:波特率,要求波特率为1200,采用串口
15、模式1,已知Fosc=11.0592MHz。 由上述条件计算或查表得到T1的重装载值为0E8H,50,#include sbit parity=ACC7;/* 定义ACC.7 作奇校验位 */ unsigned char tx_string14=“Hello World!n” ; /*定义待发送字符串,也可以加 code存储类型,如: unsigned char code tx_string14=“Hello World!n” */,编程实现,51,main() unsigned char i;/* 定义1个循环变量 */ /* 首先定义T1模式2 作波特率发生器,波特率为1200并启动运行
16、*/ TMOD=0 x20; TH1=0 xE8; TL1=0 xE8; TR1=1; SCON=0 x40; /* 串口模式1, 未允许接收 */ for (i =0; i14; i+) /* 循环发送14个字符 */ ACC=tx_stringi ;/* 取一个字符 */ parity=P;/* 获取当前的奇偶特性 */ parity=!parity;/* 一律改成奇校验, 此时P=1 */ SBUF=ACC; /* 开始发送 */ while ( !TI ); TI=0; /* 等这1个字节发完才能发下1字节 */ /end of for while(1);/* 循环结束 */ /end
17、 of main,编程实现(续),52,例2,串口不断接收发来的字符串,已知字符串长度为14字节,若14字节均无错则使接在P1.0引脚上的绿色LED闪烁3次后点亮,若有错则使接在P1.1引脚上的红色LED闪烁3次后点亮,要求波特率为1200,采用串口模式1,最高位约定做奇校验位,已知Fosc=11.0592MHz。,53,用2个LED表示状态,54,#include sbit RED_LED=P11;/* 红灯 */ sbit GREEN_LED=P10;/* 绿灯 */ unsigned char rx_string14; /* 接收缓冲区 */ bit receive_string(voi
18、d); /* 声明接收14字节字符串函数 */ flash_RED_LED_3();/* 声明红灯闪烁3次函数 */ flash_GREEN_LED_3();/* 声明绿灯闪烁3次函数 */,编程实现,55,main() /* 首先定义T1模式2 作波特率发生器,波特率为1200并启动运行 */ TMOD=0 x21; TH1=0 xE8; TL1=0 xE8; TR1=1; SCON=0 x50; /* 串口模式1, 允许接收 */ for(;) if(receive_string() /函数返回bit GREEN_LED=1; /有错绿灯灭 flash_RED_LED_3(); /红灯闪烁
19、3次 RED_LED=0; /以后一直亮 else RED_LED=1; flash_GREEN_LED_3(); GREEN_LED=0; / end of for(;) /end of main,编程实现,56,bit receive_string(void) bit error_bit=0;/ 1: 有错, 0: 没错 unsigned char i; for (i=0; i14; i+) while(RI=0); RI=0;/查询接收, 等收到1字节 ACC = SBUF;/读入ACC便于判断P if (!P) error_bit=1;/偶校验错,置标志后继续 else ACC/返回出
20、错标志 ,编程实现(续1),57,flash_RED_LED_3()/* 红灯闪烁3次函数 */ unsigned char i, j ;/* 定义循环变量 */ TMOD=0 x21; TR0=1; /* T0模式1, 运行 */ for (i=0; i6; i+)/* 闪烁3次 */ for(j=0; j5; j+)/* 5* 50ms =0.25s */ TH0=0 x3C; TL0=0 xB0; while (!TF0); TF0=0; RED_LED=! RED_LED; /* 每隔0.25秒亮暗交替变化*/ TR0=0;/* 关掉定时器 */ ,编程实现(续2),58,flash_
21、GREEN_LED_3()/* 绿灯闪烁3次函数 */ unsigned char i, j ;/* 定义循环变量 */ TMOD=0 x21; TR0=1; /* T0模式1, 运行 */ for (i=0; i6; i+)/* 闪烁3次 */ for(j=0; j5; j+)/* 5* 50ms =0.25s */ TH0=0 x3C; TL0=0 xB0; while (!TF0); TF0=0; GREEN_LED=! GREEN_LED; /* 每隔0.25秒亮暗交替变化 */ TR0=0;/* 关掉定时器 */ ,编程实现(续3),59,例3,设串口每次收到上位机传来的命令55H,
22、便将内部RAM中30H至3FH的数据发送出去,若不是55H便不做任何响应。要求波特率为19200,不用校验,已知Fosc= 11.0592MHz。,60,分析,这是典型的受上位机控制的通信过程。下位机平时可以一直查询等上位机命令;也可以用中断方式响应,提高效率,采取 “中断进入,查询收发” 的策略,没有通信命令的时候不予理会,有通信需要的时候集中处理,而不是每个字节都采用中断方式。,61,#include main() unsigned char data *p, i; TMOD=0 x20; TH1=0 xFD; TL1=0 xFD; PCON=0 x80; TR1=1; / T1模式2 作
23、波特率发生器,SMOD=1, 波特率为19200并启动运行 SCON=0 x50; /* 串口模式1, 允许接收 */ for (; ;) while( !RI ); RI=0; if (SBUF != 0 x55) continue; p=0 x30; for (i=0; i16; i+) /查询发送30H开始的16字节 SBUF=*p+; while(!TI); TI=0; ,编程实现(查询方式),62,#include main() unsigned char data *p, i; TMOD=0 x20; TH1=0 xFD; TL1=0 xFD; PCON=0 x80; TR1=1;
24、 / T1模式2 作波特率发生器,SMOD=1, 波特率为19200并启动运行 SCON=0 x50; /* 串口模式1, 允许接收 */ ES=1; EA=1; /* 允许串口中断 */ for (; ;);/* 循环结束,等中断 */ ,编程实现(中断进入、查询收发),63,void serial(void) interrupt 4 unsigned char data *p, i; if (TI)TI=0; return;/一般要判断是TI或RI为1,此时多余 RI=0; if (SBUF != 0 x55) return; /不是55H返回 p=0 x30; for (i=0; i16
25、; i+)/查询发送30H开始的16字节 SBUF=*p+; while(!TI); TI=0; ,编程实现(中断进入、查询收发)续,64,第一节 概述 第二节 模式0及其应用 第三节 模式1及其应用,第四节 模式2、3及其应用,65,特点: 模式2和3都是11位传输格式 (1个起始位+9个数据位+1个停止位),两种模式唯一不同之处是波特率; 模式2:固定为Fosc/64或Fosc/32(由PCON中的SMOD位来决定)。SMOD=1, Fosc/32; SMOD=0, Fosc/64. 模式3:与模式1一样由定时器T1的溢出率来确定。 使用模式2不需要用定时器作为波特率发生器,节省一个定时器
26、;但是波特率固定,且比较高,如果满足通信需求就可以选择这种模式。当Fosc=12MHz时,波特率分别是375000和187500。 第9数据位(TB8/RB8)可以作为奇偶校验位,也可以用于多机通信控制,若不用校验,更多时候用模式1。,模式2、3特点,66,模式2、3帧格式,67,发送时:将SCON中的TB8作为第9位数据发送, TB8可编程为0或1;发送SBUF+TB8构成9位数据, 接收时:将接收来的第9位送到SCON中的RB8中:接收SBUF+TB8构成9位数据。,TB8和RB8,68,模式2、3的发送过程与模式1类似,主要的区别在于帧中数据是9位。这样,在发送一帧时,CPU除了要把8位
27、数据送SBUF外,还要把第9位数据送到TB8中,但注意要先设定好TB8,然后再向SBUF送数,因为一写SBUF就开始发送。 停止位单独生成,加在TB8之后。 模式2、3的接收过程与模式1完全相同,只不过模式1时,SCON中的RB8是接收到的停止位(“1”);而模式2、3时,RB8是接收到的第9位(发送方的TB8)。,发送和接收过程,69,例4,设串口每隔1秒钟便将片内RAM中50H至5FH中的数据串行发送,串行口设定为模式2,TB8作偶校验位,已知Fosc=12MHz。,70,分析,将要发送的8位数据送入ACC; 由奇偶标志P即可判断这8位中1的个数: P=1 奇; P=0 偶。 如果让TB8
28、=P, 则9位数据中1的个数总是偶数个,这样就实现了偶校验。 TB8作偶校验位:,TB8作偶校验位:,串行口设定为模式2,无需用T1作波特率发生器;,71,分析,1s=50ms*20 T0模式1, 重装载值 TC=65536 50ms/1us=15536=3CB0H,72,#include void send16(void) unsigned char data *p, i;/* 定义指针及循环变量 */ p=0 x50;/* 指向内部RAM 50H单元 */ for (i =0; i16; i+) /* 循环发送16个字节 */ ACC=*p+ ;/* 取一个字节 */ TB8=P;/* 加
29、偶校验 */ SBUF=ACC; /* 开始发送 */ while ( !TI ); TI=0; /* 等这1个字节发完才能发下1字节 */ ,编程实现,73,main() SCON=0 x80; /* 串口模式2, 未允许接收 */ PCON=0 x80; /* 波特率为Fosc/32 */ TMOD=1; TR1=1;/* T0模式1定时 */ while (1) for (i=0; i20; i+) TH0=0 x3C; TL0=0 xB0; while( ! TF0); TF0=0; /* 等1秒钟 */ send16();/* 调用发送16字节函数 */ /end of main,编
30、程实现(续),74,例5,接收上例中的数据,存入一个接收缓冲区,并进行出错判断。,75,#include unsigned char rx_string16; /* 接收缓冲区 */ bit receive_string(void); /* 声明接收16字节字节函数 */,编程实现,76,#include unsigned char rx_string16; /* 接收缓冲区 */ bit receive_string(void); /* 声明接收16字节字节函数 */ main() SCON=0 x90; /* 串口模式2, 允许接收 */ PCON=0 x80;/* BR=Fosc/32 */ for(;) if(receive16() error();/返回1,错,函数省略 else right(); /返回0,对,函数省略 ,编程实现,77,bit receive16(void) bit error_bit=0;/ 1: 有错, 0: 没错 unsigned char i; for (i=0; i16; i+) while(RI=0); RI=0;/查询接
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 银行环境风险管理办法
- 2025年黑龙江省双城市兆麟中学高一物理第二学期期末考试试题含解析
- 黑龙江省佳木斯一中2025年物理高二第二学期期末调研模拟试题含解析
- 上海市复旦大学附中2025年高一物理第二学期期末考试试题含解析
- 2025届吉林省长春六中、八中、十一中等省重点中学物理高二第二学期期末预测试题含解析
- 南京网约车安全管理办法
- 库尔勒安居富民管理办法
- 煤矿采空区养殖管理办法
- 江西省建筑工地管理办法
- 2025年中国颚式阀行业市场发展前景及发展趋势与投资战略研究报告
- PCR室作业指导书-检验SOP文件
- 医院保洁服务投标方案(技术方案)
- 心力衰竭病人的护理图文
- 设立财税管理咨询公司实施方案
- 高血压的眼底病变
- 岩板干挂方案
- 先兆流产护理课件
- 《经营十二条详解》课件
- 机器设备维护保养记录表
- 深基坑工程培训课件
- 油漆工进场安全教育试题
评论
0/150
提交评论