单片机串行接口_第1页
单片机串行接口_第2页
单片机串行接口_第3页
单片机串行接口_第4页
单片机串行接口_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机串行接口1第1页,共82页,2023年,2月20日,星期一MCU中常用的几种串行接口标准串行接口:数据一位接一位顺序传送,可只用一根数据线传送多位信息。UART:通用异步接收器/发送器I2C:二线,芯片有地址,有总线争用机制2第2页,共82页,2023年,2月20日,星期一典型的I2C总线系统3第3页,共82页,2023年,2月20日,星期一用口线模拟串行总线4第4页,共82页,2023年,2月20日,星期一#include<reg51.h> //要用到sfr#defineucharunsignedcharsbitNCS=P1^0;sbitSCK=P1^1;sbitSI=P1^2;voidshiftbyte(ucharbyte);main(){uchardata*p=0x30;NCS=0;shiftbyte(0xa); //由图中读出第一字节为0xa0shiftbyte(0x23); //低8位地址shiftbyte(*p);NCS=1;while(1);}5第5页,共82页,2023年,2月20日,星期一voidshiftbyte(ucharbyte)//将1字节数据由并变串由口线移出{uchari;for(i=0;i<8;i++){NCK=0;SI=(bit)(byte&0x80);//强制将char转换成bit类型并赋值给口线NCK=1;byte<<=1; //左移1位}}6第6页,共82页,2023年,2月20日,星期一UART原理收发双方约定通信帧格式、波特率等,根据波特率各自维持位定时,而帧的开始靠一位起始位确定。如波特率1000,每1ms移一位,收发速率不要求严格相等,只要在一帧的范围内没有错开半位即可正确收发。7第7页,共82页,2023年,2月20日,星期一8第8页,共82页,2023年,2月20日,星期一全双工和半双工9第9页,共82页,2023年,2月20日,星期一回忆8051结构特点:由单一内部总线连接各功能模块,通过特殊功能寄存器(SFR)集中控制。嵌入式结构,不同型号引脚定义和SFR定义有所不同,因此,从两个方面来认识和掌握某一个功能模块。 相关引脚功能 相关SFR功能10第10页,共82页,2023年,2月20日,星期一第11页,共82页,2023年,2月20日,星期一串行口相关引脚12第12页,共82页,2023年,2月20日,星期一串行口相关SFRSCON:串口控制寄存器SBUF:数据缓冲器PCON:电源控制,最高位为波特率倍增器13第13页,共82页,2023年,2月20日,星期一串行接口内部结构示意图第14页,共82页,2023年,2月20日,星期一发送控制器、接收控制器、输出门、输入移位寄存器以及2个物理上互相独立的接收/发送缓冲器(可同时发送和接收数据)。

发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入。两个缓冲器可共用一个地址99H,不可按位寻址。 SBUF=0x55; //写发送缓冲器 rbyte=SBUF; //读接收缓冲器串行口的构成及SBUF15第15页,共82页,2023年,2月20日,星期一SM0SM1:串行口操作模式选择位。可以确定串行口的四种模式之一(如下表):串行口控制寄存器SCON,地址:98H,可以按位寻址16第16页,共82页,2023年,2月20日,星期一

RI:串行口完成一帧接收时置位(此时可以读取收到的1个字节),申请中断,CPU响应中断后应由软件清零;

TI:串行口完成一帧发送时置位(此时可以发下一个字节),申请中断,CPU响应中断后应由软件清零;

RB8:在9位数据传送的模式2、3时,是接收到的第9位数据;

TB8:在9位数据传送的模式2、3时,是将要发送的第9位数据;REN:允许接收位,REN=1时允许接收;

SM2:多机通信控制位。串行口控制寄存器SCON,地址:98H,可以按位寻址SM0SM1SM2RENTB8RB8TIRI17第17页,共82页,2023年,2月20日,星期一

SMOD:波特率倍增器,1:加倍,0:不加倍;

IDL:置1进入省电的待机状态(Idle);

PD:置1进入更省电的掉电状态(PowerDown);GF0,GF1:通用标志,一般配合进出低功耗状态使用。电源控制寄存器PCON,地址:87H,不可按位寻址18第18页,共82页,2023年,2月20日,星期一第一节概述

