标题: linxu下sdcc的蜂鸣器程序疑问 [打印本页]

作者: hyq1979    时间: 2020-10-4 21:55
标题: linxu下sdcc的蜂鸣器程序疑问
为什么没有做循环语句继电器还是循环吸合与断开?

#include <8051.h>

__sbit __at 0x80 relay;

typedef unsigned int u16;

void delay(u16 i)
{
        while(i--);
}

int main()
{
        relay=1;
        delay(50000);
        relay=0;
        delay(50000);

        return 0;
}


作者: taotie    时间: 2020-10-5 00:59
仿真一下,没有你说的“循环吸合与断开”现象
作者: wulin    时间: 2020-10-5 08:16
int main()
{
        relay=1;
        delay(50000);
        relay=0;
        delay(50000);       
        while(1);
}
作者: HC6800-ES-V2.0    时间: 2020-10-5 08:49
第一:main函数不应该有输入、输出的参数。应该是:void main(void)
第二:虽然你没有用到循环语句,但,main函数执行完一次后,会继续执行下一次,这样就“循环”了。如果你不想循环,那么这样:
int main()
{
        relay=1;
        delay(50000);
        relay=0;
        delay(50000);
        return 0;
        while(1);
}
作者: hyq1979    时间: 2020-10-5 11:04
taotie 发表于 2020-10-5 00:59
仿真一下,没有你说的“循环吸合与断开”现象

百度有相关的解答:
这是单片机自身决定的。有的单片机程序内如果没有循环程序,那它会从头执行到最后,然后返回最开始继续执行。一直重复。
而有的单片机再执行一次之后,就会停止。
有的则是执行完后可能会进入无序运行状态,就只不知道程序跑哪里去了!
所以,在写单片机程序的时候,最好是加上while循环,即便你的程序只运行一次,也要在最后加上while(1);使其一直指向这个语句而不会出现误操作。

实测keil5及sdcc对51、stm32、f103zet6不加while(1)main都会循环执行
作者: hyq1979    时间: 2020-10-5 11:31
有的单片机程序内如果没有循环程序,会从头执行到最后然后返回最开始继续执行。在写单片机程序的时候,最好是加上while循环,即便你的程序只运行一次,也要在最后加上while(1);使其一直指向这个语句而不会出现误操作。实测keil5及sdcc编译51、stm32、f103zet6 不加while(1)main都会循环执行。
作者: hyq1979    时间: 2020-10-5 17:50
HC6800-ES-V2.0 发表于 2020-10-5 08:49
第一:main函数不应该有输入、输出的参数。应该是:void main(void)
第二:虽然你没有用到循环语句,但,m ...

确实如此,感谢回复




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1