打印

问下这个程序为什么会自动复位!

[复制链接]
4131|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
菜鸟同学|  楼主 | 2013-3-6 11:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#include <intrins.h>

void main(void)
{
        SCON = 0x40;
        TMOD = 0x20;  // 定时器1 的8位自动重载模式
        TH1 = TL1 = 0xfe; // 9600
        TR1 = 1;
        SBUF = 'A';
        while(TI==0);
        TI = 0;
//        while(1);
}
问一下这个程序 为什么会重复执行?

这个是keil反汇编
C:0x0000    02001A   LJMP     C:001A
     4: void main(void)
     5: {
     6:         SCON = 0x40;
C:0x0003    759840   MOV      SCON(0x98),#0x40
     7:         TMOD = 0x20;  // 定时器1 的8位自动重载模式
C:0x0006    758920   MOV      TMOD(0x89),#0x20
     8:         TH1 = TL1 = 0xfe; // 9600
C:0x0009    758BFE   MOV      TL1(0x8B),#0xFE
C:0x000C    758DFE   MOV      TH1(0x8D),#0xFE
     9:         TR1 = 1;
C:0x000F    D28E     SETB     TR1(0x88.6)
    10:         SBUF = 'A';
C:0x0011    759941   MOV      SBUF(0x99),#0x41
    11:         while(TI==0);
C:0x0014    3099FD   JNB      TI(0x98.1),C:0014
    12:         TI = 0;
    13: //      while(1);
C:0x0017    C299     CLR      TI(0x98.1)
    14: }
C:0x0019    22       RET       // 问题就是这个为什么会 给main 也弄了一个ret  因为没有压栈 那么出来的就是0000H ??????这个就是问题!!!!和用户程序设计的想法不一致啊!
C:0x001A    787F     MOV      R0,#0x7F
C:0x001C    E4       CLR      A
C:0x001D    F6       MOV      @R0,A
C:0x001E    D8FD     DJNZ     R0,C:001D
C:0x0020    758107   MOV      SP(0x81),#0x07
C:0x0023    020003   LJMP     main(C:0003)

在线求解!

相关帖子

沙发
NE5532| | 2013-3-6 12:59 | 只看该作者
while(1)你为什么屏蔽掉?程序需要循环,楼主忘了?本来做对了的,自己又改错了。

使用特权

评论回复
板凳
hwk612167| | 2013-3-6 13:17 | 只看该作者
从C语言看没什么问题,按LZ意思,是应该执行main后面的代码。
汇编看,复位首先跳到C:0x001A    787F     MOV      R0,#0x7F 这里开始执行,后面清0RAM,执行完main,然后RET。。。没压栈所以RET出来的0,所以复位。
总体来看,应该是编译器问题,main后无代码执行,编译器智能处理为执行完一遍代码后从头开始执行。

使用特权

评论回复
地板
菜鸟同学|  楼主 | 2013-3-6 13:44 | 只看该作者
本帖最后由 菜鸟同学 于 2013-3-6 13:55 编辑
NE5532 发表于 2013-3-6 12:59
while(1)你为什么屏蔽掉?程序需要循环,楼主忘了?本来做对了的,自己又改错了。 ...


程序为什么需要循环,循环应该是用户自己设置的啊,这个不是自己程序复位了。难道是单片机上电一直执行FLASH里的代码,不停的循环,直到断电为止。。。:lol 不懂啊!
冒昧的问大牛 是不是一个程序在设计的时候都要有一个循环 来做事!

使用特权

评论回复
5
菜鸟同学|  楼主 | 2013-3-6 13:44 | 只看该作者
hwk612167 发表于 2013-3-6 13:17
从C语言看没什么问题,按LZ意思,是应该执行main后面的代码。
汇编看,复位首先跳到C:0x001A    787F     M ...

我就是这么理解啊,你觉得我那些理解错了!

使用特权

评论回复
6
SLEET1986| | 2013-3-6 14:01 | 只看该作者
不循环走一边完了,那是不是单片机该休息了

使用特权

评论回复
7
dirtwillfly| | 2013-3-6 14:03 | 只看该作者
菜鸟同学 发表于 2013-3-6 13:44
程序为什么需要循环,循环应该是用户自己设置的啊,这个不是自己程序复位了。难道是单片机上电一直执行FL ...

单片机或者操作系统都是要循环的,这样才能不停地工作。不然运行一遍就歇菜了。

使用特权

评论回复
8
NE5532| | 2013-3-6 14:04 | 只看该作者
菜鸟同学 发表于 2013-3-6 13:44
程序为什么需要循环,循环应该是用户自己设置的啊,这个不是自己程序复位了。难道是单片机上电一直执行FL ...

你的“难道”两个字说明你上课打瞌睡去了,单片机就是这样运行的,谁指挥他停下来了?

使用特权

评论回复
9
jlass| | 2013-3-6 15:57 | 只看该作者
菜鸟同学

使用特权

评论回复
10
菜鸟同学|  楼主 | 2013-3-7 08:39 | 只看该作者
NE5532 发表于 2013-3-6 14:04
你的“难道”两个字说明你上课打瞌睡去了,单片机就是这样运行的,谁指挥他停下来了? ...

我的想法是他执行完程序后,执行flash 后面无意义的代码时候就停止了!

使用特权

评论回复
11
菜鸟同学|  楼主 | 2013-3-7 08:41 | 只看该作者
dirtwillfly 发表于 2013-3-6 14:03
单片机或者操作系统都是要循环的,这样才能不停地工作。不然运行一遍就歇菜了。 ...

额。我一直没这个感念,我以为我让他干什么就干什么,

使用特权

评论回复
12
菜鸟同学|  楼主 | 2013-3-7 08:43 | 只看该作者
jlass 发表于 2013-3-6 15:57
菜鸟同学

:lol 笑而不语??

使用特权

评论回复
13
dirtwillfly| | 2013-3-7 08:51 | 只看该作者
菜鸟同学 发表于 2013-3-7 08:41
额。我一直没这个感念,我以为我让他干什么就干什么,

肯定是你让他干什么,他就干什么。
但是,你不能让它干完一个活就重启一次吧

使用特权

评论回复
14
NE5532| | 2013-3-7 09:05 | 只看该作者
菜鸟同学 发表于 2013-3-7 08:39
我的想法是他执行完程序后,执行flash 后面无意义的代码时候就停止了!

记住,MCU除非休眠,否则永远不会停下来,你看到的“复位”就是程序跑到末尾以后翻过来再跑,操作系统下的程序可以退回来,那是因为有操作系统给你护着!

使用特权

评论回复
15
少先队员| | 2013-3-7 17:16 | 只看该作者
单片机很勤快,跑到最后一看没活干了,又从头再来一遍,除非你在最后把他拦住。

使用特权

评论回复
16
haixinghp| | 2013-3-7 23:52 | 只看该作者
单片机都是这样一遍一遍执行的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

707

帖子

8

粉丝