第三节模式1及其应用第四节模式2、3及其应用第二节模式0及其应用19第19页,共82页,2023年,2月20日,星期一串行口的模式0特点:串行口做同步移位寄存器用,在这种模式下:RXD(P3.0)作为数据线,低位在前;TXD(P3.1)作为移位脉冲输出端,每个机器周期移位一次,速率为Fosc/12。模式0的主要功能是:可以使用一个串行口来扩展出8位、16位等并行口,且理论上可以扩展n*8位的并行口。相当于串并、并串转换。20第20页,共82页,2023年,2月20日,星期一21第21页,共82页,2023年,2月20日,星期一模式0输出时序图22第22页,共82页,2023年,2月20日,星期一模式0输入时序图输入过程也是有8051主动发起的,并送出时钟。这一点与模式1、2、3的情况不同,它们的输入是被动的,由RXD引脚上的负跳变启动。23第23页,共82页,2023年,2月20日,星期一例1扩展1个16位并行输出口,并将16进制数1234H由扩展口输出。24第24页,共82页,2023年,2月20日,星期一#include<reg51.h> sbitSTB=P1^0;voidout16(unsignedintdat16){STB=0; /*4094进入串行移位状态*/SBUF=dat16&0xff;while(!TI);TI=0;/*先送低8位,等移完*/SBUF=dat16>>8;while(!TI);TI=0;/*再送高8位,等移完*/STB=1; /*同时并行输出*/}main(){SCON=0x0; /*串口模式0:移位寄存器方式*/out16(0x1234); /*由扩展口送出0x1234*/while(1); /*main循环结束*/}编程实现25第25页,共82页,2023年,2月20日,星期一例2扩展1个16位并行输入口,把由扩展口读入的16位数存入一个整型变量中。26第26页,共82页,2023年,2月20日,星期一#include<reg51.h> sbitP_S=P1^0;unsignedintin16(void);/*声明函数*/main(){unsignedintdat16;SCON=0x0;REN=1; /*串口模式0,允许接收*/dat16=in16(); /*由扩展口读入的数存入变量中*/while(1); /*main循环结束*/}编程实现27第27页,共82页,2023年,2月20日,星期一unsignedintin16(void){unsignedinttmp;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位数*/}编程实现(续)28第28页,共82页,2023年,2月20日,星期一第一节概述第二节模式0及其应用

第四节模式2、3及其应用第三节模式1及其应用29第29页,共82页,2023年,2月20日,星期一特点:10位传输格式(1个起始位+8个数据位+1个停止位);波特率:可变波特率,由定时器T1的溢出率来确定,所以在此种模式下,首先要对T1进行初始化以确定串行口的波特率。30第30页,共82页,2023年,2月20日,星期一模式1帧格式31第31页,共82页,2023年,2月20日,星期一模式1原理示意图(发送部分)第32页,共82页,2023年,2月20日,星期一由写SBUF启动,在8位数据后加上一个停止位。 开始发送,但DATA无效,送出一个起始位当零检测器全0,再作最后一次移位,并置TI发送过程33第33页,共82页,2023年,2月20日,星期一发送时序34第34页,共82页,2023年,2月20日,星期一再做最后一次移位同时TI置1,发送1帧完成。零检测器变化过程35第35页,共82页,2023年,2月20日,星期一模式1原理示意图(接收部分)第36页,共82页,2023年,2月20日,星期一在REN=1的条件下进行。串行口的接收控制器对RXD线进行采样,其采样频率是接收波特率的16倍。当检测到RXD上有负跳变后,复位16分频计数器,当计数器计到第7、8、9时,分别对RXD进行采样,若有2个以上的0,则认为检测到起始位并开始接收过程,此后每一位的判决都按照这种“3取2”的原则进行。装载接收移位寄存器的数据进入SBUF中就完成了一帧的接收过程,但必须满足两个条件,否则数据丢失:RI=0,表示前面接收的数据已经被取走。SM2=0或第9位为1。(对于模式1,第9位是停止位)接收过程37第37页,共82页,2023年,2月20日,星期一接收时序38第38页,共82页,2023年,2月20日,星期一移位寄存器变化过程再作最后一次移位,并装入SBUF,同时置位RI,接收1帧完成。39第39页,共82页,2023年,2月20日,星期一波特率(BaudRate)计算

(适用于模式1、3)在串行口的异步通讯中,发送方与接收方是两个互相独立的系统,它们的系统时钟可以各不相同。在这种条件下使通讯正确的条件是:1,要有相同的帧格式;2,要有相同或相近的波特率(<4%)。模式1、3的波特率是由定时器T1的溢出率来决定的(另外PCON中的SMOD位起着波特率加倍的作用)。在编制串行口通讯(模式1、3)程序时,须对T1进行初始化。40第40页,共82页,2023年,2月20日,星期一波特率(BaudRate)计算

