调用子程序后操作IO口会死循环?高手请进

2019-07-16 06:55发布

本帖最后由 gmsbr 于 2011-7-12 23:48 编辑

用着AT的片子,现在想用STC15F的,写了个蜂鸣器嘀一声的汇编程序,可是搞了两天,不管是用STC的89C52RC还是15F104,还有AT89S52,搞出来都是上电一直响,不能停止,今天不断改变代码结构,总算是能达到目的了,可是不明白为什么会这样,希望朋友们能告知一二,下面是程序代码:


COUNT1 EQU #64H                                   ;循环100次数
COUNT2 EQU #5H
MOV TMOD,#00H                                      ;STC的16位自动装载定时器0工作方式0,时钟6MHZ

DELAY_500MS: MOV R7,COUNT1              ;250US循环100次则是25MS后停止输出
R7LOOP: MOV R6,COUNT2                       ;50微秒周期*5=250US
             R6LOOP: LCALL DELAY1
;CPL BEEP 语句放在此处则会不停响,为什么呢?
              DJNZ R6,R6LOOP
  CPL BEEP                                           ;改放在此处则能够正常计数,按设定的次数倒计时完成输出后停止
DJNZ R7,R7LOOP
SETB BEEP
;------------------------50US延时子程序------------------------------------------
;MOV TMOD,#00H                              ;16位自动装载定时器0工作方式0
DELAY1: MOV TH1,#FFH                     ;装50US初值
               MOV TL1,#E7H
               SETB TR1                             ;启动定时器1
DELAY2: JBC TF1,DELAY3                   ;查询计数溢出转delay3,返回
AJMP DELAY2
DELAY3: RET


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
lirongqing
1楼-- · 2019-07-16 11:10
建议写程序之前先画流程图,有点乱。
SETB BEEP
之后就结束程序了吗?
放在前面是每个R6减一次数都响,
放在后面是等R6减完数,第个R7减一次数响一下。
gmsbr
2楼-- · 2019-07-16 11:32
是的,setb beep后就结束。这个设计是要输出50个500US的方波给蜂鸣器后就停止
gmsbr
3楼-- · 2019-07-16 13:53
可是同样的程序结构,我改初值到250us定时,这样可以的话只用一个循环就可以搞定的,就不用2 个循环了,就因为子程序返回后跟cpl   beep会长响,所以只能用2个循环,也尝试在这个语句前后加了两个nop语句,也是一样不停的响,郁闷啊
lirongqing
4楼-- · 2019-07-16 18:11
gmsbr 发表于 2011-7-13 10:36
可是同样的程序结构,我改初值到250us定时,这样可以的话只用一个循环就可以搞定的,就不用2 个循环了,就因 ...

nop语句很短,所以听起来像是连续响也是可能的。
gmsbr
5楼-- · 2019-07-16 23:52
 精彩回答 2  元偷偷看……
lirongqing
6楼-- · 2019-07-17 01:02
gmsbr 发表于 2011-7-13 13:07
这个设计是25ms后就停止的,现在是开20分钟还是一样的长响。加NOP空操作指令让各个指令间多点时间,以免有 ...

SJMP $
END
应该这样结束的,你是否少了死循环那一句。所以单片机完成后,自动复位,然后程序又重新开始跑了。

一周热门 更多>