第五章51单片机最小系统及应用_第1页
第五章51单片机最小系统及应用_第2页
第五章51单片机最小系统及应用_第3页
第五章51单片机最小系统及应用_第4页
第五章51单片机最小系统及应用_第5页
已阅读5页,还剩85页未读, 继续免费阅读

下载本文档

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

文档简介

第五章C51单片机最小系统及应用15.1并行接口5.2中断系统5.3定时/计数器5.4串口通信5.1并行输入/输出接口5.1.1并行口应用与编程【例5-1】利用单片机的P0口接8个发光二极管,P1口接8个开关,编程实现,当开关动作时,对应的发光二极管亮或灭。汇编程序: ORG0100H MOVP1,#0FFHLOOP:MOVA,P1 MOVP0,A SJMPLOOP分析:只须把P1口的内容读入,通过P0口输出即可。C51语言程序:#include<reg51.h>voidmain(void){unsignedchari;P1=0xff;for(;;){i=P1;P0=i;}}235.2中断系统5.2.1中断的基本概念中断:平常CPU处理自己的工作,只有外设需要和CPU进行信息传送时,采用中断方式,暂停CPU工作,使CPU转去处理外设的请求,处理完外设请求后,CPU继续执行原来被暂停的工作。中断传输:是CPU与外设间最常用的一种数据传输方式。(a)单级中断

(b)中断嵌套

图5-1CPU响应断过程的示意图4中断的功能:(1)CPU与外设同步工作(2)实时处理(3)故障处理:中断的相关概念(1)中断(2)中断源:C51中有5个:两个外部中断,两个定时/计数器中断,一个串行口中断。(3)中断响应:CPU接受中断申请,终止现行程序,转为中断服务。(4)断点:现行程序被中断的地址。(5)中断优先级:(6)中断服务程序:实现中断功能的处理程序;(7)中断返回:完成中断服务程序后,返回到被中断的原程序,并继续执行该程序。55.2.2中断系统中断系统需要解决的问题:(1)CPU在不断执行指令过程中,如何检测中断请求?(2)如何使中断双方(CPU方和中断源方)能人为控制——允许中断或禁止中断?(3)中断的随机性,如何实现转移,更好地为该中断源服务呢?(4)中断源有多个,而CPU只有一个,当有多个中断源同时有中断请求时,怎样控制CPU按照需要安排响应次序?(5)中断服务完毕,如何正确地返回到原断点处?661.中断系统的结构

图5-2C51的中断系统结构特殊功能寄存器:定时器控制寄存器TCON:保存中断信息串行口控制寄存器SCON:保存中断信息中断允许寄存器IE:控制中断的开放和关闭中断优先级寄存器IP:设置优先级别7TCOND7D6D5D4D3D2D1D0(88H)TF1TR1TF0TR0IE1IT1IE0IT0IT0(IT1):外部中断0(或1)触发方式控制位。设置为0,选择外部中断为电平触发方式;设置为1,则选择外部中断为边沿触发方式。IE0(IE1):外部中断0(或1)的中断请求标志位。在边沿触发方式时,若第一个机器周期采样到P3.2(或P3.3)引脚为高电平,第二个机器周期采样到P3.2(或P3.3)引脚为低电平时,由IE0(或IE1)置1,向CPU请求中断,CPU响应后自动将IE0(或IE1)清零。在电平触发方式时,CPU在每个机器周期的S5P2采样P3.2(或P3.3),若P3.2(或P3.3)引脚为高电平,则IE0(IE1)清0,若P3.2(或P3.3)引脚为低电平,则IE0(IE1)置1,向CPU请求中断;响应中断后,并不对IE0(或IE1)进行处理。2.定时器控制寄存器TCON8如果在中断服务程序返回时,P3.2(或P3.3)引脚还为低电平,则又会再一次响应中断。

为避免这种情况,只有在中断服务程序返回前,撤消P3.2(或P3.3)的中断请求信号。可通过下图所示电路实现。INTx8051P1.0QDSCLK外部中断请求信号8#include<reg51.h>

sbitP10=P1^0;voidmain(){P10=0;P10=1;}9定时/计数器T0和T1中断当T0(或T1)溢出时,由硬件置TF0(或TF1)为“1”,向CPU发送中断请求,当CPU响应中断后,由硬件自动清除TF0(或TF1)。TR1、TR0:定时/计数器T1或T0的启动位,置1启动;0时停止。串行口中断串行口中断源对应两个中断标志位:串行口发送TI、串接收中断标志位RI。无论哪个标志位置“1”,都请求串行口中断。TCOND7D6D5D4D3D2D1D0(88H)TF1TR1TF0TR0IE1IT1IE0IT0SCOND7D6D5D4D3D2D1D098HSM0SM1SM2RENTB8RB8TIRI103.中断允许控制寄存器IEC51单片机中没有专门的开中断和关中断指令,对各个中断源的允许和屏蔽是由内部的中断允许寄存器IE的各位来控制的。中断允许寄存器IE的字节地址为A8H,可以进行位寻址。IED7D6D5D4D3D2D1D0(A8H)EAET2ESET1EX1ET0EX0EA:中断允许总控位。EA=0,屏蔽所有的中断请求;EA=1,开放中断。ET2:定时器/计数器T2的溢出中断允许位ES:串行口中断允许位。ET1:定时器/计数器T1的溢出中断允许位。EX1:外部中断INT1的中断允许位。ET0:定时器/计数器T0的溢出中断允许位。EX0:外部中断INT0的中断允许位。1011【例5-1】

