集单片机流水灯问题;

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay (uint);
uchar a;
void main ()
{
while (1)
a=0xfe;
{
P1=a;
a=_crol_(a,1);
delay (500);
}
}
void delay(uint z)
{
uint x,y;
for (x=z;x>0;x--)
for (y=110;y>0;y--);
}
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_DELAY?罗__灯
哪里出现了错误?

第1个回答  2011-09-27
编译器提示警告:存在未使用代码段。进一步分析会发现有如下错误:
while (1)
a=0xfe;
{
P1=a;
a=_crol_(a,1);
delay (500);
}

因为语句:
while (1)
a=0xfe;
程序将进入死循环,不停地执行“a=0xfe;”,后面的代码段:
{
P1=a;
a=_crol_(a,1);
delay (500);
}
没有机会被调用,即出现警告:“存在未调用代码段”,说的就是你编写的delay函数没机会被调用。你的本意是这样的吧:
while (1)
{
a=0xfe;
P1=a;
a=_crol_(a,1);
delay (500);
}
一般人都会忽略警告的,我猜你是没看见应有的效果才深究这个警告的吧,呵呵
第2个回答  2011-09-27
程序第五行函数声明 void delay (uint);
改为 void delay (uint z);
或者你直接把函数体delay放在主函数前面就可以了,这样可以免去函数声明。
以上两种方法都可以的。
你的流水灯是低电平有效,循环左移,每个500ms移动一次,如果你想要流水灯花样变多好看一些,可以来我的空间看看,对你会有帮助的。
http://hi.baidu.com/sutao130/blog/item/ec450a9d79b6fb5fd0135eec.html追问

改后,还是不行,下载程序,单片机无反应。你空间那个有些麻烦

追答

程序中那个a=0xfe; 应该放在while(1)之前
void main ()
{
a=0xfe;
while (1)
{
P1=a;
a=_crol_(a,1);
delay (500);
}
}
你用的是循环左移,给a所赋的初值应该放在while外面。
还有就是,编译有警告,但是.hex文件是可以生成的吧,如果有.hex文件应该可以下载到单片机里面的啊

追问

下载到单片机后,单片机无反应

追答

void main(void)
{
uchar i,mm;
while(1)
{
mm=0xfe;
P1=mm;
delay(500);
for(i=0;i<8;i++)
{mm=_crol_(mm,1);P1=mm;delay(500);}
for(i=0;i<8;i++)
{mm=_cror_(mm,1);P1=mm;delay(500);}
}
}
用这个主函数试试看

本回答被提问者采纳
第3个回答  2011-09-27
#include<reg52.h>
#include <intrins.h>
void main()
{
unsigned int x,y;
P1=0xfe;
while(1)
{
P1=_crol_(P1,1);
for(x=500;x>0;x--)
for(y=113;y>0;y--);
}
}
P1接二极管(低电平有效)每隔x毫秒流动一下(可改变x的值)
震荡周期为11.0592MHz

把上面的P1=0xfe;改为P1=0x01;!!!
高电平也许要用上拉电阻!!
第4个回答  2011-09-27
一个警告,没事的,重要的是是否有现象追问

下载程序后,单片机无反应

相似回答