7428|9

15

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

为什么说这个子程序延时了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 编辑 ]
此帖出自51单片机论坛

最新回复

书上说的东西,没考虑他的说法来源,也就是说条件,你也当真? 只有示波器和万用表不会骗人。(当然不排除测到不可信或者错误的结果)  详情 回复 发表于 2011-4-16 10:36
点赞 关注
 

回复
举报

15

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
请高人指点, 谢谢!
此帖出自51单片机论坛
 
 
 

回复

1万

帖子

141

TA的资源

版主

板凳
 
给出你的算法。
此帖出自51单片机论坛
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(中级)

4
 
OK, 假设在延时期间没有按键响应, 下面我计算这4MS如何来, 如果有按键响应, 就远不止25ms了!

DL25MS:MOV      R5,#0FFH   ;占1个机器周期, 即1μs
LOOP4:LCALL     KEYWORK  ; 占2个机器周期, 即2μs
      DJNZ      R5,LOOP4            ; 占2个机器周期, 也即2μs

跳到keywork, 下面也以μs表示各指令的执行时间

KEYWORK:MOV     P3,#0FFH    ;置P3口为输入状态, 2μs
      JNB       P3.0,KEY0   ;读P3.0口,若为0转KEY0, 2μs
      JNB       P3.1,KEY1   ;读P3.1口,若为0转KEY1, 2μs
      JNB       P3.2,KEY2   ;读P3.2口,若为0转KEY2, 2μs
      JNB       P3.3,KEY3   ;读P3.3口,若为0转KEY3, 2μs
      RET                   ;子程序返回, 2μs

总耗时1+(2+12+2)×256=4097μs即4MS
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

5
 
你怎么测得到25ms?
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

6
 
算的是4MS,可是你的25MS怎么来的。你还是实际测下。因为如果用2M的晶振就是25MS了
此帖出自51单片机论坛
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(中级)

7
 
不是, 这个是一本书上的一个例子, 我只是提出我自己的疑问, 会不会是书本印错了?
此帖出自51单片机论坛
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(中级)

8
 
顶一下,期待高手指正!
此帖出自51单片机论坛
 
 
 

回复

1万

帖子

141

TA的资源

版主

9
 
书上是有可能出错的,另外注意时钟频率的不同,时钟频率不同则机器周期不同。
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

10
 

回复 7楼 简糊仙 的帖子

书上说的东西,没考虑他的说法来源,也就是说条件,你也当真?
只有示波器和万用表不会骗人。(当然不排除测到不可信或者错误的结果)
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表