开放INTl和Tl的溢出中断,屏蔽其他中断。分析:对应的中断允许控制字为:l0001100B,即8CH。只要将这个结果送入IE中,中断系统就按所设置的结果来管理这些中断源。形成这个控制结果的方法可以对IE按字节操作,也可以按位操作。

①按字节操作形式:IE=0x8C;②按位操作形式:EA=1;//开总中断控制位EXl=1;//允许外部中断1中断ETl=1;//允许定时器/计数器1中断IED7D6D5D4D3D2D1D0(A8H)EAET2ESET1EX1ET0EX0124.中断优先级寄存器IP

每个中断源有两级控制:高优先级、低优先级。中断优先级寄存器IP的字节地址为B8H,可以进行位寻址.IPD7D6D5D4D3D2D1D0(B8H)PT2PSPT1PX1PT0PX0PT2:定时器/计数器T2的中断优先级控制位,只用于52子系列。PS:串行口的中断优先级控制位。PT1:定时器/计数器T1的中断优先级控制位。PX1:外部中断INT1的中断优先级控制位。PT0:定时器/计数器T0的中断优先级控制位。PX0:外部中断INT0的中断优先级控制位。

如果某位被置“1”,则对应的中断源被设为高优先级;

如果某位被清“0”,则对应的中断源被设为低优先级。

对于同级中断源,系统有默认的优先权顺序。13中断源优先级顺序最高最低外部中断0定时/计数器T0中断外部中断1定时/计数器T1中断串行口中断定时/计数器T2中断中断优先级寄存器IP功能:改变中断源的优先权顺序、实现二级中断嵌套。对于中断优先权和中断嵌套,C51单片机有以下三条规定:(1)正在进行的中断过程不能被新的同级、低优先级的中断请求中断。(2)正在进行的低优先级中断服务程序能被高优先级中断请求所中断,实现两级中断嵌套。(3)CPU同时接收到几个中断请求时,首先响应优先级最高的中断请求。145.各中断服务程序的入口地址见表中断源入口地址外部中断00003H定时/计数器0000BH外部中断10013H定时/计数器1001BH串行口0023H定时/计数器2(仅52子系列有)002BH6.中断响应时间

中断响应时间:是指CPU检测到中断请求信号到转入中断服务程序入口所需要的机器周期。C51单片机响应中断的最短时间为3个机器周期。最长8个机器周期。155.2.3中断响应过程1.中断响应的条件单片机响应中断的条件是中断源有请求且CPU开中断(即EA=1)。(1)无同级或高级中断正在处理。(2)现行指令执行到最后一个机器周期且已结束。(3)若现行指令为RETI或访问IE、IP的指令时,执行完该指令且紧随其后的另一条指令也已执行完毕。2.中断响应过程(1)根据中断源的优先级高低,对相应的优先级状态触发器置“1”,即关闭同级和低级的中断;(2)保护断点,即把程序计数器PC的内容压入堆栈保存。(3)清除内部硬件可清除的中断请求标志位(IE0、IE1、TF0、TF1)。(4)把被响应的中断服务程序入口地址送入PC,从而转入相应的中断服务程序执行。163.中断服务程序设计的基本任务①

设置中断允许控制寄存器IE,允许相应的中断源请求中断。②设置中断优先级寄存器IP,确定并分配所使用的中断源的优先级。③

若是外部中断源,还要设置中断请求的触发方式IT1或IT0,以决定采用电平触发方式还是边沿触发方式。④

编写中断服务程序,处理中断请求。中断服务程序主要包括:中断管理保护现场中断处理恢复现场中断返回175.2.4MCS-51中断系统的应用【例5-9】某工业监控系统,具有温度、压力、PH值等多路监控功能,中断源的连接如图5.26所示。对于PH值,在小于7时向CPU申请中断,CPU响应中断后使P3.0引脚输出高电平,经驱动,使加碱管道电磁阀接通1秒钟,以调整PH值。17电磁阀P3.2INT0P3.08051P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7QRDCLK温度1超限温度2超限PH值超限压力超限+5V18ORG0003H;外部中断0中断服务程序入口JBP1.0,INT00;查询中断源,转对应的中断服务子程序JBP1.1,INT01JBP1.2,INT02JBP1.3,INT03 ORG0080H;PH值超限中断服务程序INT02:PUSHPSW;保护现场 PUSHACC SETBPSW.3;工作寄存器设置为1组,以保护原0组的内容 SETBP3.0;接通加碱管道电磁阀 ACALLDELAY;调延时1秒子程序 CLRP3.0;1秒钟到关加碱管道电磁阀 ANLP1,#0BFH ORLP1,#40H;这两条用来产生一个P1.6的负脉冲,

;用来撤除PH<7的中断请求 POPACC POPPSW RETI汇编程序如下:19C语言程序:#include<reg51.h>sbitP10=P1^0;sbitP11=P1^1;sbitP12=P1^2;sbitP13=P1^3;sbitP16=P1^6;sbitP30=P3^0;voidint0()interrupt0using1{voidint00();voidint01();voidint02();voidint03();if(P10==1){int00();}//查询调用对应的函数elseif(P11==1){int01();}elseif(P12==1){int02();}elseif(P13==1){int03();}}voidint02(){unsignedchari;P30=1;for(i=0;i<255;i++);P30=0;P16=0;P16=1;}205.3定时/计数器5.3.1概述1.计数容量

