共2条
1/1 1 跳转至页
用c编的一个简单小程序请各位高手指点

问
本人初学单片机,编了个指示灯的小程序,程序如下:
#include"reg51.h"
sbit Lamp1=P0^0;
sbit Lamp2=P0^1;
sbit Lamp3=P0^2;
sbit Lamp4=P0^3;
sbit Lamp5=P0^4;
sbit Lamp6=P0^5;
sbit Lamp7=P0^6;
sbit Lamp8=P0^7;
void delay();
main()
{
delay();
Lamp1=0;
delay();
Lamp2=0;
delay();
Lamp3=0;
delay();
Lamp4=0;
delay();
Lamp5=0;
delay();
Lamp6=0;
delay();
Lamp7=0;
delay();
Lamp8=0;
}
void delay()
{
int i=0;
while(i<30000)i++;
}
烧入89C51后,8个灯总是循环亮,把程序反编译后,发现主程序有个RETURE,不知道为什么,不用子程序,把延时加到程序中,问题同样存在,请各位高手点拨点拨小弟,不胜感激。 答 1: return??reture?return呢,是编译器自动加上去的。
你要想不循环,在后面加
while(1); 答 2: 没问题了,谢谢这位大侠我还发现程序中有循环时,结束后就自动RETURN,有什么规律吗? 答 3: 是什么原因? 答 4: 分析先来做个假设,如果没有这个RETURN,51在运行完你的程序代码后PC指针就会指向下一条指令的地址,而此时该地址是没有命令的,于是PC指针会继续加一,直到他溢出(溢出跟你使用的MCU的空间大小有关),这时,PC指针又会返回0000地址重新开始执行。因此51的程序就是一个无穷循环程序。
编译器为了防止出现这种情况强制增加了RETURN命令。这样PC指针会再执行完你的最后一条程序指令后强制返回0000地址。这就是你原来程序出现闪灯循环的原因。
另外,写51程序的时候一定要记住有一个无限循环,否则你的系统就存在崩溃的可能。 答 5: 原来这样恩,明白了,书上很难找到这些,大侠感谢。
#include"reg51.h"
sbit Lamp1=P0^0;
sbit Lamp2=P0^1;
sbit Lamp3=P0^2;
sbit Lamp4=P0^3;
sbit Lamp5=P0^4;
sbit Lamp6=P0^5;
sbit Lamp7=P0^6;
sbit Lamp8=P0^7;
void delay();
main()
{
delay();
Lamp1=0;
delay();
Lamp2=0;
delay();
Lamp3=0;
delay();
Lamp4=0;
delay();
Lamp5=0;
delay();
Lamp6=0;
delay();
Lamp7=0;
delay();
Lamp8=0;
}
void delay()
{
int i=0;
while(i<30000)i++;
}
烧入89C51后,8个灯总是循环亮,把程序反编译后,发现主程序有个RETURE,不知道为什么,不用子程序,把延时加到程序中,问题同样存在,请各位高手点拨点拨小弟,不胜感激。 答 1: return??reture?return呢,是编译器自动加上去的。
你要想不循环,在后面加
while(1); 答 2: 没问题了,谢谢这位大侠我还发现程序中有循环时,结束后就自动RETURN,有什么规律吗? 答 3: 是什么原因? 答 4: 分析先来做个假设,如果没有这个RETURN,51在运行完你的程序代码后PC指针就会指向下一条指令的地址,而此时该地址是没有命令的,于是PC指针会继续加一,直到他溢出(溢出跟你使用的MCU的空间大小有关),这时,PC指针又会返回0000地址重新开始执行。因此51的程序就是一个无穷循环程序。
编译器为了防止出现这种情况强制增加了RETURN命令。这样PC指针会再执行完你的最后一条程序指令后强制返回0000地址。这就是你原来程序出现闪灯循环的原因。
另外,写51程序的时候一定要记住有一个无限循环,否则你的系统就存在崩溃的可能。 答 5: 原来这样恩,明白了,书上很难找到这些,大侠感谢。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
分享开发笔记,赚取电动螺丝刀(便携轻巧与无刷电机两款可选) | |
看《关键跃升》,聊聊工作心法、动力、能力、沟通与协作,从五个方面深入交流你的工作心得 | |
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
我要给自己挣一部逻辑分析仪 | |
用知识换取送给亲朋的礼物,做个浪漫的开发者 | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 |
打赏帖 | |
---|---|
Buck电路工作在CCM模式下电感电流的计算公式是什么?被打赏5分 | |
buck电路工作原理被打赏5分 | |
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏100分 | |
我想要一部加热台+多合一调试工具被打赏18分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 | |
【换取手持数字示波器】树莓派PICO调试器官方固件本地化部署实践被打赏24分 | |
【换取手持数字示波器】分享一个KEIL无法识别CMSIS-DAP调试器的解决办法被打赏20分 | |
【换取手持数字示波器】分享一个自制的ArduinoNano扩展板底板被打赏23分 | |
【换取手持示波器】树莓派PICOW网页烟花被打赏18分 | |
【换取手持示波器】树莓派PICO逻辑分析仪被打赏16分 |