打印

【求助分析】为何LED灯一直闪亮?去掉了while(1)了呀?

[复制链接]
7418|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qingfeng20|  楼主 | 2011-7-18 11:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qingfeng20 于 2011-7-18 11:19 编辑

请大家帮助分析一下,谢谢啦!
跟朋友探讨了下,说有可能是一直在不停复位?
PS:用的单片机是AT89LV52,好像单片机本身也不带看门狗,那为何还会出现以上现象呢?
---------------------------------
#include <stdio.h>
#include <reg52.h>
#include <intrins.h>

#define uint  unsigned int
sbit LED = P1^5; //指示灯
void Delay(uint n);    // Delay 100us

void main(void)
{
// while(1)
{
  LED =1;
  Delay(20);
  LED = 0;
  Delay(20);
  
}

}

void Delay(uint m)
{
uint i;
while(m--)
for(i=0;i<100;i++);
}

相关帖子

沙发
原野之狼| | 2011-7-18 11:17 | 只看该作者
去掉了之后,程序运行完这些语句之后就跑飞了。

使用特权

评论回复
板凳
qingfeng20|  楼主 | 2011-7-18 11:21 | 只看该作者
去掉了之后,程序运行完这些语句之后就跑飞了。
原野之狼 发表于 2011-7-18 11:17

跑飞了?能详细解释下吗?
C51语言难道不是执行到结尾就结束了吗?

使用特权

评论回复
地板
qingfeng20|  楼主 | 2011-7-18 11:22 | 只看该作者
去掉了之后,程序运行完这些语句之后就跑飞了。
原野之狼 发表于 2011-7-18 11:17

谢谢 回复,请问如何达到让LED灯就闪亮一下呢?程序如何控制?

使用特权

评论回复
5
原野之狼| | 2011-7-18 11:23 | 只看该作者
跑飞了?能详细解释下吗?
C51语言难道不是执行到结尾就结束了吗?
qingfeng20 发表于 2011-7-18 11:21

在PC里是这么回事,程序执行完毕后由操作系统销毁相应的资源。
但是在这里,就跑飞了,你在代码之后加上
while(1);
就不会跑飞了,以上代码假定看门狗没有开启。

使用特权

评论回复
评分
参与人数 2威望 +2 收起 理由
autopccopy + 1 正解!顶!!
qingfeng20 + 1
6
qingfeng20|  楼主 | 2011-7-18 11:27 | 只看该作者
在PC里是这么回事,程序执行完毕后由操作系统销毁相应的资源。
但是在这里,就跑飞了,你在代码之后加上
while(1);
就不会跑飞了,以上代码假定看门狗没有开启。 ...
原野之狼 发表于 2011-7-18 11:23

难道说C51语言,为了防止跑飞,都需要在main()函数中加上while(1)吗?不论是您说的这种形式还是我程序中被注释掉的那种形式?

使用特权

评论回复
7
原野之狼| | 2011-7-18 11:41 | 只看该作者
难道说C51语言,为了防止跑飞,都需要在main()函数中加上while(1)吗?不论是您说的这种形式还是我程序中被注释掉的那种形式?
qingfeng20 发表于 2011-7-18 11:27

这个跟语言没有什么关系,而是跟软硬件平台有关。
在桌面系统里,我们平时学习的教科书程序一般也就是个算法啥的,执行完一次就了事,然后return退出。
但是在单片机的程序里,main函数可以认为是一个主任务,你总得让它一直执行吧,即使没事做了也得让它while(1)死循环,要不然处理器都不知道该执行啥指令了。
当然,是不是main就不能返回了呢,其实是可以的,这个就比较深入了。
我说的只是一般情况,通常我们写程序就是:
void main(void)
{
       /* Initial here */
      // ...

     while(1)
     {
            /* do tasks here */
     }
}

使用特权

评论回复
8
autopccopy| | 2011-7-18 12:15 | 只看该作者
难道说C51语言,为了防止跑飞,都需要在main()函数中加上while(1)吗?不论是您说的这种形式还是我程序中被注释掉的那种形式?
qingfeng20 发表于 2011-7-18 11:27