:C51单片机中有两个计数器,T0和T1,这两个计数器分别是由两个8位的RAM单元组成,即都是16位,最大计数容量是65536。2.定时:定时是对周期相等的脉冲进行计数。单片机内部提供一个固定的计数源(即:晶振经12分频后的脉冲源),通过对计数源计数实现定时。定时/计数器的功能:

定时/计数器是单片机中最常用、最基本的组成功能部件之一,可用来实现定时控制、延时、频率测量、脉冲宽度测量、信号发生、信号检测等功能。3.溢出:

计数器溢出时,将使标志位TF0/TF1置“1”。一旦TF0/TF1由0变1,就会引发中断处理事件。如:定时时间到,闹钟会响。4.定时方法:硬件定时定时功能全部由硬件电路完成,不占CPU时间,可通过修改电路中的元件参数(电阻或电容值)来调节定时时间,但硬件连接好后,定时值不能由软件控制和修改,即不可编程。软件定时

通过CPU循环执行一段程序以实现延迟,延迟时间可通过指令和设计循环次数来实现。特点:时间精确,且无需外加硬件电路,占用CPU资源。可编程定时

通过对系统时钟脉冲计数来实现。计数值用程序设定和修改,使用灵活、方便。2151子系列单片机有两个16位的可编程定时/计数器:定时/计数器T0和定时/计数器T1;52子系列有三个,还有一个定时/计数器T2每个定时/计数器既可以对系统时钟计数,实现定时;也可以对外部脉冲信号计数,实现计数功能,通过编程设定来实现。每个定时/计数器都有多种工作方式,其中T0有四种工作方式;T1有三种工作方式,T2有三种工作方式。通过编程可设定工作方式。每一个定时/计数器定时或计数时间到时,产生溢出,使相应的溢出位置位,溢出可通过查询或中断方式处理。5.定时/计数器的主要特性225.3.2定时/计数器T0、T1的结构及工作原理定时/计数器T0、T1的结构1.定时/计数器T0、T1的结构232.定时/计数器T0、T1的工作原理

定时/计数器的核心是加1计数器;定时/计数器的控制电路受软件控制、切换,TMOD;

定时器的定时时间与系统的振荡频率紧密相关;

最短的定时时间?定时/计数器在计数时,外部脉冲的下降沿触发计数;

检测一个跳变需要两个机器周期,因此,外部事件的最高频率为1/24振荡频率24计数过程:在每一个机器周期的S5P2时刻对T0(P3.4)或T1(P3.5)上信号采样一次,如果上一个机器周期采样到高电平,下一个机器周期采样到低电平,则计数器在下一个机器周期的S3P2时刻加1计数。因而需要两个机器周期才能识别一个计数脉冲,所以外部计数脉冲的频率应小于振荡频率的1/24。计数寄存器的溢出:(1)每来一个脉冲,计数寄存器加1;(2)计数器计满时,再来一脉冲加1,计数器溢出,产生溢出信号,TF0或TF1置1;(3)计数器溢出表示定时时间到或计数值已满,需要单片机处理。计数的初值为: 计数初值=2n-计数值。n=8、13、16位255.2.3定时/计数器的方式和控制寄存器1.定时/计数器的控制寄存器TCONTCOND7D6D5D4D3D2D1D0(88H)TF1TR1TF0TR0IE1IT1IE0IT0TF1、TF0:定时/计数器T1或T0的溢出标志位;TR1、TR0:定时/计数器T1或T0的启动位,置1启动;0时停止。IT0/IT1:外部中断0(或1)的中断触发方式控制位IE0/IE1:外部中断0(或1)的中断请求标志位定时/计数器控制寄存器TCON,地址为88H,可位寻址,位地址范围为88H~8FH。功能:控制定时器的启动和停止、溢出中断、触发方式、锁存中断请求。262.定时/计数器的方式寄存器TMODTMODD7D6D5D4D3D2D1D0(89H)GATEC/TM1M0GATEC/TM1M0←定时器1→←定时器0→其中:M1、M0为工作方式选择位,用于对T0的四种工作方式,T1的三种工作方式进行选择,选择情况如下M1M0工作方式方式说明00013位定时/计数器(8192)01116位定时/计数器(065535)1028位自动重置定时/计数器(255)113两个8位定时/计数器(只有T0有)27C/T:定时或计数方式选择位,当C/T=1时工作于计数方式;当C/T=0时工作于定时方式。GATE:门控位,用于控制定时/计数器的启动是否受外部中断请求信号的影响。GATE=0,运行只受TCON中运行控制位TR0/TR1的控制。GATE=1,运行同时受TR0/TR1和外中断输入信号的双重控制。

只有当INT0/INT1=1且TR0/TR1=1,T0/T1才能运行。285.2.3定时/计数器的工作方式1.方式0振荡器

12TLx(低5位)THx(高8位)TFx与或TxTRxGATEINTxS2S1C/TTcy中断请求29方式1是13位的定时/计数方式,因而最大计数值(满值)为2的13次幂,等于8192。如计数值为N,则置入的初值X为:

X=8192-N

如定时/计数器T0的计数值为1000,则初值为7192,转换成二进制数为1110000011000B,则TH0=11100000B,TL0=00011000B。30【例5-6】设定时器T0选择工作模式0,定时时间为1ms,fosc=6MHz。试确定T0初值,计算最大定时时间T。解:当T0处于工作模式0时,加1计数器为13位。(1)确定T0初值设T0的初值位X。据式5.2得:

