定时器 计数器功能说明:
开始时接在单片机P1端口中的P1.7亮,用定时器延时60ms后P1.6亮,如此向右移动,移到最右端P1.0亮后,又回到最左端重新开始向右移动,不断循环。
程序:DS01.ASM
01: START: MOV R0, #8 ;设右移8次
02: MOV A, #01111111B ;存入开始点亮灯位置
03: LOOP: MOV P1, A ;传送到P1并输出
04: ACALL DELAY ;调延时子程序
05: RR A ;右移一位
06: DJNZ R0, LOOP ;判断移动次数
07: JMP START ;重新设定显示值 主程序
08: DELAY: MOV TMOD,#00000001B; 设定TO工作在MODE1
09: SETB TR0 ; 启动TO开始计时
10: MOV TL0,#LOW(65536-60000) ; 装入低位
11: MOV TH0,#HIGH(65536-60000); 装入高位
12: JNB TF0,$ ; T0没有溢出等待
13: CLR TF0 ; 产生溢出,清标志位 定时延时
14: RET ; 子程序返回 子程序
15: END ; 程序结束
功能说明:
开始时P1.0亮,延时10秒后,左移至P1.1亮,如此左移到第6个灯(P1.5)亮后,再从头开始向左移动,1分钟循环一次。
程序:DS02.ASM
01: START: MOV R0, #6 ;设左移6次
02: MOV A, #11111110B ;存入开始点亮灯位置
03: LOOP: MOV P1, A ;传送到P1并输出
04: ACALL DELAY ;调延时子程序
05: RL A ;左移一位
06: DJNZ R0, LOOP ;判断移动次数
07: JMP START ;重新设定显示值 主程序
08:DELAY: MOV R1,#200 ;设置软件计数初值
09: MOV TMOD,#00000001B; 设定TO工作在MODE1
10: SETB TR0 ; 启动TO开始计时
11: AGAIN: MOV TL0,#LOW(65536-50000) ; 装入低位
12: MOV TH0,#HIGH(65536-50000); 装入高位
13: LOOP1: JBC TF0,LOOP2 ;TF0是1转移至LOOP2并清0
14: JMP LOOP1
15:LOOP2: DJNZ R1,AGAIN ;R1不是0,则转移至AGAIN (定时加软
16: CLR TR0 ;是,则停止T0计时 件计数)
17: RET ; 子程序返回 延时子程序
18: END ; 程序结束
功能说明:采用两个定时器合用,T0设置为定时方式,T1设置为计数方式。T0定时时间为50ms,计满产生的输出信号由P1.7口发光二极管显示。同时还将该信号输入到计数器T1(P3.5脚)作为T1的计数输入脉冲,当输入信号产生由1到0的跳变时触发计数器工作,使计数器的值增1。计数器T1的初始值设置为100,计满时所用的时间为50ms×2×100,即10s。并由P1.0端口发光二极管来显示,所以P1.0端口的灯每10s点亮或熄灭一次。
程序:DS03.ASM
01: ORG 0000H ; 起始地址
02: JMP MAIN ; 跳到主程序MAIN处
03: ORG 000BH ; 定时器T0溢出入口地址
04: JMP EXT0 ; 跳到定时器中断EXT0处
05: ORG 001BH ; 计数器T1溢出入口地址
06: JMP EXT1 ; 跳到计数器中断EXT1处
07: MOV SP, #60H ; 设置堆栈 入口地址
08: MAIN: MOV TMOD, #01100001B;设T0模式1,T1模式2
09: MOV TL0, #LOW(65536-50000) ; 装入定时初值
10: MOV TH0, #HIGH(65536-50000);
11: MOV TL1, #(256-100) ; 装入计数初值
12: MOV TH1, #(256-100);
13: MOV IE, #10001010B ; 开总中断及T0、T1中断
14: SETB TR0 ; 启动T0开始定时
15: SETB TR1 ; 启动T1开始计数
16: JMP $ ; 等待溢出 主程序
17: EXT0: MOV TL0, #LOW(65536-50000) ;重加载
18: MOV TH0, #HIGH(65536-50000);
19: CPL P1.7 ; P1.7反相输出,并输入P3.5 T0中断
20: RETI ; T0中断子程序返回 子程序
21: EXT1: CPL P1.0 ; P1.0反相输出 T1中断
22: RETI ; T1中断子程序返回 子程序
23: END ; 结束程序结束