单片机原理及其应用.pptx
1第1章概述第2章MCS-51单片机硬件结构第3章MCS-51寻址方式和指令系统第4章MCS-51汇编程序设计第5章中断系统第6章定时器/计数器及串行口第7章存储器扩展第8章接口电路扩展第9章应用举例第1页/共86页2第6章 定时器/计数器、及串行口6.1 定时/计数器结构特点及控制6.2 串行通信及其接口第2页/共86页36.2 串行通信及其接口串行通信及其接口概述的串行口串行口的编程第3页/共86页4概述 串行通信是将字符数据的每位一位一位地依次传送。适合于计算机之间、计算机与外部设备之间的远距离通信。串行通信从传输方式分为:单工方式、半双工方式、全双工方式。从接收方式来说,串行通信有两种方式:异步通信方式、同步通信方式。第4页/共86页5第5页/共86页6第6页/共86页7第7页/共86页8的串行口一、串行口的结构二、串行口的工作方式三、波特率的计算第8页/共86页9一、串行口的结构 下图是简化的串行口结构示意图。串行口有两个独立的发送、接收缓冲器SBUF。可同时发送与接收数据。发送缓冲器只写不能读,接受缓冲器只读不能写。要注意的是它们共用一个SFR地址(99H),也就有相同缓冲器名:SBUF 第9页/共86页101串行口控制寄存器SCONSCON的字节地址为98H,可位寻址。格式如图所示。D7D6D5D4D3D2D1D0SM0SM1SM2RENTB8RB8TIRI9F9E9D9C9B9A9998SCON位地址SM0,SM1:选择串行口4种工作方式。第10页/共86页11TITI:发送中断标志,发送一帧结束,TI=1,必须软件清零。RIRI:接收中断标志,接收一帧结束,RI=1,必须软件清零。RENREN:允许接收控制位,REN=1,允许接收;REN=0,禁止接收。TB8TB8:发送的第9位数据位,可用作校验位和地址/数据标识位。RB8RB8:接收的第9位数据位或停止位。SM2SM2:多机通信控制位(接收控制)。方式0:SM2=0。方式1:一般SM2=0;若SM2=1,接收到停止位后,才激活RI。方式2,3:SM2=1,只有接收到 RB8=1,数据才进入SBUF,并使RI=1。若RB8=0,数据丢弃。SM2=0,不管RB8是何值,数据都进SBUF,并使RI=1。D7D6D5D4D3D2D1D0SM0SM1SM2RENTB8RB8TIRI9F9E9D9C9B9A9998SCON位地址第11页/共86页122特殊功能寄存器PCON其字节地址为87H,没有位寻址功能。PCON的格式如图所示,其中与串行接口有关的只有D7位SMOD。PCON格式SMOD=1 使波特率加倍。PCONSMODD7D6D5D4D3D2D1D0第12页/共86页13二、串行口的工作方式第13页/共86页141方式0 方式0是同步移位寄存器输入方式,用来扩展并行口。不用于通信。8位数据为一帧,无起始位和停止位。1)方式0发送 CPU写入发送缓冲器SBUF一字节数据,产生一个正脉冲,串口开始从低位起,以fosc/12的固定波特率从RxD输出数据,同时在TxD上出现同步移位时钟。8位数据发完后,置位TI。第14页/共86页152)方式0接收 当CPU向SCON写入控制字(方式0,REN=1,RI=0),产生一个正脉冲,串口开始以fosc/12的固定波特率从RxD接受数据,同时TxD发出移位脉冲信号,作为外接芯片的移位时钟。8位数据收完后,置位RI。第15页/共86页162.方式1可变波特率8位异步收发方式启动发送过程MOVSBUF,A发送完时,TI=1方式1的一帧数据为10位。波特率可变:1)方式1发送 CPU写入发送缓冲器SBUF一字节数据,内部/SEND 变低,串口开始从数据低位起,以TX时钟波特率从TxD输出数据,即每经过一个TX时钟,TxD上输出一个数据位。8位数据发完后,置位TI,/SEND 信号失效。第16页/共86页17读转换结果IfRIMOVA,SBUF2)方式1接收 CPU向SCON写入控制字(方式1,REN=1,RI=0),串口开始从RxD检测负跳变。出现负跳变后,位检测采样器启动,以波特率16倍的速率采样RxD。在7,8,9三次脉冲处采样,并以三中取二确定起始位。起始位到了后,以同样的方法接收其它数据。一帧数据收到后先放在移位寄存器中,满足下列条件,数据才进SBUF,并置位RI。RI=0,说明接收SBUF空。SM2=0 或 SM2=1且收到的停止位1(第九位1)。第17页/共86页183方式2固定波特率9位异步收发方式 方式2是9位异步收发方式,每帧数据均为11位。在8位数据后加了可程控的第九位数据,可用于多机通信。波特率固定为:1)方式2发送 按通信协议设置TB8(奇偶校验或地址/数据标志),CPU写入发送缓冲器SBUF一字节数据,启动发送过程。串口自动把TB8装到第九位数据位,逐位发出,完毕,置位TI。第18页/共86页19【例6-11】(7-1)方式2发送在双机通信中的应用 通信检错采用偶校验,放在TB8中发送。用第二组工作寄存器区的R0作为发送数据指针。下面是发送中断服务程序:PIPTI:PUSH PSWPUSH ASETB RS1;选第二组寄存器CLR RS0CLR TI;清发送标志MOV A,R0;取数据MOV C,P;奇:P=1,偶:P=0MOV TB8,C;校验位送TB8MOV SBUF,A;数据进SBUF,启动发送INC R0;调整指针POP APOP PSWRETI第19页/共86页202)方式2接收当CPU向SCON写入控制字(方式2,REN=1,RI=0),串口开始从RxD检测负跳变。出现负跳变后,位检测采样器启动,以波特率16倍的速率采样RxD。在7,8,9三次脉冲处采样,并以三中取二确定起始位。起始位到了后,以同样的方法接收其它数据。一帧数据(11位)收到后先放在移位寄存器中,满足下列条件,8位数据才进SBUF,并置位RI。RI=0,说明接收SBUF空。SM2=0或SM2=1且收到的第九位数据RB81(地址)。第20页/共86页21【例6-12】(7-2)方式2接收在双机通信中的应用 通信检错采用偶校验,对RB8中的校验位作偶校验处理。选用第一组工作寄存器区的R0作为接收数据指针。下面是接收中断服务程序:第21页/共86页22PIRI:PUSH PSWPUSH ASETB RS0;选第一组寄存器CLR RS1CLR RI;清接收标志MOV A,SBUF;从接收缓冲区取数据MOV C,P;获得接收数据的奇偶性JNC L1;偶数个1,转查RB8JNB RB8,ERP;奇数个1,奇校验错处理AJMP L2;奇偶性正确L1:JB RB8,ERP ;偶校验错,转出错处理L2:MOV R0,A;存接收的数据INC R0POP APOP PSWRETI第22页/共86页234方式3固定波特率9位异步收发方式 方式3和方式2一样可发送或接收11位数据,一个起始位(0),8个数据位(低位在先),附加第9个数据位(可编程控制位)及一个停止位(1)。方式3和方式2通信波特率不同,方式2的波特率是固定的。方式3的波特率和方式1类似,可以有多种选择,由定时器T1或T2的溢出率经分频得到。为避免反复对T1装入初值,常选用方式2,此时T1计数器为8位,当需要较高波特率时,才选用其他工作方式。波特率=(2SOMD/32)*T1溢出率 第23页/共86页24三、波特率的计算方式1,3的波特率是可变的。设用T1作波特率发生器:波特率=(2SOMD/32)*T1溢出率波特率的定义:串口每秒钟发送(接收)的位数。方式0和方式2是固定波特率:方式0 波特率 fosc/12,fosc=12MHz,波特率为1Mb/s 方式2fosc=12MHz,SMOD=0,波特率为187.5kb/s,SMOD=1,波特率为375 kb/s。第24页/共86页25T1作波特率发生器,波特率计算公式为:其中,k为T1计数器的位数,取决于T1的工作方式,可以是13(方式0)、16(方式1)和8(方式2或3)。T1作波特率发生器,最常用的是方式2。第25页/共86页26第26页/共86页27波特率计算【例6-13】(7-3)用T1方式2作波特率发生器,波特率为4800b/s。晶振频率12MHz取SMOD=0 实际波特率 4460b/s,误差较大。晶振频率取11.0592MHz,可得精确的波特率(X=250)第27页/共86页28四、串行口简单应用 串行口初始化编程格式:SIO:MOV SCON,#控制状态字;写方式字且TI=RI=0 (MOV PCON,#80H);波特率加倍 (MOV TMOD,#20H);T1作波特率发生器 (MOV TH1,#X);选定波特率 (MOV TL1,#Y)(SETB TR1)(SETB EA)(SETB ES);开串行口中断第28页/共86页29发送程序:先发送一个字符,等待TI=1后再发送下一个字符。1.查询方式发送:TRAM:MOV A,R0 ;取数据 MOV SBUF,A ;发送一个字符WAIT:JBC TI,NEXT;等待发送结束 SJMP WAITNEXT:INC R0 ;准备下一次发送 SJMP TRAM第29页/共86页302.中断方式发送:ORG0023H;串行口中断入口 AJMP SINTMAIN:;初始化编程TRAM:MOV A,R0 ;取数据 MOV SBUF,A ;发送第一个字符H1:SJMP H1 ;其它工作SINT:CLR TI ;中断服务程序 INCR0 MOVA,R0 ;取数据 MOVSBUF,A ;发送下一个字符 RETI第30页/共86页31接收程序:REN=1、RI=0,等待接收,当RI=1,从 SBUF读取数据。1.查询方式接收:WAIT:JBC RI,NEXT;查询等待 SJMP WAITNEXT:MOV A,SBUF;读取接收数据 MOV R0,A;保存数据 INC R0 ;准备下一次接收 SJMP WAIT第31页/共86页322.中断方式接收:ORG0023H AJMP RINTMAIN:;初始化编程H1:SJMPH1 ;其它任务 RINT:CLRRI ;清中断标志 MOVA,SBUF;读取接收数据 MOVR0,A;保存数据 INCR0 RETI第32页/共86页33串行口的编程一、硬件连接二、双机通信三、多机通信第33页/共86页34两台8031直接通信RxDBTxDB一、硬件连接第34页/共86页35两台8751互传数据第35页/共86页36 单片机与单片机与RS232C接口接口(1)集成电路电平转换电路MC1488,1489(2)集成电路电平转换器Max232。(3)分离元件电平转换电路。第36页/共86页37两台8031采用RS232C总线通信第37页/共86页388031单片机和PC机通过RS232C总线通信接口图第38页/共86页39(a)MC1488(b)MC1489MC1488,MC1489引脚第39页/共86页40第40页/共86页41二、双机通信【例6-14】甲乙双方以串口方式1(8位数据)发送/接收数据块。通信协议:波特率4800b/s应答甲机发呼叫信号“06H”乙机发应答信号“00H”表示可以接收“05H”暂不接收数据格式 字节数 数据1 数据2 数据n 累加校验和 乙机计算的累加和与接收的累加和相同时,发“0FH”否则发“F0H”,甲机收到“F0H”则重发。第41页/共86页421.甲机发送 甲机将30H开始10个单元内容发送给乙机,以查询方式发送。晶振11.0592MHz,T1方式2的初值是FAH R1:数据区指针 R7:数据长度 R6:累加和 第42页/共86页43R1第43页/共86页44ORG 0HSTART:MOV TMOD,#20H;T1方式2MOV TH1,#0FAH;4800b/sMOV TL1,#0FAHMOV SCON,#50HSETB TR1AGAIN:CLR P1.0CLR TICLR RIMOV R1,#30H;数据区首地址MOV R7,#10;10个数据MOV R6,#0;累加和清0TX_ACK:MOV A,#06H;发呼叫“06HMOV SBUF,AWAT:JNB TI,WATCLR TI第44页/共86页45RX_REP:JNB RI,RX_REP;等待接收CLR RIMOV A,SBUF;接收应答CJNE A,#00H,TX_ACK ;应答不对,重;新呼叫TX_NUM:MOV A,R7;发字符数MOV SBUF,AWAIT2:JNB TI,WAIT2CLR TITX_DAT:MOV A,R1;发数据MOV SBUF,AADD A,R6;计算累加和MOV R6,AINC R1第45页/共86页46WAIT3:JNB TI,WAIT3DJNZ R7,TX_DAT;未完,再发下一个;数据MOV A,R6;发累加和MOV SBUF,AWAIT4:JNB TI,WAIT4CLR TICHECK:JNB RI,CHECKCLR RIMOV A,SBUFCJNE A,#0FH,AGAIN;传送不正确,重发SETB P1.0;正确SJMP$第46页/共86页472.乙机接收 乙机从40H开始存放接收到的数据,以查询方式接收。F0=0 暂不接收F0=1 接收 晶振11.0592MHz,T1方式2的初值是FAH R1:数据区指针 R7:数据长度 R6:累加和第47页/共86页48R1R1第48页/共86页49ORG 0HSTART:MOV TMOD,#20H;T1方式2MOV TH1,#0FAH;4800b/sMOV TL1,#0FAHMOV SCON,#50HSETB TR1ST:MOV R1,#40H;数据区首地址MOV R6,#0;累加和清0RX_ACK:JNB RI,RX_ACK;接收字符CLR RIMOV A,SBUF;取呼叫信号CJNE A,#06H,TX_05JBC F0,TX_00 ;同意接收TX_05:MOV A,#05H;不同意接收MOV SBUF,A SJMP RX_ACK第49页/共86页50TX_00:MOV A,#00H;发同意接收信号MOV SBUF,ARX_NUM:JNB RI,RX_NUM;接收字符数CLR RIMOV A,SBUFMOV R7,A;存字符计数值RX_DAT:JNB RI,RX_DAT;接收数据CLR RIMOV A,SBUFMOV R1,A;存数据INC R1ADD A,R6;计算累加和MOV R6,ADJNZ R7,RX_DAT;数据接收完?RX_SUM:JNB RI,RX_SUM;接收累加和CLR RI第50页/共86页51MOV A,SBUFCJNE A,R6,TX_ERRTX_OK:MOV A,#0FH;发正确接收标志MOV SBUF,A SJMP GOODTX_ERR:MOV A,#0F0H;发错误接收标志MOV SBUF,ASJMP STGOOD:SJMP$第51页/共86页52三、多机通信1.多机通信一般结构(主从机模式)MCS-51间多机通信PC机与MCS-51间多机通信第52页/共86页532多机通信原理多机通信与双机通信主要不同在于主机如何识别从机。1)给每个从机分配不同的地址(一字节)。2)发送的地址帧与数据帧应有不同的标识。串行口控制寄存器SCON中的SM2为多机通信控制位。串行口以方式2或3接收时:若SM2=1时,仅当接收到的第9位数据RB8为1时,数据才装入SBUF,置位RI,请求CPU处理(地址);当SM2=0时,则接收到一个数据后,不管第9位数据RB8是0还是1,都将数据装入接收缓冲器SBUF,置位RI,请求CPU处理(奇偶校验)。第53页/共86页54主机利用TB8安排地址与数据帧:TB8=1:地址帧,TB8=0:数据帧。从机用SM2识别地址帧:设定SM2=1,接收到的RB81时,为地址帧,该帧数据装入SBUF,置位RI,请求CPU处理主机地址呼叫;若接收到的RB80时,为数据帧,丢弃。具体多机通信过程:1.所有从机的SM2=1,只接收地址帧。2.主机置TB8=1,发送某一从机地址。3.所有从机收到地址帧后,与本机地址比较:相同,令SM2=0,准备接收数据帧;不同,维持SM2=1,对其后的数据帧不响应。4.主机置TB8=0,与被选中的从机进行通信。5.通信结束后,从机再次令SM2=1。第54页/共86页55第55页/共86页56【例6-15】(7-4)甲乙双方以串口方式1(8位数据)发送/接收数据块。1.甲机发送 甲方将78H,77H单元内容(2000H)作首地址,76H,75H单元内容(2020H)减一作末地址的外部数据存储器的数据块发送给乙方。波特率选4800 b/s,晶振频率6MHz.T1方式1作波特率发生器,需要在其中断服务程序中重赋初值:甲机以查询方式发送地址,中断方式发送数据。第56页/共86页57主程序流程图第57页/共86页58ORG 0RESET:LJMP MAINORG 001BHLJMP T1INT;T1中断入口ORG 0023HLJMP SINT;串口中断入口ORG 0100HMAIN:MOV SP,#60HMOV 78H,#20H;数据块首地址MOV 77H,#00HMOV 76H,#20H;数据块末地址MOV 75H,#20HACALL TRANS;调发送子程序HERE:AJMP HERE第58页/共86页59发送子程序流程图第59页/共86页60TRANS:ANL TMOD,#0FH ;保留T0方式不变ORL TMOD,#10H ;T1方式1MOV TL1,#0FAH ;T1初值MOV TH1,#0FFHMOV PCON,#80H ;SMOD=1SETB EA ;CLR ES ;关串口中断SETB ET1SETB PT1 ;T1高优先级CLR PS ;串口低优先级SETB TR1 ;启动T1CLR T1 ;清发送中断标志MOV SCON,#40H;串口方式1MOV SBUF,78H ;发送首地址高8位WAIT1:JNB TI,WAIT1 ;等待SBUF空第60页/共86页61CLRTIMOV SBUF,77H;发送首地址低8位WAIT2:JNBTI,WAIT2CLRTIMOV SBUF,76H;发送末地址高8位WAIT3:JNBTI,WAIT3CLRTIMOV SBUF,75H;发送末地址低8位SETB ESCLRF0;置发送数据开始标志WAIT4:JNBF0,WAIT4;等待全部数据发送完CLRTIRETT1中断服务程序:T1INT:CLRTR1;关T1MOVTL1,#0FAH;重置初值MOVTH1,#0FFHSETB TR1;启动T1RETI第61页/共86页62串口中断发送流程图第62页/共86页63串口中断服务程序:SINT:PUSH DPLPUSH DPHPUSH AESCOM:MOV DPH,78H;设置数据指针MOV DPL,77HMOVXA,DPTR;取数据CLRTI;清发送中断标志MOV SBUF,A;发送数据MOV A,DPH;CJNE A,76H,END1;判是否到数据块末尾MOV A,DPLCJNE A,75H,END1;再判低位,未到末尾CLRES;已到末尾,关串口中断第63页/共86页64CLR ET1;关T1中断CLR TR1;关T1SETB F0;置数据发送结束标志 ESCOM1:POP APOP DPHPOP DPLRETIEND1:INC 77H;数据块低地址加1MOV A,77HJNZ END2;判是否向高地址进位INC 78H;数据块地址高位加1END2:SJMP ESCOM1第64页/共86页652.乙机接收波特率与甲机相同为4800b/s(晶振频率6MHz)。开始接收的第一、二字节是数据块首地址,第三、四字节是数据块末地址减一。从第五字节开始是数据。设置地址/数据接收标志B.0,B.00,接收地址;B.01,接收数据。接收的地址放在78H,77H,76H,75H四个单元乙机以中断方式接收甲机发送的数据。第65页/共86页66ORG 0RESET:LJMP MAINORG 001BHLJMP T1INT;T1中断入口ORG 0023HLJMP RSINT;串口中断入口ORG 0100HMAIN:MOV SP,#60HACALLRECEIVE;调接收程序AJMP$主程序第66页/共86页67接收子程序第67页/共86页68RECEIVE:ANLTMOD,#0FH;保留T0方式不变ORLTMOD,#10H;T1方式1MOV TL1,#0FAH;T1初值MOV TH1,#0FFHMOV PCON,#80H;SMOD=1SETB EA;SETB ET1SETB ES;允许串口中断SETB PT1;T1高优先级CLRPS;串口低优先级SETB TR1;启动T1MOV SCON,#50H;串口方式1,允许接收CLRB.0;置地址/数据标志为地址MOV 70H,#78H;70H放起始接收地址第68页/共86页69CLRF0;置接收状态标志WAIT:JNBF0,WAIT;F0=0,处于接收状态。RET;否则,退出接收T1中断服务程序:T1INT:CLRTR1;关T1MOV TL1,#0FAH;重置初值MOV TH1,#0FFHSETB TR1;启动T1RETI第69页/共86页70接收中断流程图第70页/共86页71RSINT:PUSH DPLPUSH DPHPUSH AMOV A,R0;保护R0PUSH AJBB.0,DATA1;是数据,转接收数据MOV R0,70H;R0指向片内RAM单元地址MOV A,SBUF;接收地址MOV R0,A;存入相应RAM单元DEC70H;存放地址减一CLRRI;清接收中断标志MOV A,#74HCJNE A,70H,RETURN;地址未接收完,返回SETB B.0;置接收数据标志第71页/共86页72RETURN:POPAMOV R0,A;恢复R0POPAPOPDPHPOPDPLRETIDATA1:MOV DPH,78H;取数据存放地址MOV DPL,77H;到DPTRMOV A,SBUF;接收数据MOVXDPTR,A;存入外部存储器CLRRI;清接收中断标志INC77H;存放地址加1第72页/共86页73MOV A,77HJNZEND2;高位地址不用加1INC78H;加低位地址进位END2:MOV A,76H;检查是否到达数据末地址CJNE A,78H,RETURNMOV A,75HCJNE A,77H,RETURNCLRES;关串口中断CLRET1;关T1中断CLRTI;SETB F0;置接收完数据标志AJMP RETURN第73页/共86页74【例6-16】(7-5)甲乙双方以串口方式3(8位数据)发送/接收数据块。1.甲机发送甲方先发送存在78H,77H单元的地址,然后发送00H,01H,FEH共255个数据。波特率选2400b/s,晶振频率6MHz。T1作波特率发生器,工作在方式2,初值为F3H甲机以查询方式发送地址,中断方式发送数据。TB8=1地址TB8=0数据第74页/共86页75流程图第75页/共86页76程序:ORG 0LJMP TRANSORG 0023HLJMP SINT;串口中断入口ORG 0100HTRANS:MOV A,#20H;T1方式2MOV TMOD,A;MOV TL1,#0F3H;波特率初值MOV TH1,#0F3HMOV PCON,#80HSETB EA;CPU开中断CLRES;禁止串口中断CLRET1;禁止T1中断SETB TR1;启动T1MOV SCON,#0E0H;串口方式3,SM2=1SETB TB8;地址标识第76页/共86页77MOV SBUF,78H;发送高位地址WAIT1:JNBTI,WAIT1;等待发送一字节CLRTI;清发送标志MOV SBUF,77H;发送低位地址MOV IE,#90H;CPU,串口开中断CLRTB8;数据标识MOV A,#00H;第一个数据WAIT2:CJNE A,#0FFH,WAIT2;发送未结束,等待CLRES;关串口中断WAIT:AJMP WAIT;停止串口中断服务程序SINT:CLRTI;清发送标志MOV SBUF,A;发送数据INCA;准备下一个数据RETI第77页/共86页782.乙机接收开始接收的第一、二字节是数据块首地址,第三字节开始是255个数据,从接收到的地址开始存放。波特率与甲机相同,为2400b/s(晶振频率11.0592MHz)。乙机以中断方式接收甲机发送的数据。第78页/共86页79主程序流程图第79页/共86页80主程序ORG 0LJMP MAINORG 0023HLJMP RE;串口中断入口ORG 0100HMAIN:MOV SP,#60HACALLRECEIVE;调接收程序SJMP$RECEIVE:MOV A,#20H;T1方式2MOV TMOD,AMOV TL1,#0E8H;波特率初值MOV TH1,#0E8HMOV PCON,#80HSETB EA;CPU开中断CLRET1;禁止T1中断第80页/共86页81SETB ES;允许串口中断SETB TR1;启动T1MOV SCON,#0F0H;串口方式3,SM2=1,允许接收MOV R0,#0FEH;接收高位/低位地址标志SETB F0;置接收状态标志WAIT:MOV C,F0JCWAITRET第81页/共86页82接收中断流程图第82页/共86页83串口接收中断服务程序:RE:MOV C,RB8;取地址/数据标志JNC PD2;是数据INC R0;是地址,MOV A,R0;判高位/低位地址标志JZ PD;转接收低位地址MOV DPH,SBUF ;接收高位地址AJMP PD1PD:MOV DPL,SBUF;接收低位地址CLR SM2;只接收8位数据帧PD1:CLR RI;清接收中断标志RETI第83页/共86页84PD2:MOV A,SBUF;接收一个数据MOVXDPTR,A;存入INCDPTR;数据指针加1CLRRI;清接收中断标志CJNE A,#0FEH,RETURN;没接收完数据SETBSM2;数据接收完,恢复SM2CLRF0;清除接收状态标志RERURN:RETI第84页/共86页85本 章 结 束第85页/共86页86感谢您的观看!第86页/共86页