X=7692D=1111000001100BT0的低5位:01100B=0CH即(TL0)=0CHT0的高8位:11110000B=F0H即(TH0)=0F0H(2)计算最大定时时间TT0的最大定时时间对应于13位计数器T0的各位全为1,即(TL0)=1FH,(TH0)=FFH,初值为0。则:2.方式1方式1的结构与方式0结构相同,只是把13位变成16位,16位的加法计数器被全部用上。由于是16位的定时/计数方式,因而最大计数值(满值)为2的16次幂,等于65536。如计数值为N,则置入的初值X为:X=65536-N如定时/计数器T0的计数值为1000,则初值为65536-1000=64536,转换成二进制数为1111110000011000B,则TH0=11111100B,TL0=00011000B。31振荡器

12TLx(低8位)THx(高8位)TFx与或TxTRxGATEINTxS2S1C/TTcy中断请求3.方式2振荡器

12TLx(8位)THx(8位)TFx与或TxTRxGATEINTxS2S1C/TTcy中断请求重装初值8

方式2下,16位的计数器只用了8位来计数,用的是TL0(或TL1)的8位来进行计数,而TH0(或TH1)用于保存初值。当TL0(或TL1)计满时则溢出,一方面使TF0(或TF1)置位,另一方面溢出信号又会触发图上的三态门,使三态门导通,TH0(或TH1)的值就自动装入TL0(或TL1)。32方式2是8位的定时/计数方式,最大计数值(满值)为2的8次幂,等于256。如计数值为N,则置入的初值X为:

X=256-N

如定时/计数器T0的计数值为100,则初值为256-100=156,转换成二进制数为10011100B,则TH0=TL0=10011100B。优点:能够进行自动重装载。缺点:定时/计数范围要小于方式0和方式133振荡器

12TL0(8位)TF0与或T0TR0GATEINT0S2S1C/TTcy中断请求TH0(8位)TF1S2中断请求T1TR134四.方式3方式3只有定时/计数器T0才有,当M1M0为11时,T0工作于方式3。方式3下,T0被分为两部分TL0和TH0,TL0作为定时/计数器使用,占用T0的全部控制位:GATE、C/T、TR0和TF0;TH0固定只能作定时器使用,对机器周期进行计数,它占用T1的TR1位、TF1位和T1的中断资源。5.2.4定时/计数器的初始化编程及应用一.定时/计数器的编程定时/计数器初始化过程:1.选择方式,确定方式控制字,写入方式控制寄存器TMOD。2.预设定时或计数初值,写入初值寄存器(TH0、TL0、TH1、TL1)。353.根据需要开放定时/计数器中断(直接对IE赋值)。4.设置定时/计数器控制寄存器TCON值,启动定时/计数器。(TR0、TR1置1,或外部中断引脚电平启动)定时方式:计数方式:5.等待定时/计数时间到,执行中断服务程序;如用查询处理则编写查询程序判断溢出标志,溢出标志等于1,则进行相应处理。二.定时/计数器的应用

利用定时/计数器来产生周期性波形。编程思想:

利用定时/计数器产生周期性的定时,定时时间到则对输出端进行相应处理。如产生周期性的方波只须定时时间到对输出端取反一次。【例5-2】设系统时钟频率为12MHz,用定时/计数器T0编程实现从P1.0输出周期为500μs的方波。36分析:从P1.0输出周期为500μs的方波,只须P1.0每250μs取反一次则可。当系统时钟为12MHZ,定时/计数器T0工作于方式2时,最大定时时间为256μs,满足250μs的定时要求。方式控制字应设定为00000010B(02H)。系统时钟为12MHZ,定时250μs,计数值N为250,初值X=256-250=6,则TH0=TL0=06H。汇编程序:ORG0000HLJMPMAINORG000BH;中断处理CPLP1.0RETIORG0100H;主程序MAIN: MOVTMOD,#02HMOVTH0,#06HMOVTL0,#06HSETBEASETBET0SETBTR0SJMP$ENDC语言程序:#include<reg51.h>//包含特殊功能寄存器库sbitP1_0=P1^0;voidmain(){TMOD=0x02;TH0=0x06;TL0=0x06;EA=1;ET0=1;TR0=1;while(1);}voidtime0_int(void)interrupt1//中断服务程序{P1_0=!P1_0;}(1)采用中断处理方式的程序:37(2)采用查询方式处理程序汇编程序:ORG0000HLJMPMAINORG0100H;主程序MAIN: MOVTMOD,#02H MOVTH0,#06H MOVTL0,#06H SETBTR0LOOP: JBCTF0,NEXT;查询计数溢出