(适用于模式1、3)T1初始化的主要任务就是:设置T1工作在模式2,定时。8位自重装定时器。根据晶振频率和需要的波特率,计算重装载值,分别送给TH1、TL1。波特率计算公式:BR=T1溢出率=(计数速率)/[256-(TH1)]=(Fosc/12)/[256-(TH1)]41第41页,共82页,2023年,2月20日,星期一BR=32*12*[256–(TH1)]2SMOD*Fosc因此得到更多情况下,已知Fosc和BR,要计算TH1的重装载值(TH1)=256-32*12*BR2SMOD*Fosc42第42页,共82页,2023年,2月20日,星期一【举例】设系统时钟为11.0592MHz,要求波特率为1200,求TH1的重装载值。【解】选SMOD=0,用上述公式(TH1)=256-32*12*120011059200=232=0E8H因此得到TH1的重装载值为0E8H。

43第43页,共82页,2023年,2月20日,星期一注意如果晶体频率是其它值,得到的装载值4舍5入,与标准波特率有一定误差,但一般只要误差不大仍能够正常通信。【举例】设系统时钟为12MHz,要求波特率为1200,求TH1的重装载值。【解】选SMOD=0,用上述公式(TH1)=256-32*12*120012000000=229.95=230=0E6H因此得到TH1的重装载值为0E6H,实际波特率为:计算波特率的例子BR=32*12*[256–230]12000000=1201.944第44页,共82页,2023年,2月20日,星期一常用波特率与晶体和T1设置对照表45第45页,共82页,2023年,2月20日,星期一例1发送字符串“HelloWorld!\n”至串口,要求波特率为1200,采用串口模式1,最高位约定做奇校验位,已知Fosc=11.0592MHz。46第46页,共82页,2023年,2月20日,星期一分析:奇偶校验由于传输的是ASCII字符(0-7FH),只需要7位,对于模式1有8个数据位,将最高位做奇校验位,保证形成的8位中1的个数始终是奇数个;接收方收到每一个字节后进行奇偶判断,若为奇则认为无误,若为偶则表示出错,这种方法可以检测出奇数个误码。例如,若要发送0x00,加奇校验位后变成0x80;若要发送0x01,加奇校验位后仍为0x01。接收方判断无错后去掉最高位,还原需要的数据。47第47页,共82页,2023年,2月20日,星期一回忆PSW:程序状态字,存放指令执行后的有关状态P:(PSW.0)奇偶标志位,用来标志累加器ACC中1的个数,可以用在串行通信中作奇偶校验判断。当P=1时,表明A中1的个数为奇数个,反之为偶数个。

ACC=0x0; /*P=0*/ ACC=0x80; /*P=1*/48第48页,共82页,2023年,2月20日,星期一分析:波特率要求波特率为1200,采用串口模式1,已知Fosc=11.0592MHz。由上述条件计算或查表得到T1的重装载值为0E8H49第49页,共82页,2023年,2月20日,星期一#include<reg51.h> sbitparity=ACC^7; /*定义ACC.7作奇校验位*/unsignedchartx_string[14]=“HelloWorld!\n”;/*定义待发送字符串,也可以加code存储类型,如:unsignedcharcodetx_string[14]=“HelloWorld!\n”*/编程实现50第50页,共82页,2023年,2月20日,星期一main(){unsignedchari; /*定义1个循环变量*//*首先定义T1模式2作波特率发生器,波特率为1200并启动运行*/TMOD=0x20;TH1=0xE8;TL1=0xE8;TR1=1;SCON=0x40; /*串口模式1,未允许接收*/for(i=0;i<14;i++) /*循环发送14个字符*/{ACC=tx_string[i]; /*取一个字符*/parity=P; /*获取当前的奇偶特性*/parity=!parity; /*一律改成奇校验,此时P=1*/SBUF=ACC; /*开始发送*/while(!TI);TI=0; /*等这1个字节发完才能发下1字节*/}//endofforwhile(1); /*循环结束*/}//endofmain

