找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4036|回复: 15
收起左侧

99秒表程序设计,原版-但有错误,求指出和更正,谢谢

[复制链接]
ID:59980 发表于 2014-9-22 23:14 | 显示全部楼层 |阅读模式
程序原设计要求是:                             2数码管显示00-99秒的,要求用P1.0做按键输入,而且要实现一键式控制:第一次按下又放开为启动,第二次按下又放开为暂停,暂时还需保持数据,第三次按下又放开为返回主程序重新开始并清除数据.然后就是再按就按上述依次循环。下面是有错误的没完善的程序:



RG 00H;
START:
     MOV P0,#00H;  显示00
     JB  P1.0,$;   当按钮按下则继续
     CALL FIR;     消除开关的抖动
     JNB P1.0,$;   判断有没有放开按钮
     MOV R0,#00H;  计时初始值00
PR1:
   MOV A,R0;      将初始值载入ACC
   MOV P0,A;      输出至P0
   MOV R5, #10;   延时1秒。
AD1:
   MOV R6,#200;  延时用寄存器
   CALL DEY;     调用延时子程序。
   DJNZ R5,PR1;  
   MOV A,R0;
   ADD A,#01H;  计时值加1,
   DA  A;        十进制调整
   MOV R0,A;    返回计时用寄存器
   JMP PR1;     重复计时动作
PR2:                 ; 第二次按按钮
    CALL FIR;        消除开关的抖动
    JB P1.0, PR3;    如果放开按钮,则跳至PR3。
    JMP PR2;
PR3:
    JB P1.0,$;     第三次按按钮
    CALL FIR;      消除开关的抖动
PR4:
    JB P1.0,START;  放开按钮则跳至START清零。
    JMP PR4;
DEY:          ;      延时子程序。
    MOV R7,#248;
    JNB P1.0,PR2;
    DJNZ R7,$;
    DJNZ R6,DEY;
FIR:
    MOV R6,#60;   消除抖动30ms。
D1:
   MOV R7,#248;
   DJNZ R7,$;
   DJNZ R6,D1;
   RET;
   END;



求指出错误原因和提供更正可以正常运行的程序,谢谢各位高手了!
回复

使用道具 举报

ID:66032 发表于 2014-9-23 17:39 | 显示全部楼层

回帖奖励 +5

汇编让人头疼, 用C 来做太简单了! 什么单片机都可以, 最好用RTC时钟源, 1秒一次中断
回复

使用道具 举报

ID:19715 发表于 2014-9-23 20:47 | 显示全部楼层
ORG 00H;
START:
     MOV P0,#00H;  显示00
    JB  P1.0,START;第一次按下判断
     CALL FIR  ;消除开关的抖动
     JB  P1.0,START;第一次按下判断
     JNB P1.0,$  ;等待按钮松开
     MOV R0,#00H;  计时初始值00
PR1:
   MOV A,R0;      将初始值载入ACC
   MOV P0,A;      输出至P0
   MOV R5, #10;   延时1秒。
AD1:
   MOV R6,#200;  延时用寄存器
   CALL DEY;     调用延时子程序。
   DJNZ R5,PR1;  
   MOV A,R0;
   ADD A,#01H;  计时值加1,
   DA  A;        十进制调整
   MOV R0,A;    返回计时用寄存器
   JB  P1.0, PR1  ;第二次按下判断
   CALL FIR   ;消除开关的抖动
   JB  P1.0, PR1  ;第二次按下判断
   JNB P1.0,$  ;等待按钮松开
PR2:   
   JB  P1.0, PR2 ;第三次按下判断
   CALL FIR   ;消除开关的抖动
   JB  P1.0, PR2 ;第三次按下判断
   JNB P1.0,$   ;等待按钮松开
   JMP START
DEY:          ;延时子程序。
    MOV R7,#248;
    DJNZ R7,$;
    DJNZ R6,DEY;
RET
FIR:
    MOV R6,#60;   消除抖动30ms。
D1:
   MOV R7,#248;
   DJNZ R7,$;
   DJNZ R6,D1;
   RET;
   END;
回复

使用道具 举报

ID:59980 发表于 2014-9-23 22:37 | 显示全部楼层
C 还没有开始学啊,再说,不是说先学好汇编语言,再来学C就比较容易一点吗?
回复