SJMPLOOPNEXT: CPLP1.0 SJMPLOOP SJMP$ ENDC语言程序:#include<reg51.h>//包含特殊功能寄存器库sbitP1_0=P1^0;voidmain(){chari;TMOD=0x02;TH0=0x06;TL0=0x06;TR0=1;for(;;){if(TF0){TF0=0;P1_0=!P1_0;}//查询计数溢出}}38注意:如果定时时间大于65536μs,用一个定时/计数器直接处理不能实现,可用两个定时/计数器共同处理或一个定时/计数器配合软件计数方式处理。根据例5-2的处理过程,应产生500ms的周期性的定时。39【例5-3】设系统时钟频率为12MHz,编程实现从P1.1输出周期为1s的方波。由于定时时间较长,一个定时/计数器不能直接实现,可用定时/计数器T0产生周期性为10ms的定时,然后用一个寄存器R2对10ms计数50次或用定时/计数器T1对10ms计数50次实现。系统时钟为12MHz,定时/计数器T0定时10ms,计数值N为10000,只能选方式1,方式控制字为00000001B(01H),初值X:X=65536-10000=55536=1101100011110000B则TH0=11011000B=D8H,TL0=11110000B=F0H。汇编程序:ORG0000HLJMPMAINORG000BHLJMPINTT0ORG0100HMAIN: MOVTMOD,#01H MOVTH0,#0D8H MOVTL0,#0F0H MOVR2,#00H SETBEA SETBET0 SETBTR0 SJMP$INTT0:MOVTH0,#0D8H MOVTL0,#0F0H INCR2 CJNER2,#32H,NEXT CPLP1.1 MOVR2,#00HNEXT:RETI END40(1)用寄存器R2作计数器软件计数,中断处理方式。C语言程序:#include<reg51.h>//包含特殊功能寄存器库sbitP1_1=P1^1;chari;voidmain(){TMOD=0x01;TH0=0xD8;TL0=0xf0;EA=1;ET0=1;i=0;TR0=1;while(1);}voidtime0_int(void)interrupt1//中断服务程序{TH0=0xD8;TL0=0xf0;i++;if(i==50){P1_1=!P1_1;i=0;}}41(2)用定时/计数器T1计数实现42定时/计数器T1工作于计数方式时,计数脉冲通过T1(P3.5)输入,设定时/计数器T0定时时间到对T1(P3.5)取反一次,则T1(P3.5)每20ms产生一个计数脉冲,那么定时500ms只须计数25次。设定时/计数器T1工作于方式2,初值X=256-25=231=11100111B=E7H,TH1=TL1=E7H。T0工作于方式1,定时,则这时方式控制字为01100001B(61H)。定时/计数器T0和T1都采用中断方式工作。ORG0100HMAIN: MOVTMOD,#61H MOVTH0,#0D8H MOVTL0,#0F0H MOVTH1,#0E7H MOVTL1,#0E7H SETBEA SETBET0 SETBET1 SETBTR0 SETBTR1 SJMP$ END43汇编程序如下:ORG0000HLJMPMAINORG000BHMOVTH0,#0D8HMOVTL0,#0F0HCPLP3.5RETIORG001BHCPLP1.1RETIC语言程序如下:#include<reg51.h>//包含特殊功能寄存器库sbitP1_1=P1^1;sbitP3_5=P3^5;voidmain(){TMOD=0x61;TH0=0xD8;TL0=0xf0;TH1=0xE7;TL1=0xE7;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;while(1);}voidtime0_int(void)interrupt1//T0中断服务程序{TH0=0xD8;TL0=0xf0;P3_5=!P3_5;}voidtime1_int(void)interrupt3//T1中断服务程序{P1_1=!P1_1;}445.4串行接口5.4.1通信的基本概念1.并行通信和串行通信计算机与外界的通信有两种基本方式:并行通信和串行通信。45根据信息传送的方向,串行通信可以分为单工、半双工和全双工3种。(a)AB(b)(c)ABABss二.同步通信和异步通信串行通信按信息的格式分为:异步通信、同步通信。1.串行异步通信方式特点:数据传送时以字节为单位,未传送时线路处于空闲状态,空闲线路约定为高电平“1”。传送一个字符又称为一帧信息,传送时每一个字符前加一个低电平的起始位,然后是数据位,数据位可以是5~8位,低位在前,高位在后,数据位后可以带一个奇偶校验位,最后是停止位,停止位用高电平表示,它可以是1位、1位半或2位。46第n+1个字符起始位奇偶校验位停止位下一个起始位D2D1D0D3D4D5D6D7数据位D0D10010/10/10/10/10/10/10/10/10/10/10/1D2……第n个字符