编程实现(续)51第51页,共82页,2023年,2月20日,星期一例2串口不断接收发来的字符串,已知字符串长度为14字节,若14字节均无错则使接在P1.0引脚上的绿色LED闪烁3次后点亮,若有错则使接在P1.1引脚上的红色LED闪烁3次后点亮,要求波特率为1200,采用串口模式1,最高位约定做奇校验位,已知Fosc=11.0592MHz。52第52页,共82页,2023年,2月20日,星期一用2个LED表示状态53第53页,共82页,2023年,2月20日,星期一#include<reg51.h> sbitRED_LED=P1^1; /*红灯*/sbitGREEN_LED=P1^0; /*绿灯*/unsignedcharrx_string[14];/*接收缓冲区*/bitreceive_string(void); /*声明接收14字节字符串函数*/flash_RED_LED_3(); /*声明红灯闪烁3次函数*/flash_GREEN_LED_3(); /*声明绿灯闪烁3次函数*/编程实现54第54页,共82页,2023年,2月20日,星期一main(){/*首先定义T1模式2作波特率发生器,波特率为1200并启动运行*/TMOD=0x21;TH1=0xE8;TL1=0xE8;TR1=1;SCON=0x50; /*串口模式1,允许接收*/for(;;){if(receive_string()) //函数返回bit{GREEN_LED=1; //有错绿灯灭flash_RED_LED_3(); //红灯闪烁3次RED_LED=0;} //以后一直亮else{RED_LED=1;flash_GREEN_LED_3();GREEN_LED=0;}}//endoffor(;;)}//endofmain编程实现55第55页,共82页,2023年,2月20日,星期一bitreceive_string(void){biterror_bit=0; //1:有错,0:没错unsignedchari;for(i=0;i<14;i++) {while(RI==0);RI=0; //查询接收,等收到1字节ACC=SBUF; //读入ACC便于判断Pif(!P)error_bit=1; //偶校验错,置标志后继续else{ACC&=0x7F; //未出错则去掉校验位 rx_string[i]=ACC;}//存入缓冲区} returnerror_bit; //返回出错标志}编程实现(续1)56第56页,共82页,2023年,2月20日,星期一flash_RED_LED_3() /*红灯闪烁3次函数*/{unsignedchari,j; /*定义循环变量*/

TMOD=0x21;TR0=1; /*T0模式1,运行*/for(i=0;i<6;i++) /*闪烁3次*/{for(j=0;j<5;j++) /*5*50ms=0.25s*/{TH0=0x3C;TL0=0xB0;while(!TF0);TF0=0;}RED_LED=!RED_LED; /*每隔0.25秒亮暗交替变化*/}TR0=0; /*关掉定时器*/}

编程实现(续2)57第57页,共82页,2023年,2月20日,星期一flash_GREEN_LED_3() /*绿灯闪烁3次函数*/{unsignedchari,j; /*定义循环变量*/

TMOD=0x21;TR0=1; /*T0模式1,运行*/for(i=0;i<6;i++) /*闪烁3次*/{for(j=0;j<5;j++) /*5*50ms=0.25s*/{TH0=0x3C;TL0=0xB0;while(!TF0);TF0=0;}GREEN_LED=!GREEN_LED;/*每隔0.25秒亮暗交替变化*/}TR0=0; /*关掉定时器*/}

编程实现(续3)58第58页,共82页,2023年,2月20日,星期一例3设串口每次收到上位机传来的命令55H,便将内部RAM中30H至3FH的数据发送出去,若不是55H便不做任何响应。要求波特率为19200,不用校验,已知Fosc=11.0592MHz。59第59页,共82页,2023年,2月20日,星期一分析这是典型的受上位机控制的通信过程。下位机平时可以一直查询等上位机命令;也可以用中断方式响应,提高效率,采取“中断进入,查询收发”的策略,没有通信命令的时候不予理会,有通信需要的时候集中处理,而不是每个字节都采用中断方式。60第60页,共82页,2023年,2月20日,星期一#include<reg51.h> main(){unsignedchardata*p,i;TMOD=0x20;TH1=0xFD;TL1=0xFD;PCON=0x80;TR1=1;//T1模式2作波特率发生器,SMOD=1,波特率为19200并启动运行SCON=0x50; /*串口模式1,允许接收*/for(;;){while(!RI);RI=0;

if(SBUF!=0x55)continue;p=0x30;for(i=0;i<16;i++) //查询发送30H开始的16字节

