Vmt6 单片机内部资源及编程.ppt_第1页
Vmt6 单片机内部资源及编程.ppt_第2页
Vmt6 单片机内部资源及编程.ppt_第3页
Vmt6 单片机内部资源及编程.ppt_第4页
Vmt6 单片机内部资源及编程.ppt_第5页
已阅读5页,还剩187页未读 继续免费阅读

下载本文档

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

文档简介

第6章单片机内部资源及编程,课件制作:高惠芳,中断是一项重要的计算机技术,这一技术在我们的日常生活中也同样存在,请看例子:任务1:学习任务2:接电话如果你是学生,那学习肯定是重点,也就把它当作是(主任务),而接电话呢是(次要任务)。如果你用中断的话,也就是允许中断的话,等到电话响,再去接电话也不迟,可是如果你不用中断的话,要接电话怎么办呢,就是一整天一直守侯在电话旁边,一直在看有没有电话来,这样其实你浪费了大部分不必要的时间,而如果用中断的话,释放出了大部分的时间来学习,就不用守在电话边上了.,6.1.1中断概述,6.1中断系统,任务分解你在看书电话铃响了你在书上做了个记号,走到电话旁你拿起电话和对方通话通话结束,挂上电话,回到书桌旁从做记号的地方继续读书。,你在看书(任务1)电话铃(中断源)响了(中断请求)你听见铃声(中断控制)在书上做了个记号(断点保护),走到电话旁(中断响应)你拿起电话和对方通话(任务2)通话结束,挂上电话,回到书桌旁(中断返回)从作记号的地方继续读书(恢复断点,继续执行主程序)。,中断:cpu在运行程序过程中会出现数据输入、数据输出或特殊情况处理等其它的事情,cpu只能采用停下正在进行的任务去处理另一个任务,这种方法称为中断。,中断技术实质上就是一种资源共享技术,使多项任务共享cpu,单片机的中断服务流程,中断技术的实际应用:,实现cpu与外部设备的速度配合。,实现实时控制。所谓实时控制,就是被控对象可以随时向cpu发出请求,要求及时处理,以确保对象保持在最佳状态。,实现故障的及时处理。借助中断技术可以对单片机系统运行中的某些故障(如断电故障、运算出错等)及时发现,并迅速处理。,实现人机对话。单片机系统运行中需要通过键盘、按钮等来进行人工干预。,6.1.2中断源,中断源:向cpu发出中断请求的来源,3类5个中断源:,1、外部中断源,外部中断是由外部信号引起的,2个中断源,外部中断“0”:中断信号由引脚引入,外部中断“1”:中断信号由引脚引入,外部中断请求有两种信号方式,电平方式,脉冲方式,电平方式的中断请求:低电平有效,单片机在中断请求引入端或上采样到有效的低电平时,就激活外部中断,脉冲方式的中断请求:脉冲的后沿负跳有效,cpu在两个相邻机器周期对中断请求引入端进行的采样中,如前一次为高电平,后一次为低电平,即为有效中断请求,2、定时/计数器中断源,定时/计数器中断:为满足定时或计数的需要而设置的,两个定时中断,定时器/计数器0中断,定时器/计数器1中断,当计数结构发生计数溢出时,以计数溢出信号作为中断请求,去置位一个溢出标志位,作为单片机接受中断请求的标志,3、串行口中断源,是为串行数据传送的需要而设置的,当串行口接收或发送完一组串行数据时,就产生一个中断请求,表6.1中断源及其入口地址,中断服务程序的首地址(入口地址)称为中断向量,6.1.3中断控制,4个控制寄存器,定时器控制寄存器tcon,中断允许控制寄存器ie,中断优先控制寄存器ip,串行口控制寄存器scon,中断控制:提供给用户使用的中断控制手段,1.定时器控制寄存器(tcon),用于保存外部中断请求标志位、定时器的计数溢出标志位和外部中断触发方式的选择,寄存器地址88h,位地址8fh-88h,外中断请求标志位,当采样到外部中断时,由硬件置1,中断响应后由硬件自动清0,外中断请求触发方式控制位,1脉冲触发方式,后沿负跳有效,0电平触发方式,低电平有效,由软件置1或清0,计数溢出标志位,计数溢出时,相应的标志位由硬件置“1”当转向中断服务程序时,由硬件自动清“0”,2.串行口控制寄存器(scon),寄存器地址98h,位地址9fh-98h,与中断有关的控制位共2位,ti串行口发送中断请求标志位,当发送完一帧串行数据后,由硬件置“1”在转向中断服务程序后,用软件清“0”,ri串行口接收中断请求标志位,当接收完一帧串行数据后,由硬件置“1”在转向中断服务程序后,用软件清“0”,串行中断请求由ti和ri的逻辑或得到,无论是发送标志还是接收标志,都会产生串行中断请求,3.中断允许控制寄存器(ie),寄存器地址0a8h,位地址0afh-0a8h,ea中断允许总控制位,ea=,0中断总禁止,禁止所有中断,中断总允许,总允许后中断的禁止或允许由各中断源的中断允许控制位设置,其中与中断有关的控制位共6位:ea:中断允许总控制位ea=0,中断总禁止,禁止所有中断;ea=1,中断总允许,总允许后各个中断源的允许与禁止,还取决于各个中断允许位的状态。ex0和ex1:外部中断允许控制位ex0(或ex1)=0,禁止外部中断(或);ex0(或ex1)=1,允许外部中断(或)。et0和et1:定时器中断允许控制位et0(或et1)=0,禁止定时器0(或定时器1)中断;et0(或et1)=1,允许定时器0(或定时器1)中断。es:串行中断允许控制位es=0,禁止串行(ti或ri)中断;es=1,允许串行(ti或ri)中断,4.中断优先级控制寄存器(ip),寄存器地址0b8h,位地址0bfh-0b8h,其中与中断有关的共5位:px0:外部中断0()优先级设定位;pt0:定时器0(t0)优先级设定位;px1:外部中断1()优先级设定位;pt1:定时器1(t1)优先级设定位;ps:串行中断优先级设定位。,对ip的各个对应位置1或清0决定,设定为0时为低优先级,设定为1时为高优先级。,两级优先级,具有中断服务嵌套的功能,,其中断优先级的控制原则是:,(1)低优先级中断请求不能打断高优先级的中断服务;但高优先级中断请求可以打断低优先级的中断服务,从而实现中断嵌套,(2)如果一个中断请求已被响应,则同级的其它中断服务将被禁止。即同级不能嵌套。,(3)如果同级的多个中断请求同时出现,则按cpu查询次序确定哪个中断请求被响应。,外部中断0,定时中断0,外部中断1,定时中断1,串行中断,除了中断优先级控制寄存器外,还有2个不可寻址的优先级状态触发器。,一个用于指示某一高优先级中断正在进行服务,从而屏蔽其它高优先级中断;,另一个用于指示某一低优先级中断正在进行服务,从而屏蔽其它低优先级中断,但不能屏蔽高优先级的中断。,reti指令除了使程序返回到断点之外,还使“优先级生效触发器”复位。,如要开放外部中断0,使用字节操作指令为:movie,#81h,使用位操作指令为:setbeasetbex0,10000001,6.1.4中断响应过程,1.中断采样,只有外部中断中断请求才有采样问题,采样是对芯片引脚和在每个机器周期的s5p2进行的,根据采样结果来设置tcon寄存器中ie0和ie1的状态,中断响应过程:从中断请求发生到中断被响应,再转向执行中断服务程序去完成中断所要求的操作。,对于电平方式的外部中断请求:,若采样为高电平,无中断,ie0=0,ie1=0,若采样为低电平,有中断,ie0=1,ie1=1,对脉冲方式的外中断:,若在两个相邻机器周期采样到先高电平后低电平,则有中断,ie0=1,或ie1=1否则ie0=0,或ie1=0,2.中断标志位的查询,单片机把所有中断的中断请求标志位都汇集到tcon和scon寄存器中。,因为中断的发生是随机的,无法事先预知,所以必须主动检测,这一过程称为中断查询。,中断查询:,由cpu测试tcon和scon中各标志位的状态,以确定有没有中断请求发生以及是哪一个中断请求,单片机在每一个机器周期的最后一个状态(s6)按优先级顺序对中断请求标志位进行查询,即先查询高级中断后再查询低级中断,同级中断按,外部中断0,定时中断0,外部中断1,定时中断1,串行中断,的顺序查询,如果查询到标志位为“1”,表明有中断请求发生,接着就从相邻的下一个机器周期的s1状态开始进行中断响应,3.中断响应,中断响应是对中断源提出的中断请求的接受,中断响应的主要内容:由硬件自动生成一条长调用指令lcalladdr16addr16是程序存储器中断区中相应中断的入口地址,0003h-000ah外部中断0中断地址区,000bh-0012h定时器/计数器0中断地址区,0013h-001ah外部中断1中断地址区,001bh-0022h定时器/计数器1中断地址区,0023h-002ah串行中断地址区,例如对于外部中断0的响应,产生的长调用指令为:lcall0003h,cpu执行lcall指令,将pc的内容压入堆栈以保护断点,将中断入口地址装入pc,使程序转向相应的中断区入口地址,各中断区只有8个单元,通常在各中断区入口地址处放置一条无条件转移指令,使程序执行转向在其它地址存放的中断服务程序,中断响应是有条件的,当存在下列情况之一时,中断响应被封锁:,cpu正处在为一个同级或高级的中断服务中。因为当一个一个中断被响应时,要把对应的优先级触发器置位,封锁了低级和同级的中断。,查询中断请求的机器周期不是当前指令的最后一个机器周期。此限制的目的在于使当前指令执行完毕后,才能进行中断响应,以确保当前指令的完整执行。,当前指令是返回指令(ret,reti)或访问ie、ip的指令。因为mcs-51系统规定:在执行完这些指令之后,还应再继续执行一条,然后才能响应中断。,中断查询的结果不作记忆,4.中断响应时间,中断响应时间:从外部中断请求有效(标志位置“1”)到转向中断区入口地址所需的机器周期数,单片机的最短响应时间为3个机器周期,中断请求标志位查询占一个机器周期,而这个机器周期又恰好是指令的最后一个机器周期,这个机器周期后,中断即被响应,产生lcall指令。执行这条长调用指令需2个机器周期。共计3个机器周期。,单片机的最长响应时间为8个机器周期,中断标志查询时,刚好是开始执行ret、reti或访问ie、ip的指令,则需把当前指令执行完再继续执行一条后,才能进行中断响应。,执行ret、reti或访问ie、ip的指令最长需2个机器周期,如果接着再执行的指令恰好是mul或div指令,则又需4个机器周期。再加上执行长调用指令lcall所需的2个机器周期,从而形成了8个机器周期的最长响应时间。,一般的中断响应时间都是在大于3个机器周期而小于8个机器周期的两种极端情况之间。,如果出现有同级或高级中断正在响应或服务中需等待的时候,则响应时间无法计算,一般无需考虑中断响应时间,只有在精确定时的应用场合,才需要考虑中断响应时间,6.1.5中断请求的撤除,中断响应后,tcon或scon中的中断请求标志应及时撤除(中断请求标志位清0),否则就意味着中断请求仍然存在,形成中断的重复响应。,1.定时器/计数器溢出中断的撤除,定时器/计数器的溢出中断响应后,硬件自动把标志位tf0(或tf1)清0。,2.外部中断请求的撤除,外部中断的撤除包括两项内容:中断标志位的清0和外中断请求信号的撤除。,(1)脉冲方式外部中断请求的撤除,外部中断请求标志位ie0(或ie1)的清0同样是在中断响应后由硬件电路自动完成的;而外中断请求信号由于是脉冲信号,中断后也就自动撤除了。,(2)电平方式外部中断请求的撤除,外部中断请求标志位ie0(或ie1)的清0也是在中断响应后由硬件电路自动完成的;,但外部中断请求信号的低电平可能继续存在,需要在中断响应后把中断请求输入端从低电平强制改成高电平,setbp1.0;p1.0=1clrp1.0;p1.0=0,3.串行中断的撤除,串行中断标志位ti和ri在中断响应后,片内硬件不能自动清除。因为这两个中断标志位对应同一个中断入口地址(0023h),中断响应后还须查询这两个标志位的状态,以判定是接收中断,还是发送中断,然后方可撤除。因此,串行中断请求的撤除应使用软件的方法,在中断服务程序中将其清0。,6.1.6中断程序设计,单片机中断系统的控制和管理:由用户对与中断有关的特殊功能寄存器tcon、scon、ie和ip进行编程实现。,中断系统的初始化:,对这几个寄存器的有关位进行预置,cpu开中断或关中断;某中断源中断请求的允许或禁止;设定所用中断的中断优先级;若为外部中断,则应规定是电平中断触发方式还是脉冲中断触发方式。,例6.1试写出为低电平触发的中断系统初始化程序。,解:(1)采样位操作指令setbea;cpu开中断setbex1;开中断setbpx1;令为高优先级clrit1;令为电平触发方式(2)采样字节操作指令movie,#84h;cpu开中断和开中断orlip,#04h;令为高优先级anltcon,#0fbh;令为电平触发方式,外部中断0中断初始化的内容:,org0000hajmpmain;系统复位后转向主程序org0003hajmpexint0;转向外部中断0服务程序main:movtcon,#01h;脉冲触发方式movie,#81h;中断开放,外中断0允许movip,#01h;外中断0为高优先级,其余为低优先级movsp,#03h;设置堆栈exint0:;外部中断0服务程序,与中断有关的控制寄存器:可以使用寄存器名称,也可以使用寄存器地址,对控制寄存器的设定还可以使用位操作指令,如:设置外中断0为高优先级,其余为低优先级的位操作指令为:,movip,#00h;清中断优先级寄存器setbpx0;外中断0为高优先级中断,主程序空闲,等待中断请求时,可设置there:sjmpthere,1.汇编语言中断程序设计,中断系统的设计过程,中断初始化,在主程序中完成;子程序调用;在中断入口地址处安排一条跳转指令,跳转至中断服务子程序入口;中断服务子程序开始保护现场,保护与主程序或其它中断系统共享的资源,如a,psw,dptr,rn等,如果没有共享资源,可以不必保护;编制中断服务子程序功能主体;恢复现场;中断返回。,例6.2在图6.6中,p1.0p1.3接有4个开关,p1.4p1.7接有4个发光二极管,消抖电路用于产生中断请求信号,当消抖电路的开关来回拨动一次将产生一个下跳变信号,向cpu申请中断,要求:初时发光二极管全黑,每中断一次,p1.0p1.3所接的开关状态反映到发光二极管上,且要求开关合上时对应发光二极管亮。,解:编程如下:org0000hajmpmainorg0003h;外部中断0入口ajmpser_int0;转中断服务程序org0100h;主程序main:movp1,#0fh;熄灭发光二极管且对开关输入端先输出1setbit0;脉冲触发方式setbex0;允许中断setbea;总中断允许ajmp$;等待中断ser_int0:movp1,#0fh;熄灭发光二极管且对开关输入端先输出1mova,p1;输入开关状态cpla;状态取反anla,#0fh;屏蔽a的高半字节swapa;a高低半字节交换movp1,a;开关状态输出reti;中断返回,2.c语言中断程序设计,中断服务函数的一般形式为:函数类型函数名(形式参数表)interruptnusingm,n通常取以下值:0:外部中断01:定时器/计数器0溢出中断2:外部中断13:定时器/计数器1溢出中断4:串行口发送与接收中断,usingm:选择函数使用的工作寄存器组,m的取值范围为03。,例6.3用c语言对例6.2的任务进行编程。,解:编程如下:#includevoidint0()interrupt0/*中断函数*/p1=0 x0f;/*熄灭发光二极管且对开关输入端先输出1*/p1=4;/*读入开关状态,并左移四位,使开关反映在发光二极管上*/p1;/*对p1口内容取反*/main()/*主函数ea=1;/*开中断总开关*/ex0=1;/*允许中断*/it0=1;/*负跳沿产生中断*/while(1);/*等待中断*/,6.1.7外部中断源的扩展,1.利用定时器扩展外部中断源,置定时器/计数器为工作方式2,即自动装载式8位计数,以便在一次中断响应后,自动为下一次中断请求作好准备;高8位和低8位计数器(th和tl)初值均预置为0ffh;将扩展的外部中断请求信号接计数输入端t0或t1;把扩展的外部中断服务程序按所用的定时器/计数器中断入口地址存放。,2.利用硬件申请软件查询的方式扩展外部中断源,利用单片机的外部中断输入端(或),使用集电极开路门(oc门)“线或”的关系连接多个外部中断,同时利用输入端口线作为各中断源的识别线。,用oc门“线或”实现,中断源查询流程图,org0003hljmpser_int0ser_int0:pushpsw;现场保护pushajbp1.0,zhd1;转向中断服务程序1jbp1.1,zhd2;转向中断服务程序2jbp1.2,zhd3;转向中断服务程序3jbp1.3,zhd4;转向中断服务程序4exit:popa;现场恢复poppswretizhd1:;中断服务程序1ajmpexitzhd2:;中断服务程序2ajmpexitzhd3:;中断服务程序3ajmpexitzhd4:;中断服务程序4ajmpexit,使用编码器芯片74ls148,可以实现8路中断,6.2定时器/计数器,2个可编程的16位定时器/计数器:,定时器/计数器0:,定时器/计数器1:,由th0(地址8ch)和tl0(地址8ah)2个8位计数器组成,由th1(地址8dh)和tl1(地址8bh)2个8位计数器组成,6.2.1定时/计数器的结构及工作原理,1.定时/计数器的结构,2.定时/计数器的工作原理,定时器/计数器即可作为定时器使用,也可作为计数器使用,作定时器使用时计数脉冲来自于内部时钟振荡器,作计数器使用时计数脉冲来自于外部引脚。,(1)作定时器使用,输入脉冲是由内部时钟振荡器的输出经12分频后送来的,所以定时器也可看作是对机器周期的计数器。,每来一个机器周期,计数器加1,直到计数器满,再来一个机器周期,定时器全部回零,这就是溢出。,如果单片机采用12mhz晶振,则计数频率为1mhz,即每微秒计数器加1,如果单片机采用6mhz晶振,则计数频率为0.5mhz,即每2微秒计数器加1,在机器周期一定的情况下,定时时间与定时器预先装入的初值有关。初值越大,定时时间越短;初值越小,定时时间越长。最长的定时时间为216(65536)个机器周期(初值为0),最短的定时时间为1个机器周期(初值为216-1(65535)。,当晶振为12mhz时,最长定时时间为65.536ms,最短定时时间为1s;当晶振为6mhz时,最长定时时间为131.072ms,最短定时时间为2s。,(2)作计数器使用,计数是指对外部事件(输入脉冲)进行计数,两个计数器的计数输入端:,输入端负跳变有效,计数器加1(对加法计数),单片机在每个机器周期的s5p2拍节对计数脉冲输入引脚进行采样,采样到负跳变时,在下一个机器周期的s3p1进行计数。采样机器周期需要2个机器周期,所以计数脉冲的频率不能高于震荡脉冲频率的1/24。,当晶振为12mhz时,最高计数频率不超过0.5mhz,即计数脉冲的周期要大于2s。当计数器满后,再来一个机器周期,计数器全部回零,这就是溢出。,计数长度与初值有关:初值越大,计数长度越小:如初值为216-1,则来一个脉冲计数器就溢出;初值越小,计数长度越大:如初值为0,则来216个脉冲计数器才溢出。,6.2.2定时/计数器的控制,定时器控制寄存器工作方式控制寄存器中断允许控制寄存器,1、定时/计数器控制寄存器(tcon),tcon寄存器既参与中断控制又参与定时控制,定时/计数器溢出标志位,当定时/计数器计数溢出(计满)时,该位置“1”,使用查询方式时,此位作状态位供查询,查询有效后,应以软件方法及时将该位清“0”,使用中断方式时,此位作中断标志位,转向中断服务程序时由硬件自动清“0”,定时器运行控制位,0停止定时器/计数器工作,1启动定时器/计数器工作,该位根据需要由软件置1或清0,2、工作方式控制寄存器(tmod),tmod寄存器是一个专用寄存器,用于设定2个定时器/计数器的工作方式。但该寄存器不能位寻址,只能用字节传送指令设置其内容,4位同时定义,不能位寻址,gate:门控位gate=0时,当tr0或tr1设置为1,则启动定时器/计数器工作;gate=1时,当tr0或tr1设置为1,同时外部中断引脚或也为高电平时,才能启动定时器/计数器工作。c/:计数方式或定时方式选择位c/=0,选择定时工作方式;c/=1,选择计数工作方式。m1和m0:工作方式选择位定时器/计数器有4种工作方式,由m1m0进行设置,表6.2定时器/计数器工作方式选择表,6.2.3定时/计数器的工作方式,方式0是13位计数结构的工作方式,其计数器由th0全部8位和tl0的低5位构成,tl0的高3位弃之不用。,1.工作方式0,启停控制,两种启停控制方法:一种是纯软件方法;另一种是软件和硬件相结合的方法。,由门控位gate的状态选择控制方法,当gate=0时,为纯软件启停控制,0,1,1,tr0的状态控制计数脉冲的通断,tr0由软件编程控制,或门封锁,引脚p3.2信号无效,p3.2,当gate=1时,为软件和硬件相结合的启停控制方式,1,0,计数脉冲的接通与断开决定于tr0和的与关系,1,当tr0=1时,计数脉冲的接通与断开由p3.2控制,为1时,计数器工作,为0时,计数器停止工作,可用于测量外部信号的脉冲宽度,定时和计数范围,当为定时工作方式时,定时时间的计算公式为,单位为s,或,定时时间=(213-计数器初值)晶振周期12,定时时间=(213-计数器初值)机器周期,当c/=0时,控制开关接通振荡器12分频输出端,t0(t1)对机器周期计数,可作为定时器使用。定时时间的计算公式为,如晶振频率为12mhz,则最大定时时间为:,最小定时时间为:,(213-0)(1/12)10-612=8192s,(213-(213-1)(1/12)10-612=1s,2.工作方式1,方式1是16位计数结构的工作方式,计数器由th0全部8位和tl0全部8位构成。,其逻辑电路和工作情况与方式0完全相同,不同的只是组成计数器的位数,方式1的计数值的范围是:165536(216),方式1的定时时间计算公式为:(216-计数初值)晶振周期12,或(216-计数初值)机器周期,方式1的定时时间计算公式为:(216-计数初值)晶振周期12,或(216-计数初值)机器周期,如晶振频率为6mhz,则最小定时时间为:216-(216-1)1/610-612=210-6=2s,方式1的定时时间计算公式为:(216-计数初值)晶振周期12,或(216-计数初值)机器周期,最长定时时间为:(216-0)1/610-612=655362s=131.07ms,3.定时工作方式2,工作方式0和工作方式1的特点:,计数溢出后,计数器为全“0”,因此循环定时或循环计数应用时存在反复设置计数初值的问题。这不但影响定时精度,而且也给程序设计带来麻烦。,方式2就是针对此问题而设置的,它具有自动重新加载功能,即自动加载计数初值。,把16位计数器分为两部分,tl:作计数器,th:作预置寄存器,初始化时把计数初值分别装入tl和th中,当计数溢出时,由th以硬件方法自动给tl重新加载,1、电路逻辑结构,初始化时,8位计数器初值同时装入tl0和th0中。,当tl0计数溢出时,置位tf0,同时把保存在th0中的计数初值自动加载tl0,然后tl0重新计数。如此重复不止,优点:省去了重装指令,也有利于提高定时精度,缺点:8位计数结构,计数值有限,最大只能到255,适用于循环定时或循环计数应用。例如用于产生固定脉宽的脉冲,还可以作串行数据通信的波特率发送器,当c/=0时,tl0(tl1)对机器周期计数,可作为定时器使用。定时时间的计算公式为定时时间=(28-计数器初值)机器周期或定时时间=(28-计数器初值)晶振周期12若晶振频率为12mhz,则最长定时时间为(28-0)(1/12)10-612=256s最短定时时间为(28-(28-1)(1/12)10-612=1s当c/=1时,tl0(tl1)对外部计数脉冲计数,作为计数器使用,最大计数值为28=256。,4.工作方式3,前3种工作方式下,两个定时器/计数器的设置和使用是完全相同的,在工作方式3下,两个定时器/计数器的设置和使用是不同的,(1)工作方式3下的定时器/计数器0,定时器/计数器0被拆成两个独立的8位计数器tl0和th0,这两个计数器的使用完全不同,tl0即可用于计数,又可用于定时,与t0相关的各个控制位和引脚信号均由它使用。其功能和操作与工作方式0或工作方式1完全相同,而且逻辑电路结构也及其类似,th0只能作简单的定时器使用,而且由于寄存器tcon的定时器0的控制位已被tl0独占,因此只能借用定时器1的控制位tr1和tf1为其服务。即用计数溢出置位tf1,而定时的启停则受tr1的状态控制,故在方式3下,t0可以分解为2个8位定时器或1个8位定时器和1个8位计数器,在方式3时,若tl0发生中断,中断入口地址为000bh;若th0发生中断,中断入口地址为001bh。,(2)工作方式3下的定时器/计数器1,如果t0已经工作在工作方式3,则t1只能工作在方式0、方式1或方式2下,且只能作串行口波特率发生器使用,不能使用查询或中断方式。因为它的运行控制位tr1及计数溢出标志位tf1已被t0借用。,这时,t1通常是作为串行口的波特率发生器使用。因为已没有计数溢出标志位tf1可供使用,因此只能把计数溢出直接送到串行口。作为波特率发生器使用时,只需设置好工作方式,便可自动运行。若要停止工作,只需向工作方式选择寄存器tmod送入一个能把它设置为方式3的控制字就可以了。因为t1不能在方式3下使用,如果硬把它设置为方式3,就会停止工作。,6.2.4定时器/计数器的初始化,1.定时器/计数器的初始化步骤,初始化,主要是对tcon和tmod编程,计算和装载定时器/计数器的计数初值。,初始化步骤如下:,确定定时器/计数器的工作方式,确定方式控制字,写入方式控制字寄存器tmod;根据要求计算定时器/计数器的初值,并写入th0、tl0或th1、tl1;如用中断方式编程,须对中断允许寄存器ie编程,必要时也须对中断优先级寄存器ip编程;设置定时器控制器中的tr1或tr0,启动定时器/计数器;定时/计数时间到,如用中断方式编程,则执行中断服务程序;如用查询方式编程,则查询溢出标志,当溢出标志等于1,则转入相应程序。,2定时/计数器初值的计算,(1)计数器初值的计算,m为计数器的位数,c为要求的计数值,对于方式0,m=13,计数器的最大计数值为213=8192;对于方式1,m=16,计数器的最大计数值为216=65536;对于方式2,m=8,计数器的最大计数值为28=256;方式3同方式2。,例如,设t1工作在计数方式2,求计数10个脉冲的计数初值。得x=2810=246=0f6h,(2)定时器初值的计算,定时时间为,t=(2m-计数初值x)机器周期,则计数初值为,x=2m-t/机器周期,或,x=2m-(fosc/12)t,若=12mhz,定时时间为1ms,使用t0工作于方式0,则有x=213-(12/12)1000=7192=1c18h=1110000011000b其中高8位放入th0,即初值th0=0e0h,低5位放入tl1,即初值tl0=18h。同样,若=12mhz,定时时间为1ms,使用t0工作于方式1,则有x=216-(12/12)1000=64536=0fc18h其中高8位放入th0,即初值th0=0fch,低8位放入tl1,即初值tl0=18h。,x=2m-(fosc/12)t,6.2.5定时器/计数器应用举例,1.定时/计数器作定时器使用,例6.4设单片机的fosc=12mhz,要求用定时器/计数器t0以方式1在p1.0脚上输出周期为4ms的方波。,解:p1.0每2ms取反一次即可。fosc=12mhz,t0工作于方式1,方式控制字设定为00000001b=01h最大定时值为216机器周期=65536s=65.536ms,满足2ms定时要求,初值x=216-(12/12)2000=65536-2000=63536=0f830h。,1)采用中断方式编程(1)汇编程序:org0000hljmpmainorg000bhajmpser_t0org0100hmain:movtmod,#01h;写入方式控制字movth0,#0f8h;写入计数初值movtl0,#30hsetbea;开总中断setbet0;开t0中断setbtr0;启动t0sjmp$;等待中断sert0:movth0,#0f8h;重新写入计数初值movtl0,#30hcplp1.0;输出取反retiend,(2)c语言程序#includesbitp1_0=p10;voidmain(void)tmod=0 x01;/*定时器/计数器0工作在定时器方式1*/p1_0=0;/*p1.0输出0*/th0=(65536-2000)/256;/*预置计数初值*/tl0=(65536-2000)%256;ea=1;/*cpu开中断*/et0=1;/*定时器/计数器0开中断*/tr0=1;/*启动定时器/计数器0*/dowhile(1);/*等待中断*/voidtimer0(void)interrupt1using1/*定时器/计数器0中断服务程序入口*/th0=(65536-2000)/256;/*计数初值重装载*/tl0=(65536-2000)%256;p1_0=!p1_0;/*p1.0取反*/,2)采用查询方式编程(1)汇编程序:org0000hljmpmainorg0100hmain:movtmod,#01h;写入方式控制字movth0,#0f8h;写入计数初值movtl0,#30hsetbtr0;启动t0定时loop:jbctf0,next;查询定时时间到否?sjmploopnext:movth0,#0f8h;重新写入计数初值movtl0,#30hcplp1.0;输出取反sjmploop;重复循环end,(2)c语言程序:#includesbitp1_0=p10;voidmain(void)tmod=0 x01;/*定时器/计数器0工作在定时器方式1*/tr0=1;/*启动定时器/计数器0*/for(;)th0=(65536-2000)/256;/*预置计数初值*/tl0=(65536-2000)%256;dowhile(!tf0);/*查询等待tf0置位*/p1_0=!p1_0/*定时时间到p1.0反相*/tf0=0/*软件清tf0*/,2.定时器/计数器作长时间定时器使用,用定时器/计数器产生的定时时间是有限的,如晶振为6mhz时,一个定时器最长的定时时间为,t=216(1/6)12=131.072ms,如晶振为12mhz时,一个定时器最长的定时时间为,t=216(1/12)12=65.536ms,长时间的定时必须采用一定的方法进行定时时间的扩展,扩展的方法是利用定时与中断相结合。,如:200ms的定时可以采用t1产生500s的定时,每次溢出后就计数一次,则计数400次就可以得到,计数400次可以采用的两种方法:,方法1:采用软件计数的方法实现,每次溢出后,用于计数的寄存器加1;方法2:t1计数回0溢出时,使p1.1输出一个负脉冲,再把p1.1接到t0/p3.4引脚用以计数。,例6.5采用6mhz晶振,使用定时器/计数器1在p1.0脚上输出周期为100ms,占空比为30%的矩形脉冲,以工作方式2编程实现。,解:对于6mhz晶振,使用工作方式2,最大定时时间为,(28-0)(1/6)10-612=512s,取500s定时,则周期100ms需要中断200次,占空比为30%,高电平需要60次中断。500s定时,初值为:,28-(6/12)500=6=06h,00100000,中断服务程序流程图,(1)汇编程序:org0000hljmpmainorg001bhajmpser_t1org0100hmain:movtmod,#20h;写入方式控制字movth1,#06h;写入计数初值movtl1,#06hmovr7,#00h;中断次数初值setbp1.0setbea;开总中断setbet1;开t1中断setbtr1;启动t1sjmp$;等待中断ser_t1:incr7;中断次数加1cjner7,#60,loop1clrp1.0;中断次数到60次即高电平时间到p1.0输出0ajmplooploop1:cjner7,#200,loopsetbp1.0;中断次数到200次即周期到p1.0输出1movr7,#00hloop:retiend,(2)c语言程序:#include#defineucharunsignedcharuchartime=0;ucharperiod=200;ucharhigh=60sbitp1_0=p10main()tmod=0 x20;/*定时器/计数器1工作于方式2*/th1=0 x06;/*预置计数初值*/tl1=0 x06;ea=1;/*开cpu中断*/et1=1;/*开定时器/计数器1中断*/tr1=1;/*启动定时器/计数器1*/p1_0=1;while(1)timer1()interrupt3using0/*定时器/计数器1中断服务程序*/if(+time=high)p1_0=0;/*高电平时间到变低*/elseif(time=period)/*周期时间到变高*/time=0;p1_0=1;,3.定时器/计数器作计数器使用,例6.6系统要求用定时器t0对由t0/p3.4管脚输入的脉冲进行计数,每计满200个脉冲,对累加器a的内容加1。,解:可用t0设置为方式2计数,计数初值为:,28-200=56=38h,tmod的控制字为00000110=06h,以中断方式编程,00000110,汇编语言程序:org0000hljmpmainorg000bhajmpser_t0org0100hmain:movtmod,#06h;写入方式控制字movth0,#38h;写入计数初值movtl0,#38hsetbea;开总中断setbet0;开t0中断setbtr0;启动t0mova,#00hsjmp$;等待中断ser_t0:inca;累加器内容加1loop:retiend,c语言程序:#includeunsignedcharidata*p;voidmain(void)tmod=0 x06;/*定时器/计数器0工作在计数器方式2*/th0=256-200;/*预置计数初值*/tl0=256-200;p=0 xe0;/*p指针赋值,指向idata区的e0单元,即累加器a的地址*/*p=0;/*累加器a的初值赋为0*/ea=1;/*cpu开中断*/et0=1;/*定时器/计数器0开中断*/tr0=1;/*启动定时器/计数器0*/dowhile(1);/*等待中断*/voidtimer0(void)interrupt1using1/*定时器/计数器0中断服务程序入口*/*p=*p+1;/*累加器a的内容加1*/,4.方式3的编程,例6.7设单片机的晶振频率为6mhz,定时器/计数器0工作在方式3,使tl0和th0分别产生100s和200s的定时中断,并在p1.6和p1.7口产生周期为200s和400s的方波。此时定时器/计数器1作串行波特率发生器使用,并设工作在方式2,时间常数设定为0f3h,试编制程序。,解:tl0和th0作为两个独立的定时器使用,计算tl0和th0的计数初值:,28-(6/12)100=256-50=206=0ceh28-(6/12)200=256-100=156=9ch,程序如下:org0000hstart:ljmpmain;转主程序org000bh;转tl0中断服务程序ljmpser_tl0org001bh;转th0中断服务程序ljmpser_th0org0100hmain:movsp,#30h;设置堆栈movtcon,#00hmovtl0,#0ceh;计数初值movth0,#9chmovth1,#0f3hmovtl1,#0f3hmovpcon,#80h;smod=1movtmod,#23h;t0方式3,t1方式2setbea;中断总允许setbet0;tl0中断允许setbet1;th0中断允许setbtr0;启动tl0setbtr1;启动th0sjmp$;等待中断org0200h;tl0中断服务程序ser_tl0:movtl0,#0ceh;重置初值cplp1.6;输出取反retiorg0300h;th0中断服务程序ser_th0:movth0,#9ch;重置初值cplp1.7;输出取反retiend,c语言程序:#includesbitp1_6=p16;sbitp1_7=p17;voidmain(void)tcon=0 x00pcon=0 x80/*smod=1*/tmod=0 x23;/*t0方式3,t1方式2*/tl0=256-50;/*预置计数初值*/th0=256-100;th1=0 xf3;tl1=0 xf3;ea=1;/*中断总允许*/et0=1;/*tl0开中断*/et1=1;/*th0开中断*/tr0=1;/*启动tl0*/tr1=1;/*启动th0*/dowhile(1);/*等待中断*/voidtimerl0(void)interrupt1using1/*tl0中断服务程序入口*/tl0=256-50;/*重置初值*/p1_6=!p1_6/*输出取反*/voidtimerh0(void)interrupt3using1/*th0中断服务程序入口*/tl0=256-100;/*重置初值*/p1_7=!p1_7/*输出取反*/,5.门控位gate位的应用,门控位gate=1,且运行控制位tr0(tr1)=1时,则允许由外部输入的电平控制其启动和运行。利用这个特性,可以测出外部输入脉冲的宽度。,例6.8利用定时器/计数器t0的门控位gate,测量管脚上出现的脉冲宽度,并将结果(机器周期数)存入内部ram的40h和41h单元中。,解:外部脉冲由管脚输入,可设t0工作于定时器方式1,计数初值为0,当输入高电平时对t0计数,当高电平结束时,计数值乘上机器周期数就是脉冲宽度。工作方式控制字tmod=00001001b=09h,计数初值th1=00、tl0=00h。设定gate=1,当tr1=1时,由/p3.2引脚外部脉冲上升沿启动t0开始工作,加1计数器开始对机器周期计数,当/p3.2引脚变为低电平时,停止计数,这时读出th0、tl0的值,该计数器值即为被测信号的脉冲宽度对应的机器周期数。程序如下:,汇编语言程序:org0000hljmpmainorg0100hmain:movtmod,#09h;t0定时,方式1,gate=1movth0,#00h;置th0计数初值movtl0,#00h;置tl0计数初值wait:jbp3.2wait;等待/p3.2引脚变为低电平setbtr0;预启动t0wait1:jnbp3.2,wait1;等待/p3.2引脚变为高电平、启动计数wait2:jbp3.2,wait2;等待/p3.2引脚再变为低电平clrtr0;停止计数mov41h,th1;读取计数值,存入指定的单元mov40h,tl1sjmp$end,c语言程序:#includeunsignedchardata*p;voidmain(void)tmod=0 x09;/*t0工作在定时器方式1,gate=1*/th0=0;tl0=0;dowhile(p3.2);/*等待/p3.2引脚变为低电平*/tr0=1;/*启动定时器/计数器0*/dowhile(!p3.2);/*等待引脚变为高电平、启动计数*/dowhile(p3.2);/*等待引脚再变为低电平*/tr0=0;/*停止计数*/p=0 x40;*p=tl0;p=p+1;*p=th0;,本节主要介绍串行通信概念及51系列单片机的串行口问题,将具体介绍以下内容:,计算机串行通信基础-基本概念、标准接口。,51单片机串行口-串行口结构、串行口的控制寄存器、串行口的工作方式、应用举例。,6.3串行通信口,6.3.1数据通信概述,随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要。通信的目的:实现计算机与外部设备或计算机与计算机之间的信息交换。通信的方式:并行通信和串行通信两种方式。ps:在多微机系统以及现代测控系统中信息的交换多采用串行通信方式。,一、数据通信方式:,计算机通信是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换。可以分为两大类:并行通信与串行通信。1、并行通信通常是将数据字节的各位用多条数据线同时进行传送。,优点:控制简单、传输速度快;缺点:由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。,优点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备;缺点:数据的传送控制比并行通信复杂。,2、串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送。,二、异步通信与同步通信1、异步通信异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。,异步串行通信的帧格式:,异步通信的特点:异步串行通信是以字符为单位的间歇传输形式。传送时按字符进行包装(在数据位之外要增添起始位、奇偶校验位、停止位)。不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加23位用于起止位,各帧之间还有间隔,因此传输效率不高。,*五、串行通信的错误校验1、奇偶校验在发送数据时,数据位尾随的1位为奇偶校验位(1或0)。奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错。2、代码和校验代码和校验是发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,相符则无差错,否则即认为传送过程中出现了差错。3、循环冗余校验这种校验是通过某种数学运算实现有效信息与校验位之间的循环校验,常用于对磁盘信息的传输、存储区的完整性校验等。这种校验方法纠错能力强,广泛应用于同步通信中。,串行通信的传输速率与传输距离1、传输速率传输速率是用来说明数据传送的快慢。在串行通信中,用波特率来表示数据传送的快慢。波特率是指串行通信中,单位时间传送的二进制位数,单位为bps。例:如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8

温馨提示

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

评论

0/150

提交评论