一次只传送一个字符,对发送时钟、接收时钟的要求相对不高,线路简单,但传送速度较慢。2.串行同步通信方式特点:数据传送时以字符块为单位,一次传送多个字符,传送时须在前面加上一个或两个同步字符,后面加上校验字符,格式如图:同步字符1同步字符2数据块校验字符1校验字符2同步方式一次连续传送多个字符,传送的速度快,但对发送时钟和接收时钟要求较高,需用一个时钟源协调收发两端的工作,控制线路复杂。47三.波特率波特率:是指串行通信中,单位时间传送的二进制位数,单位为bps。在异步通信中,传输速度往往又用每秒传送多少个字节来表示(Bps)。它与波特率的关系为:波特率(bps)=一个字符的二进制位数×字符/秒(Bps)例如:每秒传送200个字符,每个字符1位起始位、8个数据位、1个校验位和1个停止位。则波特率为2200bps。48发送SBUF接收SBUF发送控制器接收控制器输入移位寄存器串行口控制寄存器波特率发生器串行口中断内部总线门+RXD(P3.0)TXD(P3.1)RITI495.4.2MCS-51单片机串行口功能与结构1.C51串行口结构C51单片机具有一个全双工、串行、异步通信接口。实现串行数据的发送和接收。既可以实现串行异步通信,也可作为同步移位寄存器。C51单片机串行口主要由发送数据寄存器、发送控制器、输出控制门、接收数据寄存器、接收控制器、输入移位寄存器等组成。由三个特殊功能寄存器组成:发送数据寄存器和接收数据寄存器合起用一个特殊功能寄存器SBUF(串行口数据寄存器)、串行口控制寄存器SCON、电源控制寄存器PCON。1).串行口控制寄存器SCON2.C51串行口相关寄存器图5-22串行口控制寄存器SCON位格式51SM0、SM1:串行口工作方式选择位。用于选择四种工作方式SM0SM1方式功能波特率00方式0移位寄存器方式fosc/1201方式18位异步通信方式可变10方式29位异步通信方式fosc/32或fosc/6411方式39位异步通信方式可变②多机通信控制位SM2(SCON.5)主要用于方式2和方式3。如果SM2=1,允许多机通信。若SM2=0,直通方式,当收到RB8(0或1),则接收一帧数据后,不管第九位数据是0还是1,都置RI=1,使接收到的数据装入SBUF。若SM2=1,允许多机通信。当主机与多片C51(从机)通信时,所有从机的SM2位都置1。主机首先发送一帧数据为地址,即从机编号,其中第9位为1,所有的从机接收到数据后,将其中第9位装入RB8中。各个从机根据收到的第9位数据(RB8中)的值来决定从机可否再接收主机的信息。SM2:多机通信控制位。REN:允许接收控制位。当REN=1,则允许接收,当REN=0,则禁止接收。TB8:发送数据的第9位。RB8:接收数据的第9位。TI:发送中断标志位。RI:接收中断标志位。2)电源控制寄存器PCONPCOND7D6D5D4D3D2D1D087HSMOD当SMOD位为1,则串行口方式1、方式2、方式3的波特率加倍。525.4.3串行口的工作方式1)方式0

方式0,通常用来作为同步移位寄存器,扩展I/O口。在方式0工作时波特率固定为:fosc/12。工作时,串行数据通过RXD输入和输出,同步时钟通过TXD输出。发送和接收数据时低位在前,高位在后,长度为8位。5354(1)发送过程

在TI=0时,当CPU执行一条向SBUF写数据的指令时,如MOVSBUF,A,就启动发送过程。经过一个机器周期,写入发送数据寄存器中的数据按低位在前,高位在后从RXD依次发送出去,同步时钟从TXD送出。8位数据(一帧)发送完毕后,由硬件使发送中断标志TI置位,向CPU申请中断。再次发送数据之前,TI必须由软件清零。55(2)接收过程

在RI=0条件下,将REN(SCON.4)置“1”,启动一次接收过程。串行数据通过RXD接收,同步移位脉冲通过TXD输出。在移位脉冲的控制下,串行数据依次移入移位寄存器。当8位数据全部移入移位寄存器后,接收控制器发出“装载SBUF”信号,将8位数据并行送入接收数据缓冲器SBUF,同时,由硬件使接收中断标志RI置位1,向CPU申请中断。2)方式1

方式1是8位异步通信方式。一帧信息为10位:1位起始位(0),8位数据位(低位在前)和1位停止位。TXD发送数据端,RXD为接收数据端。波特率可变,由定时/计数器T1的溢出率和电源控制寄存器PCON中的SMOD位决定。即:波特率=2SMOD×(T1的溢出率)/32。5657(1)方式1发送过程在TI=0时,方式1的发送过程与方式0的发送过程类似,当执行写发送缓冲寄存器语句:SBUF=x(x为任意值)时,就启动发送,数据由TXD送出,发送时钟由定时/计数器T1送来的溢出信号经过16分频或32分频后得到。在发送时钟的作用下,先通过TXD端送出一个低电平的起始位,然后是8位数据(低位在前),其后是一个高电平的停止位,当一帧数据发送完毕后,由硬件使发送中断标志TI置位,向CPU申请中断,完成一次发送过程。(2)方式1接收过程当允许接收控制位REN置1,接收器开始工作。接收器以选波特率的16倍速率对RXD上的电平进行采样。当采样到负跳变时,启动接收控制器,开始接收数据。在接收移位脉冲的控制下,依次把数据移入移位寄存器,当8位数据及停止位全部移入后,根据以下状态,进行响应操作。①RI=0、SM2=0,接收控制器将输入移位寄存器中的8位数据装入接收数据寄存器SBUF,停止位装入RB8,并置RI=1,向CPU申请中断。②RI=0、SM2=1,那么只有停止位为“1”才发生上述操作。③RI=0、SM2=1,停止位为“0”,接收的数据不装入SBUF,数据丢失。④RI=1,接收的数据在不装入SBUF,即数据丢失。583)方式2和方式3

方式2和方式3都为9位异步通信接口。一帧信息长度为11位:1个低电平的起始位,9位数据位,1个高电平的停止位。发送的第9位数据放于TB8中,接收的第9位数据放于RB8中。方式2和方式3的区别在于波特率不同。方式2的波特率有两种:fosc/32或fosc/64,方式3的波特率与方式1的波特率相同,由定时/计数器T1的溢出率和电源控制寄存器PCON中的SMOD位决定,即:波特率=2SMOD×(T1的溢出率)/32。在方式3时,也要对定时/计数器T1进行初始化。5960(1)方式2和方式3发送过程

