资源描述
8051单片机语言入门基础第七章 单片机内资源编程7.1外部中断7.1.1中断的概述中断是处理器(一般是我们常说的CPU)处理外部突发事件的一个重要技术。它能使处理器在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又立即返回断点,继续进行处理器原来的工作。引起中断的原因或者说发出中断请求的来源叫做中断源。根据中断源的不同,可以把中断分为硬件中断和软件中断两大类,而硬件中断又可以分为外部中断和内部中断两类。对于单片机来说,中断是单片机的一个重要功能之一,是学习单片机必须掌握的一个知识点。 51单片机有五个中断源,即有五种情况发生时单片机会产生中断。为了助于大家理解中断这个概念,我们举个生活中的例子。你烧上一壶水,然后去洗衣服,洗衣过程中忽然听到水开了的壶哨声,你要先停下洗衣服的动作去关火,然后把水放在暖壶中,灌完开水后还要接着去洗衣服。这个停下一件事去干另一件事的过程就是一次中断的发生过程,其流程图如图7-2所示。因为CPU在一个时间内只能处理一件事,对于单片机来讲, CPU在执行A时间时,应中断源要求(中断发生)CPU停止当前工作(中断响应)去执行B事件(中断服务),待B执行完后接着返回执行A事件(中断返回)这一过程称为中断,其流程图如图7-1所示。图7-1单片机中断过程 图7-2生活中的中断事例 再回来看前面讲的生活事例,与单片机中断结合分析,你的主任务是洗衣服,水开报警这是一个中断请求,这一时刻相当于断点处,你响应中断去关火,然后将开水灌入暖水瓶中,这一动作实际上就是处理中断程序,灌完开水后再回去继续洗衣服,相当于处理完中断程序后再返回主程序继续执行主程序。这里需要注意的是,水开是随时都有可能的,但是无论什么时候开,只要一开你将立即去处理它,处理完后再回来继续接着洗刚才那件衣服。单片机在执行程序时,中断也随时有可能发生,但无论何时发生,只要一旦发生,单片机将立即暂停当前程序,赶去处理中断程序,处理完中断程序后再返回刚才暂停处接着执行原来的程序。单片机在执行程序时其程序流程图如图7-3 图7-3单片机中断程序流程图引起CPU中断的根源,称为中断源,中断源向CPU提出中断请求,CPU暂时中断原来的事务A,转去处理事件B,对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。中断的开启与关闭、设置启用哪一个中断等都是由单片机内部的一些特殊功能寄存器来决定的,在以前的学习中我们仅对单片机内部的特殊功能寄存器I/O口寄存器设置过,从下一节起我们将会设置单片机内部更多的特殊功能寄存器。与中断有关的知识点还有一个叫中断嵌套,意思是说:如果单片机正在处理一个中断程序,此时,又有另一个中断现象发生,单片机将会停止当前的中断程序,而转去执行新的中断程序,新中断程序处理完毕后再回到刚才停止的中断程序处继续执行,执行完这个中断后再返回主程序继续执行主程序,流程图如图7-4所示 图7-4 单片机中断嵌套当涉及中断时,还有一个很重要的关键词中断优先级。假如你在洗衣服的时候,突然水开了,同时电话也响起了,接下来你只能去处理一件事,那你该处理哪件事呢?你将会根据自己的实际情况来选择其中一件更重要的事先处理,在这里,你认为更重要的事就是优先级较高的事情。单片机在执行程序时同样也会遇到类似的状况,即同一时刻发生了两个中断,那么单片机该先执行哪个中断呢?这取决于单片机内部的一个特殊功能寄存器中断优先级寄存器的设置情况,通过设置中断优先级寄存器,我们可以告诉单片机,当两个中断同时出现时先执行哪个中断程序。若没有人为操作优先级寄存器,单片机会按照默认的1套优先级自动处理,我们在具体使用时详细讲解。7.1.2 中断的配置工欲善其事,必先利其器。单片机(CPU)要完成中断必须有些硬件,我们买电脑时经常会问“这电脑的配置怎么样?”这里我们对单片机处理中断的功能引入了“中断配置”的概念。当涉及中断时,还有一个很重要的关键词中断优先级。假如你在洗衣服的时候,突然水开了,同时电话也响起了,接下来你只能去处理一件事,那你该处理哪件事呢?你将会根据自己的实际情况来选择其中一件更重要的事先处理,在这里,你认为更重要的事就是优先级较高的事情。单片机在执行程序时同样也会遇到类似的状况,即同一时刻发生了两个中断,那么单片机该先执行哪个中断呢?这取决于单片机内部的一个特殊功能寄存器中断优先级寄存器的设置情况,通过设置中断优先级寄存器,我们可以告诉单片机,当两个中断同时出现时先执行哪个中断程序。若没有人为操作优先级寄存器,单片机会按照默认的一套优先级自动处理,我们在具体使用时详细讲解。52单片机一共有6个中断源,它们的符号、名称及产生的条件分别解释如下:INT0一外部中断0,由P3.2端口线引入,低电平或下降沿引起。INTl一外部中断l,由P3.3端口线引入,低电平或下降沿引起。T0定时器/计数器0中断,由T0计数器计满回零引起。Tl一定时器/计数器1中断,由Tl比数器计满回零引起。T2一定时器/计数器2中断,由T2计数器计满回零引起。T1/Rl一串行口中断,串行端口完成一帧字符发送/接收后引起。以上6个中断源中,T2是52单片机特有的。它们默认的中断级别如表7-1所示 表7-1 52单片机中断配置中断源默认中端级别序号(C语言用)外部中断第一0定时器/计数器中断第二1外部中断第三2定时器/计数器中断第四3串行口中断 第五42定时器/计数器2中断第六5 单片机在使用中断功能时,通常需要设置两个与中断有关的寄存器:中断允许寄存器IE和中断优先级寄存器IP。知识点1:中断允许寄存器IE中断允许寄存器用来设定各个中断源的打开和关闭,IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分另J是A8H一八FH,该寄存器可进行位寻址,即可对该寄存器的每一位进行单独操作。单片机复位时1E全部被清0,各位定义见表7-2 表7-2 中断允许寄存器IE位序号D7D6D5D4D3D2D1D0位符号EAET2ESET1EX1ET 0EX 0位地址AFHADH ACH ABH AAH A9HA8H EA全局中断允许位Ea=1,打开全局中断控制在此条件下,由各个中断控制位确定相应中断的打开或关闭EA=0,关闭全部中断。无效位。在此条件下,由各个中断控制位确定相应中断的打开或关闭ET2定时器计数器2中断允许位。ET2=1,打开T2中断。ET2=0,关闭T2中断。ES串行口中断允许位。ES=1,打开串行口中断。ES=0,关闭串行口中断。ET1定时器计数器1中断允许位。ET1=1,打开T1中断。ET1=0,关闭Tl中断。EX1一外部中断1中断允许位。EX1=1, 打开外部中断1中断。EX1=0,关闭外部中断1中断。ET0一定时器/计数器0中断允许位。ET0=1,打开T0中断。ET0=0,关闭T0中断。EX0外部中断0 中断允许位。EX0=1,打开外部中断0中断。EX0=0,关闭外部中断0中断。知识点2:中断优先级寄存器IP中断优先级寄存器在特殊功能寄存器中,字节地址为B8H,位地址(由地位到高位)分别是B8HBFH,IP用来设定各个中断源属于两级终端中的哪一级,该寄存器可进行位寻址,即可对该寄存器的每一位进行单独操作,单片机复位时全部被清,各位定义见表-3 表 7-3 中断允许寄存器IP位序号D7D6D5D4D3D2D1D0位符号PSPT1PX1PT 0PX0位地址 BCH BBH BAH B9HP8H PS=1,串行中断定义为高优先级中断。PS=0,串行口中断定义为低优先级中断。PT1一定时器7计数器1中断优先级控制位。PTl=1,定时器/计数器1中断定义为高优先级中断。PTl=0,定时器/计数器1中断定义为低优先级中断。PX1外部中断1中断优先级控制位。PX1=1,中断1定义为高优先级中断。PXl=0,外部中断1定义为低优先级中断。PT0定时器/计数器0中断优先级控制位。PT0=1,定时器/计数器0中断定义为高优先级中断。PT0=0,定时器/计数器0中断定义为低优先级中断。PX0外部中断0中断优先级控制位。PX0=1,外部中断0定义为高优先级中断。PX0=0,外部中断0定义为低优先级中断。在51单片机系列中,高优先级中断能够打断低优先级中断以形成中断嵌套,同优先级中断之间,或低级对高级中断则不能形成中断嵌套。若几个同级中断同时向CPU请求中断响应,在没有设置中断优先级情况下,按照默认中断级别响应中断,在设置中断优先级后,则按设置顺序确定响应的先后顺序。7.2 定时器计数器定时器/计数器是单片机非常重要的概念,生活中我们会制定一些计划,即特定的时间干特定的事,我们也希望可以控制单片机,让它在特定的时间执行特定的程序,这里我们就用到了定时器/计数器。7.2.1计数器 定时器计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMODTMOD:选择定时器/计数器T0、T1的工作模式和工作方式。TCON:控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。单片机复位时,两个寄存器的所有位都被清0。 工作方式控制寄存器TMOD的8位分为两组,高4位控制定时器1(T1),低4位控制定时器0(T0)。其各位定义如表7-4 表7-4定时器、计数器工作方式寄存器TMOD各位解释如下:(1)GATE门控位 0:以TRX(X=0,1)来启动定时器/计数器运行。1:用外中断引脚(INT0*或INT1*)上的高电平和TRX来启动定时器/计数器运行。(2)M1、M0工作方式选择位如表7-5 表7-5 定时器/计数器方式选择 (3) C/T计数器模式和定时器模式选择位0:定时器模式。 1:计数器模式。 计数器的功能是对外来脉冲信号计数,52单片机有T0(P3.4)和T1(P3.5)和T2(P1.0)三个输入引脚,分别是这个计数器的计数脉冲输入端,在设置计数器工作状态时,每当外部输入的脉冲发生负跳变计数器加一,直到加满溢出,向CPU申请中断,依次重复。虽然单片机具有外来脉冲技术功能,但并不是说任意脉冲的脉冲都可以直接计数单片机的晶振频率限制了所测计数脉冲的最高频率。当定时器计数器设定为计数器时,计数脉冲来自相应的外部输入引脚T0(P3.4)和T1(P3.5)和T2(P1.0)。当输入信号产生有1到0的负跳变时计数器的值加1。每个机器周期的S5P2期间,对外部输入引脚进行采样。如在第一个机器周期中采用的值为1而在下一个周期中采得的值为0则在紧跟着的再下一个机器周期S3P1期间,计数器加1。由于确认一次负跳变需要花两个机器周期,即24个振荡周期,因此外部输入计数脉冲的最高频率为振荡频率的1/24。例如,选用6MHz频率的晶振,允许输入的外部脉冲的最高频率为250kHZ,如果选用12MHZ频率晶振,则最高可输入500kHZ的外部脉冲。对于外部输入脉冲的占空比也有一定的限制,为了确保某一给定的电平在变化之前能被采样一次,则这一电平至少要保持一个机器周期。7.2.2 定时器生活中我们会经常安排一些计划,到了一定的时间就去执行,单片机也有类似的功能,这里我们提出了定时器/计数器的概念。51单片机内部共有两个16位可编程的定时器/计数器,即定时器T0和定时器T1。它们既有定时功能又有计数功能,通过设置与它们相关的特殊功能寄存器可以选择启用定时功能或计数功能。需要注意的是,这个定时器系统是单片机内部一个独立的硬件部分,它与CPU和晶振通过内部某些控制线连接并相互作用,CPU一旦设置开启定时功能后,定时器便在晶振的作用下自动开始计时,当定时器的计数器计满后,可以通过软件控制产生中断,即通知做些处理。结合生活事例,以烧开水为例,也就是说,当你打开火时,就注定不久就会响起水开的警报,这时你必定需要对该警报做出处理。烧开水是独立运行的一件事,但通过你打开火或者听到警报声来处理它。 定时器/计数器控制寄存器TCON为8位。各位定义如表7-6; 表7-6 定时器/计数器控制寄存器TCON高4位的功能如下:TF1定时器1溢出标志位。当定时器1计满溢出时,由硬件使TFI置1,并且申请中断。进入中断服务程序后,由硬件自动清0。需要注意的是,如果使用定时器的中断,那么该位完全不用人为去操作,但是如果使用软件查询方式的话,当查询到该位置1后,就需要用软件清0。TR1定时器1运行控制位。由软件清0关闭定时器1。当GATE=1,且INTl为高电平时,TRl置1启动定时器1;当GATE=0时,TRl置1启动定时器l。TF0定时器0溢出标志,其功能及操作方法同TFl。TR0定时器0运行控制位,其功能及操作方法同TRl。 E1外部中断1请求标志。当IT1=0时,为电平触发方式,每个机器周期的S5P2采样INTl引脚,若INTl脚为低电平,则置1,否则IEl清0。当ITl=1时,INTl为跳变沿触发方式,当第一个机器周期采样到lNTl为低电平时,则IEl置1。IEl=1,表示外部中断1正在向CPU申请中断。当CPU响应中断,转向中断服务程序时,该位由硬件清0。ITl外部中断1触发方式选择位。ITl=0,为电平触发方式,引脚INTl上低电平有效。ITl=1,为跳变沿触发方式,引脚INTl上的电平从高到低的负跳变有效。IE0外部中断0请求标志,其功能及操作方法同IEl。IT0外部中断0触发方式选择位,其功能及操作方法同ITl。咱们以工作方式1(即M0=M=)为例,工作方式1的计数位数是16位,对T0来说,由TL0寄存器作为低8位、TH0寄存器作为高8位,组成了16位加1计数器,其逻辑结构框图如图7-5所示。 图 7-5 定时器0方式1逻辑结构图2、工作方式11)逻辑电路结构工作方式1是16位计数结构的工作方式,计数器由THO全部8位和TLO全部8位构成。其逻辑电路和1作情况与方式0基本相同,如图7.13所示(以定时/计数器O为例)。所不同的只是组成计数器的位数,它比工作作方式0有更宽的计数范围,因此,在实际中应用更广泛。定时/计数器0在工作方式1的逻辑结构如7-6图所示 图 7-6 工作方式1逻辑电路图 应用中,工作方式1可以代替工作方式0。2) 计数初值的计算定时器一旦启动,它便在原来的数值上开始加1计数,若在程序开始时,我们没有设置TH0和TL0,它们的默认值都是0,假设时钟频率为l2MHz.12个时钟周期为一个机器周期,那么此时机器周期就是1s以,计满TH0和TL0就需要216-1个数,再来一个脉冲计数器溢出,随即向CPU申请中断。因此溢出一次共需65536s,约等于65.5ms.如果我们要定时50ms的话,那么就需要先给TH0和TL0装一个初值,在这个初值的基础上计50000个数后,定时器溢出,此时刚好就是50ms中断一次,当需定时ls时,我们写程序时当产生20次50ms的定时器中断后便认为是ls,这样便可精确控制定时时间了。要计50000个数时,TH0和TL0中应该装入的总数是65536-50000=15536, 把15536对256求模:15536/256=60装入TH0中,把15536对256求余:15536%256=176装入TL0中。以上就是定时器初值的计算方法,总结后得出如下结论:当用定时器的方式1时,设机器周期为Tcy,定时器产生次中断的时间为t,那么需要计数的个数N=T/cy装入THX和TLX中的数分别为THX=(65536-N)/256 TLX=(65536-N)%256 要计算机器周期Tcy,就需要知道系统时钟频率,也就是单片机的晶振频率,TX-lC实验板上时钟频率为11.0592MHz,那么机器周期为12(1/11059200) 1.09s,若t=50ms,那么N=50000/.0945872,这是晶振在11.0592MHz下定时50ms时初值的计算方法,当晶振为l2MHz时,计算起来就比较方便了,用同样方法可算得N=50000.3)由于I作方式1是16位计数结构,因此,其最大计数为216=65536,也就是说,每次计数到65536都会产生溢出,去置位TF0。如果计数初值为X,则可按以下公式计算定时时间: 定时时间=(216-X)机器周期工作方式21)逻辑电路结构工作方式0和工作方式1若用于循环重复定时或计数时,每次计满溢出后,计数器回到0,要进行新一轮的计数,就得重新装人计数初值。因此,循环定时或循环计数应用时就存在反复设置计数初值的问题,这项工作是由软件来完成的,需要花费一定时间。这样就会造成每次计数或定时产生误差。如果用于一般的定时,则是无关紧要的。但是有些工作,对时间的要求非常严格,不允许定时时间不断变化,用工作方式0和工作方式1就不行了,所以就引人了工作方式2。定时/计数器0在工作方式2的逻辑结构如7-7图所示. 图 7-7 工作方式2逻辑电路图在工作方式2下,把16位计数器分为两部分,即以TL0作为计数器,以TH0作为预置寄存器,初始化时把计数初值分别装人TL0和TH0中。当计数溢出后,不是像前两种工作方式那样通过软件方法,而是由预置寄存器TH0以硬件方法自动给计数器TL0重新加载。变软件加载为硬件加载。这不但省去了用户程序中的重装指令,而且也有利于提高定时精度。 计数初值的计算 由于工作方式2 是8位计数结构,因此,其最大计数值为28=256,计数值十分有限。如果计数初值为X,则按下面公式计算定时时间: 定时时间=(28-X)*机器周期工作方式31)逻辑电路结构工作方式3的作用比较特殊,只适用于定时器T0。如果企图将定时器Tl置为1作方式3,则它将停止计数,其效果与置TKl =0相同,即关闭定时器Tl。当T0在工作方式3时,它被拆成两个独立的8位计数器TL0和TH0,其逻辑结构如图7-8所示。 图 7-8 工作方式3 逻辑电路图图6-10中,上方的8位计数器TL0使用原定时器T0的控制位C/T、GATE、TR0和INT0(),TL0既可以计数使用,又可以定时使用,其功能和操作与前面介绍的工作方式0工作方式1完全相同。 下方的TH0只能作为简单的定时器使用。而且由于定时/计数器0的控制位已被TL0独占,因此只好借用定时器/计数器1的控制位TRl和TFl。即以计数溢出去置位TFl,而定时的启动和停止则受TRl的状态控制。 由于TL0既能作为定时器使用也能作为计数器使用,而TH0只能作为定时器使用却不能作为计数器使用,因此在工作方式3下,定时/计数器0可以构成两个定时器或一个定时器一个计数器。分析上面的逻辑图,当GATE=0,TR0=1时,TL0便在机器周期的作用下开始加1计数,当TL0计满后向TH0进一位,直到把TH0也计满,此时计数器溢出,置TF0为1,接着向CPU申请中断,接下来CPU进行中断处理。在这种情况下,只要TR0为1,那么计数就不会停止。这就是定时器0的工作方式1的工作过程,其他8位定时器、13位定时器的工作方式都大同小异,C51的中断函数格式如下:void函数名0 intermpt中断号using工作组 中断服务程序内容中断函数不能返回任何值,所以最前面用void;后面紧跟函数名,名字可以随便起,但不要与C语言中的关键字相同;中断函数不带任何参数,所以函数名后面的小括号内为空中断号是指单片机中几个中断源的序号,请查看3,4节讲解中断时的表3.4.1。这个序号是编译器识别不同中断的唯一符号,因此在写中断服务程序时务必要写正确;最后面的“using工作组”是指这个中断函数使用单片机内存中4组工作寄存器中的哪一组,C51编译器在编译程序时会自动分配工作组,因此最后这句话我们通常省略不写,但大家以后若遇到这样的程序代码时要知道是什么意思。一个简单中断服务程序写法如下: Void T1_time()interrupt 3 TH1=(65536-10000)/256 TL1=(65536-10000)%256上面这个代码是一个定时器1的中断服务程序,定时器1的中断序号是3因此我们要写成interrupt3,服务程序的内容是给两个初值七寸器装入新值。在写单片机的定时器程序时。在程序开始处需要对定时器及中断寄存器做初始化设置,通常定时器初始化过程如下: 1、对TMOD赋值,以确定T0和TI的工作方式。2、计算初值,并将初值写入TH0或TH1。3、中断方式时,则对IE赋值,开放中断。4、使TR0或TR1置位,启动定时器/计数器定时或计数。 下面我们通过两个实例 来讲解定时器0和定时器1 方式1的具体用法。 【例7.2.2】利用定时器0工作方式1,在实验板上实现第一个发光管以一秒亮灭闪烁。 #include/52系列单片机头文件#define uchar unsigned char#define uint unsigned intSbit led 1=P10;Uchar num;Void main()TMOD=0x01;/设置定时器0为工作方式1(M1M0为01)TH0=(65536-45872)/256;/装初值11.0592M晶振定时50ms数为45872TL0=(65536-45872)%256;EA=1;/开总中断ET0=1;/开定时器0中断TR0=1;/启动定时器0While(1);/程序停止在这里等待中断发生Void T0_time()interrupt 1TH0=(65536-45872)/256;/重装初值TH0=(65536-45872)%256;Num+;/num每加1次判断一次是否到20次If(num=20)/如果到了20次,说明1秒时间到Num=0;/然后把num清0重新再计20次Led1=led1;/让发光管状态取反编译程序下载到实验板,我们可以看到实验板上第一个发光管以1s间隔闪动。分析:进入主程序后,首先是对定时器和中断有关的寄存器初始化,我们按照上面讲到的通常的初始化过程来操作。定时50ms的初值我们在前面已讲过为45872。启动定时器后主程序停止在while(1)处,这里通常有很多人会有疑问:程序都停止在这里了,那么这个中断程序何时执行呢?主程序既然停止了为什么发光管却在闪烁呢?解释如下:一旦开启定时器,定时器便开始计数,当计数溢出时,自动进入中断服务程序执行代码,执行完中断程序后再回到原来处继续执行,也就是继续等待。就相当于你一旦打开火烧上开水后,不管你是洗衣服还是洗袜子,过一会儿水都会开,那么你就要停止当前活去处理开水问题,处理完后再回来继续洗你的衣服或是袜子。为了确保定时器的每次中断都是50ms,我们需要在中断函数中每次为TH0和TL0重新装入初值,因为每进入一次中断需要时间50ms,在中断程序中做一判断是否进入了20次,也就是判断时间是否到了ls,若时间到则执行相应动作。注意:一般我们在中断服务程序中不要写过多的处理语句,因为如果语句过多,中断服务程序中的代码还未执行完毕,而下一次中断又来临,这样我们就会丢失这次中断,当单片机循环执行代码时,这种丢失累积出现,程序便完全乱套。一般我们遵循的原则是:能在主程序中完成的功能就不在中断函数中写,若非要在中断函数中实现功能,那么一定要高效、简洁。这样一来,例【7.2.2】中的20次判断我们就可写在主程序中,实现如下 While(1)处改为 While(1) If (num=2) /如果到了20次,说明1秒时间到了Num=0; num清零重新在计算20次Led=led1;让发光管状态取反中断程序改为Void T0_time()interrupt 1TH0=(65536-45872)/256;/重装初值TH0=(65536-45872)%256;7.3串口通信7.3.1什么是串口通信 串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配: a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。 b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0127(7位)。扩展的ASCII码是0255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。 c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。 串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。7.3.2串口通信的配置 上一节我们认识了串口通信,下面我们看看电脑、单片机是依靠什么实现串口通信的。大多数计算机、包含两个基于RS232的串口如图7-9图7-9 RS232串口实物图如下表7-7 是 RS232各引脚定义 表7-7 RS-232标准接口主要引脚定义 RS232-C接口连接器一般使用型号为DB-9的9芯插头座,只需3条接口线,即发送数据、接收数据和信号地即可传输数据在RS232的规范中,电压值在+3V+15V(一般使用+6V)称为0或ON。电压在-3V-15V(一般使用-6V)称为1或OFF;计算机上的RS232高电位约为9V,而低电位则约为-9V。6、采用RS-232C接口存在的问题1、传输距离短,传输速率低 RS-232C总线标准受电容允许值的约束,使用时传输距离一般不要超过15米(线路条件好时也不超过几十米)。最高传送速率为20Kbps。2、有电平偏移 RS-232C总线标准要求收发双方共地。通信距离较大时,收发双方的地电位差别较大,在信号地上将有比较大的地电流并产生压降。3、抗干扰能力差 RS-232C在电平转换时采用单端输入输出,在传输过程中当干扰和噪声混在正常的信号中。为了提高信噪比,RS-232C总线标准不得不采用比较大的电压摆幅。 SCON 是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志,如表7-8所示: 表7-8 SCON特殊功能寄存器 SM0和SM1为工作方式选择位,可选择四种工作方式:SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB80时不激活RI,收到的信息丢弃;RB81时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。在方式0时,SM2必须是0。在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1。REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。TB8,在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中该位未用。RB8,在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。PCON中只有一位SMOD与串行口工作有关如表7-9所示 :表7-9 PCON寄存器SMOD(PCON.7) 波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。 7.3.3数据的发送与接受 80C51串行口的工作方式 一、方式0 方式0时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均为8位数据。 1、方式0输出如图7-10 图7-10 方式0输出方式0输入如图7-11 图7-11 方式0输入二、方式1 方式1是10位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图所示。其中1位起始位,8位数据位,1位停止位。 1、方式1输出如图7-12 图7-12 方式1输出 2、方式1输入如图7-13 图7-13 方式1输入 用软件置REN为1时,接收器以所选择波特率的16倍速率采样RXD引脚电平,检测到RXD引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的停止位为1)时,将接收到的9位数据的前8位数据装入接收SBUF,第9位(停止位)进入RB8,并置RI=1,向CPU请求中断。三、方式2和方式3 方式2或方式3时为11位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚 。 方式2和方式3时起始位1位,数据9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8),停止位1位,一帧数据为11位。方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由定时器T1的溢出率决定。 1、方式2和方式3输出如图7-14 图7-142、方式2和方式3输入如图7-15 图7-15 接收时,数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的第9位数据为1)时,接收到的数据装入接收缓冲器SBUF和RB8(接收数据的第9位),置RI=1,向CPU请求中断。如果条件不满足,则数据丢失,且不置位RI,继续搜索RXD引脚的负跳变。四、 波特率的计算在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。下面如图为串行口的工作方式如表7-10表7-10 串行口工作方式 串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。方式0的波特率 = fosc/12方式2的波特率 =(2SMOD/64) fosc 方式1的波特率 =(2SMOD/32)(T1溢出率)方式3的波特率 =(2SMOD/32)(T1溢出率) 当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出率取决于TH1中的计数值。 T1 溢出率 = fosc /12256 (TH1) 在单片机的应用中,常用的晶振频率为:12MHz和11.0592MHz。所以,选用的波特率也相对固定。常用的串行口波特率以及各参数的关系如表如表7.1.1 所示。 表7-11 常用波特率与定时器1的参数关系串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。具体步骤如下:确定T1的工作方式(编程TMOD寄存器);计算T1的初值,装载TH1、TL1;启动T1(编程TCON中的TR1位);确定串行口控制(编程SCON寄存器);串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。7.3 单片机串行口应用举例 在计算机组成的测控系统中,经常要利用串行通信方式进行数据传输。80C51单片机的串行口为计算机间的通信提供了极为便利的条件。利用单片机的串行口还可以方便地扩展键盘和显示器,对于简单的应用非常便利。这里仅介绍单片机串行口在通信方面的应用。7.3.1 单片机与单片机的通信 一、点对点的通信 1、硬件连接 如图7-16 图7-16二、多机通信 1、硬件连接 单片机构成的多机系统常采用总线型主从式结构。所谓主从式,即在数个单片机中,有一个是主机,其余的是从机,从机要服从主机的调度、支配。80C51单片机的串行口方式2和方式3适于这种主从式的通信结构。当然采用不同的通信标准时,还需进行相应的电平转换,有时还要对信号进行光电隔离。在实际的多机应用系统中,常采用RS-485串行标准总线进行数据传输,如图7-17。 图7-17单片机实例讲解#include #define uchar unsigned char#define uint unsigned intuchar flag,a,i; /串口接收数据存放uchar code table =“ni hao”;void init()/串口初始化SM0=0; 设置串口工作方式2SM1=1; /同上 TMOD=0x20; /TMOD:定时器1,方式2,8位自动重装方式 PCON=0x80; /SMOD=1;(将串口传送的波特率加倍) TH1=0xfd; /T1定时器装初值 TL1=0xfd;/ T1定时器装初值 TR1=1; /启动定时器/计数器1运行 EA=1;/开总中断 ES=1; /开串口中断void main()Init(); While(1)If(flag=1) ES=0; For(i=0;i6;i+) SBUF=table i ; While(!TI); TI=0; SBUF=a;While(!TI);TI=0;ES=1;Flag=0; Viod ser( ) interrupt 4 串口中断服务程序RI=0;a=SBUF;Flag=1;分析; Uchar code table =ni hao 7.4 看门狗的应用7.4.1 什么是看门狗(watchdog) 看门狗,又叫 watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗,一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定的时间不喂狗,(一般在程序跑飞时即进入死循环),WDT 定时超过,就会给出一个复位信号到MCU,是MCU复位. 防止MCU死机 “看门狗”概念及其应用在由单片机构成的系统中,由于单片机的工作有可能会受到来自外界电磁场的干扰,造成程序的跑飞,从而陷入死循环,程序的正常运行被打断,单片机控制的系统便无法继续工作,这样会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(watch dog)。 工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以在使用有看门狗的芯片时要注意清看门狗。硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。那么定时时间到后就会使单片机复位。常用的WDT芯片如MAX813 ,5045, IMP 813等,价格410元不等. 软件看门狗技术的原理和这差不多,只不过是用软件的方法实现,我们还是以51系列来讲,我们知道在51单片机中有两个定时器,我们就可以用这两个定时器来对主程序的运行进行监控。我们可以对T0设定一定的定时时间,当产生定时中断的时候对一个变量进行赋值,而这个变量在主程序运行的开始已经有了一个初值,在这里我们要设定的定时值要小于主程序的运行时间,这样在主程序的尾部对变量的值进行判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使程序复位。对于T1我们用来监控主程序的运行,我们给T1设定一定的定时时间,在主程序中对其进行复位,如果不能在一定的时间里对其进行复位,T1 的定时中断就会使单片机复位。在这里T1的定时时间要设的大于主程序的运行时间,给主程序留有一定的的裕量。而T1的中断正常与否我们再由T0定时中断子程序来监视。这样就够成了一个循环,T0监视T1,T1监视主程序,主程序又来监视T0,从而保证系统的稳定运行。 51 系列有专门的看门狗定时器,对系统频率进行分频计数,定时器溢出时,将引起复位.看门狗可设定溢出率,也可单独用来作为定时器使用. 看门狗使用注意:大多数51 系列单片机都有看门狗,当看门狗没有被定时清零时,将引起复位。这可防止程序跑飞。设计者必须清楚看门狗的溢出时间以决定在合适的时候,清看门狗。清看门狗也不能太过频繁否则会造成资源浪费。程序正常运行时,软件每隔一定的时间(小于定时器的溢出周期)给定时器置数,即可预防溢出中断而引起的误复位。 看门狗运用:看门狗是恢复系统的正常运行及有效的监视管理器(具有锁定光驱,锁定任何指定程序的作用,可用在家庭中防止小孩无节制地玩游戏、上网、看录像)等具有很好的应用价值. 系统软件看门狗的设计思路: 1.看门狗定时器T0的设置。在初始化程序块中设置T0的工作方式,并开启中断和计数功能。系统Fosc=12 MHz,T0为16位计数器,最大计数值为(2的10次方)-1=65 535,T0输入计数频率是Fosc/12,溢出周期为(65 535+1)1=65 536(s)。 2.计算主控程序循环一次的耗时。考虑系统各功能模块及其循环次数,本系统主控制程序的运行时间约为166 ms。系统设置看门狗定时器T0定时30 ms(T0的初值为65 536-30 000=35 536)。主控程序的每次循环都将刷新T0的初值。如程序进入死循环而T0的初值在30 ms内未被刷新,这时看门狗定时器T0将溢出并申请中断。 3.设计T0溢出所对应的中断服务程序。此子程序只须一条指令,即在T0对应的中断向量地址(000BH)写入无条件转移命令,把计算机拖回整个程序的第一行,对单片机重新进行初始化并获得正确的执行顺序。 7.4.2看门狗的使用 加入看门狗电路的目的是使单片机可以在无人状态下实现连续工作, 其工作过程如下:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过单片机的程序控制,使它定时地往看门狗芯片的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,给看门狗引脚送电平的程序便不能被执行到,这时,看门狗电路就会由于得不到单片机送来的信号,便将它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,从而单片机将从程序存储器的起始位置重新开始执行程序,这样便实现了单片机的自动复位。 通常看门狗电路需要一个专门的看门狗芯片连接单片机来实现。不过这样会给电路设计带来复杂,STC单片机内部自带有看门狗,通过对相应特殊功能寄存器的设置就可实现看门狗的应用,STC89系列单片机内部有一个专门的看门狗定时器寄存器,Watch Dog Timer 寄存器,其相应功能见下个知识点。看门狗定时器寄存器(WDT_CONTR) STC单片机看门狗定时器寄存器在特殊功能寄
展开阅读全文