使用道具 举报

ID:19715 发表于 2014-9-23 22:42 | 显示全部楼层
本帖最后由 明白 于 2014-9-23 22:44 编辑

来简单的,都是没有通过电路板测试
JMPKEY MACRO LL
     JB  P1.0,LL;第一次按下判断
     CALL FIR  ;消除开关的抖动
     JB  P1.0,LL;第一次按下判断
     JNB P1.0,$  ;等待按钮松开
     ENDM
ORG 00H
START:
     MOV P0,#00H;  显示00
     JMPKEY START
     MOV R0,#00H;  计时初始值00
PR1:
   MOV A,R0;      将初始值载入ACC
   MOV P0,A;      输出至P0
   MOV R5, #10;   延时1秒。
AD1:
   MOV R6,#200;  延时用寄存器
   CALL DEY;     调用延时子程序。
   DJNZ R5,PR1;  
   MOV A,R0;
   ADD A,#01H;  计时值加1,
   DA  A;        十进制调整
   MOV R0,A;    返回计时用寄存器
   JMPKEY PR1  
PR2:   
    JMPKEY PR2  
   JMP START
DEY:          ;延时子程序。
    MOV R7,#248;
    DJNZ R7,$;
    DJNZ R6,DEY;
RET
FIR:
    MOV R6,#60;   消除抖动30ms。
D1:
   MOV R7,#248;
   DJNZ R7,$;
   DJNZ R6,D1;
   RET;
   END;

回复

使用道具 举报

ID:59980 发表于 2014-9-23 22:47 | 显示全部楼层
有点意思,但我发表的那程序的文字有几句好像变成红色了,是什么意思啊,是出错在那儿吗?
回复

使用道具 举报

ID:59980 发表于 2014-9-23 23:08 | 显示全部楼层
二楼的高级工程师提供的程序已经上机下载实验了,无法启动程序啊,只显示00,没有进一步的执行,按键也按过了好几回,没有反应啊,应该是这个程序还会进入死循环出不来了啊,所以无法向下执行。再想个新的,只差几句关键的了,搞定它就应当可以了,谢谢了啊!这程序困了我好久的,但我实现过一键二功能的,一键三功能还是没有搞定啊!!!!
回复

使用道具 举报

ID:19715 发表于 2014-9-23 23:36 | 显示全部楼层
JMPKEY MACRO LL
     JB  P1.0,LL;第一次按下判断
     CALL FIR  ;消除开关的抖动
     JB  P1.0,LL;第一次按下判断
     JNB P1.0,$  ;等待按钮松开
     ENDM
ORG 00H
START:
     MOV P0,#00H;  显示00
     JMPKEY START
     MOV R0,#00H;  计时初始值00
    MOV R5, #10;   延时1秒。/////////////////////////////////////////  
PR1:
   MOV A,R0;      将初始值载入ACC
   MOV P0,A;      输出至P0
// MOV R5, #10;   延时1秒。//////////////////////////////////////////
AD1:
   MOV R6,#200;  延时用寄存器
   CALL DEY;     调用延时子程序。
   DJNZ R5,PR1;  
  MOV R5, #10;   延时1秒。//////////////////////////////////////////
   MOV A,R0;
   ADD A,#01H;  计时值加1,
   DA  A;        十进制调整
   MOV R0,A;    返回计时用寄存器
   JMPKEY PR1  
PR2:   
    JMPKEY PR2  
   JMP START
DEY:          ;延时子程序。
    MOV R7,#248;
    DJNZ R7,$;
    DJNZ R6,DEY;
RET
FIR:
    MOV R6,#60;   消除抖动30ms。
D1:
   MOV R7,#248;
   DJNZ R7,$;
   DJNZ R6,D1;
   RET;
   END;


回复

使用道具 举报

ID:19715 发表于 2014-9-23 23:44 | 显示全部楼层
不知道阁下的电路板LED是否低电平点亮?
回复

使用道具 举报

ID:59980 发表于 2014-9-24 19:07 | 显示全部楼层
是低电平点亮的


回复

使用道具 举报

ID:59980 发表于 2014-9-24 19:31 | 显示全部楼层

