谢谢各位的解释 |
第一个延时有问题 |
第一个没执行 ,第二个执行了,可是设个断点自行验证的 |
延时的本质是让程序处于一种什么都不做的状态(cpu在工作),相当于空耗一段时间 |
图一的DELAY里面是空的,DELAY就只延时了一个指令周期的时间.LED在高速的开关 |
第一个delay函数写的不对,也起不到延时的作用,没有运行程序。 |
第一个没延时,你把第二个Delay(20000)改成Delay(20)或更小,会出现“常亮”(其实在闪)效果,事实上只要有delay延时执行,LED都在闪烁,只是如果延时时间太短时,由于人视觉暂留原因,看不出来闪烁现象。 顺便@论坛管理员 能不能搞一个,评论2分钟内可以撤销的功能??? |
第一张是错的,没有延时,而且,开始你给的是低电平,它亮可能不是你程序使它亮的。它亮可能相当于指示的意思。 |
图一的延时没有定义一个函数,你调用也是没有的。图二你在主程序前定义了延时函数。 |
第一个延时函数只有申明,没有实体,编译时就会报警,延时函数无法定位,所以链接以后该地址仍为0000,这样主程序执行第一条命令LED=0以后,又跳回0000重新开始,于是反复执行第一条指令。 C:0x0000 020017 LJMP STARTUP1(C:0017) 4: void main(void) 5: { 6: while(1) 7: { 8: led=0; C:0x0003 C2A1 CLR led(0xA0.1) 9: delay(20000) C:0x0005 7F20 MOV R7,#0x20 C:0x0007 7E4E MOV R6,#0x4E C:0x0009 120000 LCALL C_STARTUP(C:0000) 第二个图的程序也不能通过编译,因为延时函数头后面多了个“ ;”,变成了函数申明 void delay(unsigned int i); { unsigned int x; for(x=0;x<i;x++); } |
你只声明了延时函数,并没有写延时子程序呀,所以调用无效。 |
赞同5楼说法 |
第一个无延时~第二个有延时。 |