为什么说这个子程序延时了25ms, 我算的只有4ms
[复制链接]
实例1 闪烁LED小灯的设计---51系列单片机设计实例教程
本设计的闪烁小灯控制器,可使小灯轮流点亮、逐点点亮、间隔点亮。如要控制交流彩灯,可在P1端口加接继电器或可控硅接口电路。本设计可应用在广告彩灯控制器、舞台灯光控制器等领域。
1.系统硬件电路的设计 图6.1为闪烁小灯控制器的电路原理图。其中:单片机采用AT89C2051,P1口作LED发光管输出控制用,P3.0—P3.2口为闪烁方式控制开关K1、K2、K3按键接口,P3.3口的按键作备用,限流电阻为310欧,发光管工作电流约为10MA,采用12HMz晶振。 图6.1 闪烁小灯电路
主程序流程图如图6.2所示
图6.2 主程序流程图
本控制器在使用中,如要改变闪烁的方式,可按下相应的功能按键。当一个完整的闪烁循环结束后,即可转入新的闪烁方式。由于键扫描是在闪烁循环结束时进行,因此,功能开关按下的时间应较长才能被读入。改进的方法是把DL05S延时子程序用键扫描子程序来替代,这样,只要按下按键即可被键扫描程序读入。
以下是LED小灯闪烁控制器的完整源程序:
;************; ;小灯控制程序; ;************; ; ;************; ;中断入口程序; ;************; ; ORG 0000H ;程序执行开始地址 LJMP START ;跳至START执行 ORG 0003H ;外中断0中断入口地址 RETI ;中断返回(不开中断) ORG 000BH ;定时器T0中断入口地址 RETI ;中断返回(不开中断) ORG 0013H ;外中断1中断入口地址 RETI ;中断返回(不开中断) ORG 001BH ;定时器T1中断入口地址 RETI ;中断返回(不开中断) ORG 0023H ;串行口中断入口地址 RETI ;中断返回(不开中断) ; ;************; ; 初始化程序 ; ;************; ; CLEAR: MOV 20H,#00H ;20H单元内存清0(闪烁标志清0) SETB 00H ;20H.0位置1(上电时自动执行闪烁功能1) RET ;子程序返回 ; ;************; ; 主 程 序 ; ;************; ; START:ACALL CLEAR ;调用初始化子程序 MAIN: LCALL KEYWORK ;调用键扫描子程序 JB 00H,FUN0 ;20H.0位为1时执行FUN0 JB 01H,FUN1 ;20H.1位为1时执行FUN1 JB 02H,FUN2 ;20H.2位为1时执行FUN2 JB 03H,MAIN ;备用 AJMP MAIN ;返回主程序MAIN ; ;************; ; 功能程序 ; ;************; ;第1种闪烁功能程序 FUN0: MOV A,#0FEH ;累加器赋初值 FUN00:MOV P1,A ;累加器值送至P1口 LCALL DL05S ;延时 JNB ACC.7,MAIN ;累加器最高位为0时转MAIN RL A ;累加器A中数据循环左移1位 AJMP FUN00 ;转FUN00循环 ; ;第2种闪烁功能程序 FUN1:MOV A,#0FEH ;累加器赋初值 FUN11:MOV P1,A ;累加器值送至P1口 LCALL DL05S ;延时 JZ MAIN ;A为0转MAIN RL A ;累加器A中数据循环左移1位 ANL A,P1 ;A同P1口值相与 AJMP FUN11 ;转FUN11循环 ; ; 第3种闪烁功能程序 FUN2:MOV A,#0AAH ;累加器赋初值 MOV P1,A ;累加器值送至P1口 LCALL DL05S ;延时 CPL A ;A中各位取反 MOV P1,A ;累加器值送至P1口 LCALL DL05S ;延时 AJMP MAIN ;转MAIN ;************; ; 扫键程序 ; ;************; ; KEYWORK:MOV P3,#0FFH ;置P3口为输入状态 JNB P3.0,KEY0 ;读P3.0口,若为0转KEY0 JNB P3.1,KEY1 ;读P3.1口,若为0转KEY1 JNB P3.2,KEY2 ;读P3.2口,若为0转KEY2 JNB P3.3,KEY3 ;读P3.3口,若为0转KEY3 RET ;子程序返回 ; ;闪烁功能0键处理程序 KEY0:LCALL DL10MS ;延时10毫秒消抖 JB P3.0,OUT0 ;P3.0为1,子程序返回(干扰) SETB 00H ;20H.0位置1(执行闪烁功能1标志) CLR 01H ;20H.1位清0 CLR 02H ;20H.2位清0 CLR 03H ;20H.3位清0 OUT0:RET ;子程序返回 ; ; 闪烁功能1键处理程序 KEY1:LCALL DL10MS JB P3.1,OUT1 SETB 01H ;20H.1位置1(执行闪烁功能2标志) CLR 00H CLR 02H CLR 03H OUT1:RET ; ;闪烁功能2键处理程序 KEY2:LCALL DL10MS JB P3.2,OUT2 SETB 02H ;20H.2位置1(执行闪烁功能3标志) CLR 01H CLR 00H CLR 03H OUT2:RET ; ;闪烁功能(备用)键处理程序 KEY3:LCALL DL10MS JB P3.3,OUT3 SETB 03H ;20H.3位置1(执行备用闪烁功能标志) CLR 01H CLR 02H CLR 00H OUT3:RET ; ;************; ; 延时程序 ; ;************; ;0.5毫秒延时子程序,执行一次时间为513微秒 DL512:MOV R2,#0FFH LOOP1: DJNZ R2,LOOP1 RET ; ;10毫秒延时子程序(调用20次0.5毫秒延时子程序) DL10MS:MOV R3,#14H LOOP2: LCALL DL512 DJNZ R3,LOOP2 RET ; ;延时子程序,改变R4寄存器初值可改变闪烁的快慢(时间为15×25毫秒) DL05S:MOV R4,#0FH LOOP3: LCALL DL25MS DJNZ R4,LOOP3 RET ; ;25毫秒延时子程序,用调用扫键子程序延时,可快速读出功能按键值 DL25MS:MOV R5,#0FFH LOOP4:LCALL KEYWORK DJNZ R5,LOOP4 RET END ;程序结束
为什么说以下这个子程序延时了25ms? 我算的只有4ms!
;25毫秒延时子程序,用调用扫键子程序延时,可快速读出功能按键值 DL25MS:MOV R5,#0FFH LOOP4:LCALL KEYWORK DJNZ R5,LOOP4 RET
[ 本帖最后由 简糊仙 于 2011-4-13 22:06 编辑 ]
|