调用子程序后操作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条回答
gmsbr
1楼-- · 2019-07-17 01:55
也考虑过这个问题,不过没想到用这个语句来让PC停止,我试试看
gmsbr
2楼-- · 2019-07-17 03:06
还是一样,死循环
lirongqing
3楼-- · 2019-07-17 08:47
gmsbr 发表于 2011-7-13 14:47
还是一样,死循环

你把程序重新整理一遍,加上注释,最好画一个流程图。
因为你可以看到现象和调试,应该是最好发现问题的。
别放弃,还不行,把完整程序发上来。
gmsbr
4楼-- · 2019-07-17 11:34
 精彩回答 2  元偷偷看……
lirongqing
5楼-- · 2019-07-17 16:57
gmsbr 发表于 2011-7-13 17:57
我再详细看下STC的定时器和复位的相关手册,因为这算是个很简单的程序,这个程序我是先用长延时控制LED灯OK ...

蜂鸣器的工作原理要注意一下:
分两种:一是有源蜂鸣器(内带振荡源),只要通电,就可以响。
另一种是无源蜂鸣器,一直通电是不会响的,要给脉冲信号才会响,而所给的脉冲频率不同,就可以发出不同的声音。

一周热门 更多>