单片机C语言编程问题,高手进!拜谢!

写一个控制步进电机的控制程序,其中延时程序是这样的代码:
void delay(void) //误差 -0.000000000227us
{
unsigned char a,b,c;
for(c=13;c>0;c--)
for(b=247;b>0;b--)
for(a=142;a>0;a--);
_nop_; //if Keil,require use intrins.h
}

但是编译了以后出现了这样的警告,如图所示:

即:
STEPPING MOTOR C.C(15): warning C275: expression with possibly no effect
这个怎么就可能无效了呢?
求高手指点迷津!拜谢!

首先你的编程习惯很不好,for嵌套,每一层都要用{}括起来,如果我没看错的话,你把每一层都加上{}就没问题了。
其次,一个延时函数怎么能写的这么低效呢?追问

我是通过一个软件自动生成的延时函数,不是自己写的。
刚刚试了试for嵌套加上括号,我都加了的,还是出现同样的警告。
另外,它低效的原因估计是为了控制误差,就像那个注释里写的一样,误差很小(到底怎么样我也不知道,这个延时函数我整个就是复制粘贴过来的)。
大神还有其他改法吗?

追答

for(a=142;a>0;a--); /*这里的分号去掉了吗?*/
_nop_; //if Keil,require use intrins.h

追问

还是不行。
刚刚发现了一个问题,就是按build时不会出现警告,但是按rebuild就会出现上述警告。这是啥情况?

追答

不知道你用的什么编译器,我在linux下编译没有问题,可能是你的编译器参考了什么代码规范,当出现多层嵌套的语句时会给出警告。试着找一下编译器的设置里有没有关于编译参考的内容。
可以单步调试一下看能进入第三层for不,如果能进入就忽略该警告吧。不要纠结于一个问题上苦恼。

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-05-29
你把_nop_只写在一个for 下面 只执行 了 一个for循环 延迟追问

具体要怎么改呢?求指教!

追答

for(c=13;c>0;c--){
for(b=247;b>0;b--){
for(a=142;a>0;a--){
_nop_;
}
}
}

追问

还是不行,一样的警告。
刚刚发现了一个问题,,按rebuild就会出现上述警告,但是按build时不会出现。这是啥情况?

第2个回答  2014-05-29
unsigned char a,b,c;为什么不定义int型,而是char型呢?追问

这个。。我也不太清楚,我是用的一款软件自动生成延时函数的。
具体的刚刚用Keil调试了一下,发现本来是延时1s的,改成int了以后,延时变成了3s多。我估计是int和char在转换成的汇编语言时会变得不一样吧,总之改了就乱了。用char刚刚好。
话说,这char和出现的警告有关系吗?

追答

没关系,能看到的程序,只有 for(a=142;a>0;a--);中多个分号

单片机C语言一秒定时程序详解
你给的程序看出,是定时器工作在MODE1。16位计数器。但是你给的程序应该有问题。一个是TL0 = - 5000 \/ 256,应该是TL0 = - 5000 % 256;另一个是if(BUFFER[0]==100),应该是if(BUFFER[0]==200)。首先你要懂定时计数器原理,51是累加型,MODE1的上限是0xFFFF,即代表可计65535个数。这里...

鄙人不才!欲借单片机制作一个电子书。请问那位大侠可以给点设计要点...
郭天祥的视频也有制作手机的,主要用ARM开发模块!!

keil和vc++,单片机编程
对,VC++中编程几本上不会顾及变量占内存的大小,程序的实现造成可执行文件的大小,而KEIL编程不一样,大致想到我要编的程序的大小,大致要用多大的内存,当作数据处理时,还要考虑运行速度跟的上不,首先要对硬件有大致定位,编程时得精心分配ROM和RAM。可以这么比VC程序员是富翁,KEIL(单片机)程序员...

计算机二级到底考什么比较好?
推荐你考C,因为三级除PC技术以外,其他的上机都是C语言,所以你如果过了二级C,那么三级的上机就很简单了,因为三级上机就一道C的编程题,而且C语言的语法是最经典的,会了C语言,其他的语言也就好学了,而且有很多硬件也支持C语言编程,例如单片机什么的,以后用得路子广,所以建议你学C。

单片机 十进制数转十六进制后用ASCII码传输的问题
你可以使用查表法莱处理啊,这样就不会出错了:char TAB[]="0123456789ABCDEF";ASCII[0]=TAB[BIN0\/16];ASCII[1]=TAB[BIN0%16];这样多简单!

学编程对电脑的配置有什么要求?
详情请查看视频回答

移动硬盘无法删除问题(真正懂的高手进,小弟先拜谢!)
你说的很模糊,一般就2个方面。要么就是系统有问题,需要重装。要么你的移动硬盘中病毒了,有DLL关联中,所以正常情况下删除该设备是删除不了的。

讯雷下载全部连接的问题,高手进,拜谢
迅雷安装时要将鼠标右键菜单写入注册表的,你重装了系统,注册表当然就没那些东东了,可以手工改一下,还要复制一个什么文件到SYSTEM32文件夹下,不过那太麻烦了,不如重新装一下迅雷。

关于touch3的问题,高手进~~~
MCO86LL是机器的型号,可以得知你的机器是美版的!不是国行 1A021ZET75J是机身的序列号,可以官网查询保修 激活时间2010.7.17。已经过了保修期了。可以请采纳~

新电动车充电六小时就满,有问题吗?
在未用了电的情况下就充电了,是七个小时就满了,你的是十四安容量的吧?正常的

相似回答