1、AT89S51 单片机实验及实践教程- 84 -16 定时计数器 T0 作定时应用技术(二)1 实验任务用 AT89S51 的定时/计数器 T0 产生 2 秒钟的定时,每当 2 秒定时到来时,更换指示灯闪烁,每个指示闪烁的频率为 0.2 秒,也就是说,开始 L1 指示灯以 0.2 秒的速率闪烁,当 2 秒定时到来之后,L2 开始以 0.2 秒的速率闪烁,如此循环下去。0.2 秒的闪烁速率也由定时/计数器 T0 来完成。2 电路原理图图 4.16.13 系统板硬件连线(1 把“单片机系统”区域中的 P1.0P1.3 用导线连接到“八路发光二极管指示模块”区域中的 L1L4 上AT89S51 单片
2、机实验及实践教程- 85 -4 程序设计内容(1 由于采用中断方式来完成,因此,对于中断源必须它的中断入口地址,对于定时/计数器 T0 来说,中断入口地址为 000BH,因此在中断入口地方加入长跳转指令来执行中断服务程序。书写汇编源程序格式如下所示:ORG 00HLJMP STARTORG 0BH ;定时/计数器 T0 中断入口地址LJMP INT_T0START: NOP ;主程序开始.INT_T0: PUSH ACC ;定时/计数器 T0 中断服务程序PUSH PSW.POP PSWPOP ACCRETI ;中断服务程序返回END(2 定时 2 秒,采用 16 位定时 50ms,共定时 4
3、0 次才可达到 2 秒,每 50ms 产生一中断,定时的 40 次数在中断服务程序中完成,同样 0.2 秒的定时,需要 4次才可达到 0.2 秒。对于中断程序,在主程序中要对中断开中断。(3 由于每次 2 秒定时到时,L1L4 要交替闪烁。采用 ID 来号来识别。当ID0 时, L1 在闪烁,当 ID1 时,L2 在闪烁;当 ID2 时,L3 在闪烁;当 ID 3 时,L4 在闪烁5 程序框图T0 中断服务程序框图开 始Count2S=0,Cnt02S=0,ID0TMOD01H,TH0,TL0 装入定时初值TR01,ET0 1,EA 1等待中断AT89S51 单片机实验及实践教程- 86 -主
4、程序框图图 4.16.2T0 中断入口Count2S 加 1Count2S=40 吗?Count2S=0ID 加 1ID4 吗?ID0Cnt02S 加 1Cnt02S=4 吗?Cnt02S=0ID0 ID1 ID2 ID3L1 闪烁 L2 闪烁 L3 闪烁 L4 闪烁中断返回AT89S51 单片机实验及实践教程- 87 -6 汇编源程序TCOUNT2S EQU 30HTCNT02S EQU 31HID EQU 32HORG 00HLJMP STARTORG 0BHLJMP INT_T0START: MOV TCOUNT2S,#00HMOV TCNT02S,#00HMOV ID,#00HMOV
5、TMOD,#01HMOV TH0,#(65536-50000) / 256MOV TL0,#(65536-50000) MOD 256SETB TR0SETB ET0SETB EASJMP $INT_T0: MOV TH0,#(65536-50000) / 256MOV TL0,#(65536-50000) MOD 256INC TCOUNT2SMOV A,TCOUNT2SCJNE A,#40,NEXTMOV TCOUNT2S,#00HINC IDMOV A,IDCJNE A,#04H,NEXTMOV ID,#00HNEXT: INC TCNT02SMOV A,TCNT02SCJNE A,#4
6、,DONEMOV TCNT02S,#00HMOV A,IDCJNE A,#00H,SID1CPL P1.0SJMP DONESID1: CJNE A,#01H,SID2CPL P1.1SJMP DONESID2: CJNE A,#02H,SID3CPL P1.2SJMP DONESID3: CJNE A,#03H,SID4CPL P1.3SID4: SJMP DONEDONE: RETIEND7 C 语言源程序#include unsigned char tcount2s;unsigned char tcount02s;unsigned char ID;void main(void)TMOD=
7、0x01;TH0=(65536-50000)/256;AT89S51 单片机实验及实践教程- 88 -TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;while(1);void t0(void) interrupt 1 using 0tcount2s+;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;