{SBUF=*p++;while(!TI);TI=0;}}}编程实现(查询方式)61第61页,共82页,2023年,2月20日,星期一#include<reg51.h> main(){unsignedchardata*p,i;TMOD=0x20;TH1=0xFD;TL1=0xFD;PCON=0x80;TR1=1;//T1模式2作波特率发生器,SMOD=1,波特率为19200并启动运行SCON=0x50; /*串口模式1,允许接收*/ES=1;EA=1; /*允许串口中断*/for(;;); /*循环结束,等中断*/}编程实现(中断进入、查询收发)62第62页,共82页,2023年,2月20日,星期一voidserial(void)interrupt4{unsignedchardata*p,i;if(TI){TI=0;return;} //一般要判断是TI或RI为1,此时多余RI=0;if(SBUF!=0x55)return;//不是55H返回p=0x30;for(i=0;i<16;i++) //查询发送30H开始的16字节{SBUF=*p++;while(!TI);TI=0;}}}编程实现(中断进入、查询收发)续63第63页,共82页,2023年,2月20日,星期一第一节概述第二节模式0及其应用第三节模式1及其应用

第四节模式2、3及其应用64第64页,共82页,2023年,2月20日,星期一特点:模式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不需要用定时器作为波特率发生器,节省一个定时器;但是波特率固定,且比较高,如果满足通信需求就可以选择这种模式。当Fosc=12MHz时,波特率分别是375000和187500。第9数据位(TB8/RB8)可以作为奇偶校验位,也可以用于多机通信控制,若不用校验,更多时候用模式1。模式2、3特点65第65页,共82页,2023年,2月20日,星期一模式2、3帧格式66第66页,共82页,2023年,2月20日,星期一发送时:将SCON中的TB8作为第9位数据发送,TB8可编程为0或1;发送SBUF+TB8构成9位数据,接收时:将接收来的第9位送到SCON中的RB8中:接收SBUF+TB8构成9位数据。TB8和RB867第67页,共82页,2023年,2月20日,星期一模式2、3的发送过程与模式1类似,主要的区别在于帧中数据是9位。这样,在发送一帧时,CPU除了要把8位数据送SBUF外,还要把第9位数据送到TB8中,但注意要先设定好TB8,然后再向SBUF送数,因为一写SBUF就开始发送。停止位单独生成,加在TB8之后。模式2、3的接收过程与模式1完全相同,只不过模式1时,SCON中的RB8是接收到的停止位(“1”);而模式2、3时,RB8是接收到的第9位(发送方的TB8)。发送和接收过程68第68页,共82页,2023年,2月20日,星期一例4设串口每隔1秒钟便将片内RAM中50H至5FH中的数据串行发送,串行口设定为模式2,TB8作偶校验位,已知Fosc=12MHz。69第69页,共82页,2023年,2月20日,星期一分析将要发送的8位数据送入ACC;由奇偶标志P即可判断这8位中1的个数:P=1奇;P=0偶。如果让TB8=P,则9位数据中1的个数总是偶数个,这样就实现了偶校验。TB8作偶校验位:

TB8作偶校验位:串行口设定为模式2,无需用T1作波特率发生器;70第70页,共82页,2023年,2月20日,星期一分析1s=50ms*20T0模式1,重装载值TC=65536–50ms/1us=15536=3CB0H71第71页,共82页,2023年,2月20日,星期一#include<reg51.h> voidsend16(void){unsignedchardata*p,i; /*定义指针及循环变量*/p=0x50; /*指向内部RAM50H单元*/for(i=0;i<16;i++) /*循环发送16个字节*/{ACC=*p++; /*取一个字节*/TB8=P; /*加偶校验*/SBUF=ACC; /*开始发送*/while(!TI);TI=0; /*等这1个字节发完才能发下1字节*/}}编程实现72第72页,共82页,2023年,2月20日,星期一main(){SCON=0x80; /*串口模式2,未允许接收*/PCON=0x80; /*波特率为Fosc/32*/TMOD=1;TR1=1; /*T0模式1定时*/while(1){for(i=0;i<20;i++) {TH0=0x3C;TL0=0xB0;while(!TF0);TF0=0;}/*等1秒钟*/send16(); /*调用发送16字节函数*/} }//endofmain

编程实现(续)73第73页,共82页,2023年,2月20日,星期一例5接收上例中的数据,存入一个接收缓冲区,并进行出错判断。74第74页,共82页,2023年,2月20日,星期一#include<reg51.h> unsignedcharrx_string[16];/*接收缓冲区*/bitreceive_string(void); /*声明接收16字节字节函数*/编程实现75第75页,共82页,2023年,2月20日,星期一#include<reg51.h> unsignedcharrx_string[16];/*接收缓冲区*/bitreceive_string(void); /*声明接收16字节字节函数*/main(){SCON=0x90; /*串口模式2,允许接收*/PCON=0x80; /*BR=Fosc/32*/for(;;){if(receive16())error(); //返回1,错,函数省略else right(); //返回0,对,函数省略}

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论