方式2和方式3发送的数据为9位,其中发送的第9位在TB8中,在启动发送之前,必须把要发送的第9位数据装入SCON寄存器中的TB8中。准备好TB8后,就可以向SBUF中写入发送的字符数据来启动发送过程。发送时前8位数据从发送数据寄存器中取得,发送的第9位从TB8中取得。一帧信息发送完毕,置TI为1。发送前,由软件设置TB8,可使用如下语句完成:TB8=1; //TB8位置1TB8=0; //TB8位清零61(2)接收过程方式2和方式3的接收过程与方式1类似,当REN位置1时启动接收过程,所不同的是接收的第9位数据是发送过来的TB8位,而不是停止位,接收到后存放到SCON中的RB8中,对接收是否有判断也是用接收的第9位,而不是用停止位。其余情况与方式1相同。625.4.4串行口波特率设计方式0:波特率是固定的,为单片机晶振频率的1/12:BR=fOSC/12(fOSC为晶振频率)方式2:晶振频率的1/32或1/64:

BR=2SMOD

×fOSC/64方式1和方式3:波特率是可变的,其波特率由定时器1的溢出率决定,定时器1溢出率:单位时间定时器溢出次数;当定时器1作波特率发生器时,通常选用定时工作方式2(8位自动加载)。设TH1为计数初值,T1溢出率计算公式为:波特率计算公式:

63串口工作方式及波特率(b/s)fosc(MHz)SMOD定时器1C/工作方式初值方式1、362.5K12102FFH19.2L11.0592102FDH960011.0592002FDH480011.0592002FAH240011.0592002F4H120011.0592002E8H如果串行通信选用很低的波特率,可将定时器T1置于模式0或模式1,即13位或16位定时方式;但在这种情况下,T1溢出时,需要中断服务程序重装初值。中断响应时间、执行指令时间会使波特率产生一定的误差,可用改变初值的办法加以调整。5.4.5串行口的编程及应用1)串行口的初始化编程1.串行口控制寄存器SCON的确定。根据工作方式确定SM0、SM1位;对于方式2和方式3还要确定SM2位;如果是接收端,则置允许接收位REN为1;如果方式2和方式3发送数据,则应将发送数据的第9位写入TB8中。对于方式0,不需要对波特率进行设置。对于方式2,设置波特率仅须对PCON中的SMOD位进行设置。642.设定波特率倍增寄存器(PCON)中SMOD的值;3.确定T1的工作方式(编程TMOD寄存器);4.设置波特率,计算并装入定时初值。

对于方式1和方式3,不仅需对PCON中的SMOD位编程,还需开启定时器1,对T1编程,计算T1初值,装载TH1、TL1,并启动定时(编程TCON中的TR1位)。5.选择查询方式或中断方式,在中断工作方式时,需对IE编程。65【例5-13】8051单片机时钟振荡频率为11.0592MHz,选用定时器T1工作模式2作为波特率发生器,波特率为2400b/s,采用查询方式,求初值。并编写初始化程序。解:根据要求定时器/计数器T1的方式控制字TMOD为20H。

串行口波特率为2400b/s,波特率不倍增,SMOD=0,据波特率计算公式:所以:(TH1)=(TL1)=F4H初始化程序:#include<reg51.h>voidInitUART(void){PCON=0x00;//波特率不倍增

SCON=0x50;//串行口工作在方式1,允许接收

TMOD=0x20;TH1=0xF4;TL1=0xF4;TR1=1;

}2)串行口的应用

通常用于三种情况:利用方式0扩展并行I/O口;利用方式1实现点对点的双机通信;利用方式2或方式3实现多机通信。(1)利用方式0扩展并行I/O口66【例5-4】8051单片机的串行口外接串入并出的芯片CD4094扩展并行输出口控制一组发光二极管,使发光二极管从左至右延时轮流显示。CD4094是串入并出的芯片,带有一个控制端STB,当STB=0时,打开串行输入控制门,在时钟信号CLK的控制下,数据从串行输入端DATA依次输入;当STB=1,打开并行输出控制门,CD4094中的8位数据并行输出。使用时,8051串行口工作于方式0,8051的TXD接CD4094的CLK,RXD接DATA,STB用P1.0控制,8位并行输出端接8个发光二极管。67设串行口采用查询方式,显示的延时依靠调用延时子程序来实现。汇编程序:ORG0000HLJMPMAINORG0100HMAIN: MOVSCON,#00H MOVA,#01H CLRP1.0START:MOVSBUF,ALOOP:JNBTI,LOOP SETBP1.0 ACALLDELAY CLRTI RLA CLRP1.0 SJMPSTARTDELAY:MOVR7,#05HLOOP2:MOVR6,#0FFHLOOP1:DJNZR6,LOOP1 DJNZR7,LOOP2 RET END68C语言程序:#include<reg51.h>//包含特殊功能寄存器库sbitP1_0=P1^0;voidmain(){unsignedchari,j;SCON=0x00;j=0x01;for(;;){P1_0=0;SBUF=j;while(!TI){;}P1_0=1;TI=0;for(i=0;i<=254;i++){;}j=j*2;if(j==0x00)j=0x01;}}69【例5-5】用8051单片机的串行口外接并入串出的芯片CD4014扩展并行输入口,输入一组开关的信息。CD4014是一块8位的并入串出的芯片,带有一个控制端P/S,当P/S=1时,8位并行数据置入到内部的寄存器;当P/S=0时,在时钟信号CLK的控制下,内部寄存器的内容按低位在前从QB串行输出端依次输出;使用时,8051串行口工作于方式0,8051的TXD接CD4094的CLK,RXD接QB,P/S用P1.0控制,另外,用P1.1控制8并行数据的置入。如图所示。8051RXDTXDP1.0QBCLKP/SP1.1K0K7K70