JMPKEY MACRO LL
     JB  P1.0,LL;第一次按下判断
     CALL FIR  ;消除开关的抖动
     JB  P1.0,LL;第一次按下判断
     JNB P1.0,$  ;等待按钮松开
     ENDM
ORG 00H
START:
     MOV P0,#00H;  显示00
     JMPKEY START
     MOV R0,#00H;  计时初始值00
    MOV R5, #10;   延时1秒。/////////////////////////////////////////  
PR1:
   MOV A,R0;      将初始值载入ACC
   MOV P0,A;      输出至P0
// MOV R5, #10;   延时1秒。//////////////////////////////////////////
AD1:
   MOV R6,#200;  延时用寄存器
   CALL DEY;     调用延时子程序。
   DJNZ R5,PR1;  
  MOV R5, #10;   延时1秒。//////////////////////////////////////////
   MOV A,R0;
   ADD A,#01H;  计时值加1,
   DA  A;        十进制调整
   MOV R0,A;    返回计时用寄存器
   JMPKEY PR1  
PR2:   
    JMPKEY PR2  
   JMP START
DEY:          ;延时子程序。
    MOV R7,#248;
    DJNZ R7,$;
    DJNZ R6,DEY;
RET
FIR:
    MOV R6,#60;   消除抖动30ms。
D1:
   MOV R7,#248;
   DJNZ R7,$;
   DJNZ R6,D1;
   RET;
   END;



高级工程师你好!这程序,我下载到机板测试了,可以一键三功能啊,谢谢你啊!OK!

但有几句用法不太明哦,可以解析一下吗?

JMPKEY MACRO LL  这个如何用的????


ENDM  是什么功能??
回复

使用道具 举报

ID:19715 发表于 2014-9-25 08:25 | 显示全部楼层
JMPKEY MACRO LL  
ENDM  
是宏定义了一个JMPKEY LL宏,带变量LL,
在程序里头可以直接使用
回复

使用道具 举报

ID:19715 发表于 2014-9-25 08:30 | 显示全部楼层

因为是低电平点亮的
所以P的输出反一下,就比较直观

JMPKEY MACRO LL
     JB  P1.0,LL;第一次按下判断
     CALL FIR  ;消除开关的抖动
     JB  P1.0,LL;第一次按下判断
     JNB P1.0,$  ;等待按钮松开
     ENDM
ORG 00H
START:
     MOV P0,#00H;  显示00
     JMPKEY START
     MOV R0,#00H;  计时初始值00
    MOV R5, #10;   延时1秒。/////////////////////////////////////////  
PR1:
   MOV A,R0;      将初始值载入ACC
   CPL A
   MOV P0,A;      输出至P0
// MOV R5, #10;   延时1秒。//////////////////////////////////////////
AD1:
   MOV R6,#200;  延时用寄存器
   CALL DEY;     调用延时子程序。
   DJNZ R5,PR1;  
  MOV R5, #10;   延时1秒。//////////////////////////////////////////
   MOV A,R0;
   ADD A,#01H;  计时值加1,
   DA  A;        十进制调整
   MOV R0,A;    返回计时用寄存器
   JMPKEY PR1  
PR2:   
    JMPKEY PR2  
   JMP START
DEY:          ;延时子程序。
    MOV R7,#248;
    DJNZ R7,$;
    DJNZ R6,DEY;
RET
FIR:
    MOV R6,#60;   消除抖动30ms。
D1:
   MOV R7,#248;
   DJNZ R7,$;
   DJNZ R6,D1;
   RET;
   END;


回复

使用道具 举报

ID:107352 发表于 2016-6-26 13:53 | 显示全部楼层
学习了!!
回复

使用道具 举报

ID:111634 发表于 2016-6-26 14:30 | 显示全部楼层
本帖最后由 zl2168 于 2016-6-26 14:32 编辑

实例93  99.9秒秒表
一键三功能



Proteus仿真一下,确认有效。
实例95 99.9秒秒表.rar (38.86 KB, 下载次数: 12)
99.9秒秒表.jpg


以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版

书中电路和程序设计有详细说明,程序语句条条有注解。





回复

使用道具 举报

ID:59980 发表于 2016-7-17 23:16 | 显示全部楼层
谢谢!真不错啊,值得学习呀
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表