5楼正解!结束需要在最后加入该语句。

使用特权

评论回复
9
huangqi412| | 2011-7-18 12:24 | 只看该作者
LZ要是有仿真器,跟踪一下自然就知道了。。。  PC指针会一直加的。。。

使用特权

评论回复
10
lfjwfm| | 2011-7-18 12:25 | 只看该作者
windows xp 其实也是一个whlie(1){},哈哈

使用特权

评论回复
11
dqyubsh| | 2011-7-18 12:39 | 只看该作者
C51没有死循环会从头再开始执行main,所以会一直闪烁。

使用特权

评论回复
12
原野之狼| | 2011-7-18 12:53 | 只看该作者
10# lfjwfm
XP可不是一个while(1),这样简单描述有失偏颇。
这个问题已经是与操作系统的范畴了。

我之前说的PC程序仅仅是指的执行一次就完了的简单程序,例如hello world!程序,其return之后由OS负责一些清理工作,但是这个程序在单片机上执行(依赖关系不讨论),return之后,如果代码上没有做特别处理,那程序就跑飞了。

桌面程序里头使用while(1)也是很常见的,比如经典的MFC的框架,就是在while(1)里进行消息获取、消息分配以及消息处理的过程,这和MCU程序倒是很类似,可以从中借鉴不少思想来设计MCU的单线程程序。

使用特权

评论回复
13
老鱼探戈| | 2011-7-18 13:22 | 只看该作者
闪亮就对了。
小狼真有耐心啊,精神上敬个礼!:victory:

使用特权

评论回复
14
mcu5i51| | 2011-7-18 13:45 | 只看该作者
main执行完成后的结果和编译器有关,有的自动加上while(1);原地踏步,有的执行return返回未知的地址,功能简单的话SP通常是初始化为0的内存,也就“复位了”;最好人为加while(1),指令,不要再代码中留下未知情况。

使用特权

评论回复
15
yezhubenyue| | 2011-7-18 13:56 | 只看该作者
学习了

使用特权

评论回复
16
jd吕凯| | 2011-7-18 15:00 | 只看该作者
7# 原野之狼


前辈,我以前在学习单片机中断时,也遇到过类似的问题,但结果并不是这样。我是在主程序最后加了一个while(1)来等待外部中断。但我把while(1)去掉后。主程序竟然是循环执行了,就是main函数从头一遍遍的执行。这是怎么回事?

使用特权

评论回复
17
qingfeng20|  楼主 | 2011-7-18 15:50 | 只看该作者
7# 原野之狼  


前辈,我以前在学习单片机中断时,也遇到过类似的问题,但结果并不是这样。我是在主程序最后加了一个while(1)来等待外部中断。但我把while(1)去掉后。主程序竟然是循环执行了,就是main函数从头 ...
jd吕凯 发表于 2011-7-18 15:00

同问 原野之狼这个问题,其实跟我的问题是相同的现象。为何在main()主程序中不加while(1),程序执行完,然后又接着重复执行main()函数呢?不是跑飞了吗?它怎么又找到main()函数的入口地址了呢?

使用特权

评论回复
18
huangqi412| | 2011-7-18 15:51 | 只看该作者
LS,都说了PC会一直加,加到头了怎么办?自然是从头又开始。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
qingfeng20 + 1
19
qingfeng20|  楼主 | 2011-7-18 16:01 | 只看该作者
LS,都说了PC会一直加,加到头了怎么办?自然是从头又开始。
huangqi412 发表于 2011-7-18 15:51

哦,这下明白啦,谢谢!

使用特权

评论回复
20
原野之狼| | 2011-7-18 16:11 | 只看该作者
16L和17L说的应该是一回事。
另外注意一点,这种情况下,复位之后存在着风险,因为寄存器的值已经不是缺省值了。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
qingfeng20 + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

15

帖子

0

粉丝