串行口方式0数据的接收,用SCON寄存器中的REN位来控制,采用查询RI的方式来判断数据是否输入。程序如下:汇编程序: ORG0000H LJMPMAIN ORG0100HMAIN:SETBP1.1START:JBP1.1,START SETBP1.0 CLRP1.0 MOVSCON,#10HLOOP:JNBRI,LOOP CLRRI MOVA,SBUF ……71C语言程序:#include<reg51.h>//包含特殊功能寄存器库sbitP1_0=P1^0;sbitP1_1=P1^1;voidmain(){unsignedchari;P1_1=1;while(P1_1==1){;}P1_0=1;P1_0=0;SCON=0x10;while(!RI){;}RI=0;i=SBUF;……}72(2)利用方式1实现点对点的双机通信

要实现甲与乙两台单片机点对点的双机通信,线路只须将甲机的TXD与乙机的RXD相连,将甲机的RXD与乙机的TXD相连,地线与地线相连。【例5-6】用汇编语言编程通过串行实现将甲机的片内RAM中30H~3FH单元的内容传送到乙机的片内RAM的40H~4FH单元中。80518051甲机RXDTXDGNDTXDRXDGND

乙机线路连接如图甲、乙两机都选择方式1:8位异步通信方式,最高位用作奇偶校验,波特率为1200bps,甲机发送,乙机接收,因此甲机的串口控制字为40H,乙机的串口控制字为50H。7374(2)利用方式1实现点对点的双机通信

要实现甲与乙两台单片机点对点的双机通信,线路只须将甲机的TXD与乙机的RXD相连,将甲机的RXD与乙机的TXD相连,地线与地线相连。80518051甲机RXDTXDGNDTXDRXDGND

乙机75【例5-15】通信双方采用方式1,即:一帧信息中有1个起始位、8个数据位和1个停止位;波特率为2400bps,单片机时钟振荡频率选用11.0592MHz。T1工作在定时器方式2,经计算可得:TH1=TL1=0F4H,PCON寄存器的SMOD位为0。通信协议:1号机发送时,先发送一个“E1”联络信号,2号机收到后回答一个“E2”应答信号,表示同意接收。当1号机收到应答信号“E2”后,开始发送数据,每发送一个字节数据都要计算“校验和”,假定数据块长度为16个字节,起始地址为40H,一个数据块发送完毕后立即发送“校验和”。2号机接收数据并转存到数据缓冲区,起始地址也为40H,每接收到一个字节数据便计算一次“校验和”;当收完一个数据块后,再接收1号机发来的“校验和”,并将它与2号机求出的校验和进行比较。若两者相等,说明接收正确,2号机回答00H;若两者不相等,说明接收不正确,2号机回答0FFH,请求重发。1号机接到00H后结束发送;若收到答复非零,则重新发送一次数据。76771号机发送程序如下:#include#defineucharunsignedcharucharidatabuf[10];ucharsum;uchari;voidmain(){TMOD=0X20;TH1=TL1=1;TR1=1;PCON=0x00;SCON=0x50;//串行口工作在方式1,允许接收do{SBUF=0Xe1;//发送联络信号“E1”while(TI==0);TI=0;while(RI==0);RI=0;//等待乙机回答}while((SBUF^0XE2)!=0);//乙机未准备好,继续联络do{sum=0;for(i=0;i<10;i++){SBUF=buf[i];sum+=buf[i];//求校验和while(TI==0);TI=0;}SBUF=sum;//发送校验和while(TI==0);TI=0;while(RI==0);RI=0;//等待乙机应答}while(SBUF!=0);//出错则重发}782号机接收程序:#include#defineucharunsignedcharucharidatabuf[10];ucharsum;uchari;voidmain(){TMOD=0X20;TH1=TL1=0XF4;TR1=1;PCON=0x00;SCON=0x50;//串行口工作在方式1,允许接收Do{while(RI==0);RI=0;}while((SBUF^0Xe1)!=0)//判断A机是否发出请求SBUF=0Xe2;//发送应答信号“E2”while(TI==0);TI=0;//等待结束while(1){sum=0;//清校验和for(i=0;i<10;i++){while(RI==0);RI=0;buf[i]=SBUF;//接收数据sum+=buf[i];}while(RI==0);RI=0;if((SBUF^sum)==0)//比较检验和{SBUF=0x00;break;}//校验和相同则发“00”else{SBUF=0xFF;//出错则发“FF”,重新接收while(TI==0);TI=0;}}} MOVC,P MOVA.7,C MOVSBUF,AWAIT:JNBTI,WAIT CLRTI INCR0 DJINZR7,LOOP RET例:通信方式1,波特率由T1的溢出率和电源控制寄存器PCON中的SMOD位决定。则须对定时/计数器T1初始化。设SMOD=0,甲、乙两机的振荡频率为12MHz,由于波特率为1200。定时/计数器T1选择为方式2,则初值为:初值=256-fosc×2SMOD/(12×波特率×32)=256-12000000/(12×1200×32)≈230=E6H根据要求定时/计数器T1的方式控制字为20H。甲机发送程序:TSTART:MOVTMOD,#2

温馨提示

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

评论

0/150

提交评论