您当前的位置:五五电子网电子知识单片机-工控设备综合-其它单片机定时计数器、中断和串行口的学习 正文
单片机定时计数器、中断和串行口的学习

单片机定时计数器、中断和串行口的学习

点击数:7779 次   录入时间:03-04 11:54:21   整理:http://www.55dianzi.com   综合-其它

      0--禁止接收;1--允许接收。

      TB8:

      在方式2,3中,TB8是发送机要发送的第9位数据。

      RB8:

      在方式2,3中,RB8是接收机接收到的第9位数据,该数据正好来自发

      送机的TB8。

      TI:

      发送中断标志位。发送前必须用软件清零,发送过程中TI保持零电平,

      发送完一帧数据后,由硬件自动置1。如要再发送,必须用软件再清零。

      RI:

      接收中断标志位。接收前,必须用软件清零,接收过程中RI保持零电

      平,接收完一帧数据后,由片内硬件自动置1。如要再接收,必须用软件

      再清零。

      电源控制寄存器PCON

      PCON的字节地址为87H,无位地址,PCON的格式如图六所示。需指出的是,对80C31单片机而言,PCON还有几位有效控制位。

  点击浏览下一页

      SMOD:波特率加倍位。在计算串行方式1,2,3的波特率时;0---不加倍;1---加倍。

      串行中断的应用特点:

      8031单片机的串行I/O端口是一个中断源,有两个中断标志RI和TI,RI用于接收,TI用于发送。

      串行端口无论在何种工作方式下,发送/接收前都必须对TI/RI清零。当一帧数据发送/接收完后,TI/RI自动置1,如要再发送/接收,必须先用软件将其清除。

      在串行中断被打开的条件下,对方式0和方式1来说,一帧数据发送/接收完后,除置位TI/RI外,还会引起串行中断请求,并执行串行中侧目务程序。但对方式2和方式3的接收机而言,还要视SM2和RB8的状态,才可确定RI是否被置位以及串行中断的开放:

      SM2 RB8 接收机中断标志与中断状态

      0 1 激活RI,引起中断

      1 0 不激活RI,不引起中断

      1 1 激活RI,引起中断

      单片机正是利用方式2,3的这一特点,实现多机间的通信。串行端口的常用应用方法见相关章节。

      波特率的确定:

      对方式0来说,波特率已固定成fosc/12,随着外部晶振的频率不同,波特率亦不相同。常用的fosc有12MHz和6MHz,所以波特率相应为1000×103和500×103位/s。在此方式下,数据将自动地按固定的波特率发送/接收,完全不用设置。

      对方式2而言,波特率的计算式为2SMOD·fosc/64。当SMOD=0时,波特率为FM/64;当SMOD=1时,波特率为fosc/32。在此方式下,程控设置SMOD位的状态后,波特率就确定了,不需要再作其它设置。

      对方式1和方式3来说,波特率的计算式为2SMOD/32×T1溢出率,根据SMOD状态位的不同,波特率有Tl/32溢出率和T1/16溢出率两种。由于T1溢出率的设置是方便的,因而波特率的选择将十分灵活。

      前已叙及,定时器Tl有4种工作方式,为了得到其溢出率,而又不必进入中断服务程序,往往使T1设置在工作方式2的运行状态,也就是8位自动加入时间常数的方式。由于在这种方式下,T1的溢出率(次/秒)计算式可表达成:

      点击浏览下一页

   

     下面一段主程序和中断服务程序,是利用串行方式l从数据00H开始连续不断增大地串行发送一片数据的程序例。设单片机晶振的频率为6MHZ,波特率为1200位/秒。



      19、单片机定时器、中断试验

      我们在学单片机时我们第一个例程就是灯的闪烁,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单片机只能这样工作吗?当然不是,我们能用定时器来实现灯的闪烁的功能。

      例1:查询方式

      ORG 0000H

      AJMP START

      ORG 30H

      START:

      MOV P1,#0FFH ;关所 灯

      MOV TMOD,#00000001B ;定时/计数器0工作于方式1

      MOV TH0,#15H

      MOV TL0,#0A0H ;即数5536

      SETB TR0 ;定时/计数器0开始运行

      LOOP:JBC TF0,NEXT ;如果TF0等于1,则清TF0并转NEXT处

      AJMP LOOP ;不然跳转到LOOP处运行

      NEXT:CPL P1.0

      MOV TH0,#15H

      MOV TL0,#9FH;重置定时/计数器的初值

      AJMP LOOP

      END AJMP LOOP

      END

      键入程序,看到了什么?灯在闪烁了,这可是用定时器做的,不再是主程序的循环了。简单地分析一下程序,为什么用JBC呢?TF0是定时/计数器0的溢 出标记位,当定时器产生溢出后,该位由0变1,所以查询该位就可知宇时时间是否已到。该位为1后,要用软件将标记位清0,以便下一次定时是间到时该位由0 变1,所以用了JBC指令,该指位在判1转移的同时,还将该位清0。

      以上程序是能实现灯的闪烁了,可是主程序除了让灯闪烁外,还是不能做其他的事啊!不,不对,我们能在LOOP:……和AJMP LOOP指令之间插入一些指令来做其他的事情,只要保证执行这些指令的时间少于定时时间就行了。那我们在用软件延时程序的时候不是也能用一些指令来替代 DJNZ吗?是的,但是那就要求你精确计算所用指令的时间,然后再减去对应的DJNZ循环次数,很不方便,而现在只要求所用指令的时间少于定时时间就行, 显然要求低了。当然,这样的办法还是不好,所以我们常用以下的办法来实现。

      程序2:用中断实现

      ORG 0000H ,http://www.51hei.com

      AJMP START

      ORG 000BH ;定时器0的中断向量地址

      AJMP TIME0 ;跳转到真正的定时器程序处

      ORG 30H

      START:

      MOV P1,#0FFH ;关所 灯

      MOV TMOD,#00000001B ;定时/计数器0工作于方式1

      MOV TH0,#15H

      MOV TL0,#0A0H ;即数5536

      SETB EA ;开总中断允许

      SETB ET0 ;开定时/计数器0允许

      SETB TR0 ;定时/计数器0开始运行

      LOOP: AJMP LOOP ;真正工作时,这里可写任意程序

      TIME0: ;定时器0的中断处理程序

      PUSH ACC

      PUSH PSW ;将PSW和ACC推入堆栈保护

      CPL P1.0

      MOV TH0,#15H

      MOV TL0,#0A0H ;重置定时常数

      POP PSW

      POP ACC

      RETI

      END

      上面的例程中,定时时间一到,TF0由0变1,就会引发中断,CPU将自动转至000B处寻找程序并执行,由于留给定时器中断的空间只有8个字节,显 然不足以写下所有有中断处理程序,所以在000B处安排一条跳转指令,转到实际处理中断的程序处,这样,中断程序能写在任意地方,也能写任意长度了。进入 定时中断后,首先要保存当前的一些状态,程序中只演示了保存存ACC和PSW,实际工作中应该根据需要将可能会改变的单元的值都推入堆栈进行保护(本程序 中实际不需保存护任何值,这里只作个演示)。

      上面的两个单片机程序运行后,我们发现灯的闪烁非常快,根本分辨不出来,只是视觉上感到灯有些晃动而已,为什么呢?我们能计算一下,定时器中预置的数 是5536,所以每计60000个脉冲就是定时时间到,这60000个脉冲的时间是多少呢?我们的晶体震荡器是12M,所以就是60000微秒,即60毫 秒,因此速度是非常快的。如果我想实现一个1S的定时,该怎么办呢?在该晶体震荡器濒率下,最长的定时也就是65。536个毫秒啊!上面给出一个例程。

      ORG 0000H

      AJMP START

      ORG 000BH ;定时器0的中断向量地址

      AJMP TIME0 ;跳转到真正的定时器程序处

      ORG 30H

上一页  [1] [2] [3] [4] [5] [6] [7]  下一页


本文关键字:单片机  计数器  综合-其它单片机-工控设备 - 综合-其它