【学习笔记】单片机的40个经典实验之16:定时计数器 T0 作定时应用技术(二)

  一、实验任务

  用 AT89S51 的定时/计数器 T0 产生 2 秒钟的定时,每当 2 秒定时到来时,更换指示灯闪烁,每个指示闪烁的频率为 0.2 秒,也就是说,开始 L1 指示灯以 0.2 秒的速率闪烁,当 2 秒定时到来之后,L2 开始以 0.2 秒的速率闪烁,如此循环下去。0.2 秒的闪烁速率也由定时/计数器 T0 来完成。

  二、电路原理图


  图 4.16.1

  三、系统板硬件连线

  (1. 把“单片机系统”区域中的 P1.0-P1.3 用导线连接到“八路发光二极管指示模块”区域中的 L1-L4 上

  四、程序设计内容

  (1. 由于采用中断方式来完成,因此,对于中断源必须它的中断入口地址 ,对于定时/计数器 T0 来说,中断入口地址为 000BH,因此在中断入口地方加入长跳转指令来执行中断服务程序。书写汇编源程序格式如下所示:

  ORG 00H

  LJMP START

  ORG 0BH ;定时/计数器 T0 中断入口地址

  LJMP INT_T0

  START: NOP ;主程序开始

  INT_T0: PUSH ACC ;定时/计数器 T0 中断服务程序

  PUSH PSW

  POP PSW

  POP ACC

  RETI ;中断服务程序返回

  END

  (2. 定时 2 秒,采用 16 位定时 50ms,共定时 40 次才可达到 2 秒,每 50ms产生一中断,定时的 40 次数在中断服务程序中完成,同样 0.2 秒的定时,需要 4 次才可达到 0.2 秒。对于中断程序,在主程序中要对中断开中断。

  (3. 由于每次 2 秒定时到时,L1-L4 要交替闪烁。采用 ID 来号来识别。当 ID=0 时,L1 在闪烁,当 ID=1 时,L2 在闪烁;当 ID=2 时,L3在闪烁;当 ID=3 时,L4 在闪烁

  五、程序框图


  T0 中断服务程序框图


  主程序框图

  

  图 4.16.2

  六、汇编源程序

  TCOUNT2S EQU 30H

  TCNT02S EQU 31H

  ID EQU 32H

  ORG 00H

  LJMP START

  ORG 0BH

 

  LJMP INT_T0

  START: MOV TCOUNT2S,#00H

  MOV TCNT02S,#00H

  MOV ID,#00H

  MOV TMOD,#01H

  MOV TH0,#(65536-50000) / 256

  MOV TL0,#(65536-50000) MOD 256

  SETB TR0

  SETB ET0

  SETB EA

  SJMP $

  INT_T0: MOV TH0,#(65536-50000) / 256

  MOV TL0,#(65536-50000) MOD 256

  INC TCOUNT2S

  MOV A,TCOUNT2S

  CJNE A,#40,NEXT

  MOV TCOUNT2S,#00H

  INC ID

  MOV A,ID

  CJNE A,#04H,NEXT

  MOV ID,#00H

  NEXT: INC TCNT02S

  MOV A,TCNT02S

  CJNE A,#4,DONE

  MOV TCNT02S,#00H

  MOV A,ID

  CJNE A,#00H,SID1

  CPL P1.0

  SJMP DONE

  SID1: CJNE A,#01H,SID2

  CPL P1.1

  SJMP DONE

  SID2: CJNE A,#02H,SID3

  CPL P1.2

  SJMP DONE

  SID3: CJNE A,#03H,SID4

  CPL P1.3

  SID4: SJMP DONE

  DONE: RETI

  END

  七、C 语言源程序

  #include <AT89X51.H>

  unsigned char tcount2s;

  unsigned char tcount02s;

  unsigned char ID;

  void main(void)

  {

  TMOD=0x01;

  TH0=(65536-50000)/256;

  TL0=(65536-50000)%256;

  TR0=1;

  ET0=1;

  EA=1;

  while(1);

  }

  void t0(void) interrupt 1 using 0

  {

  tcount2s++;

  if(tcount2s==40)

  {

  tcount2s=0;

  ID++;

  if(ID==4)

  {

  ID=0;

  }

  }

  tcount02s++;

  if(tcount02s==4)

  {

  tcount02s=0;

  switch(ID)

  {

  case 0:

  P1_0=~P1_0;

  break;

  case 1:

  P1_1=~P1_1;

  break;

  case 2:

  P1_2=~P1_2;

  break;

  case 3:

  P1_3=~P1_3;

  break;

  }

  }

  }

阅读本文用了:

秒,转发只需1秒

转载是一种智慧分享是一种美德❀ 

(0)

相关推荐