51单片机 用c语言 调用-nop- 编一个 延时一秒 程序

如题所述

这么给你说吧,不同的编译器同样的C语言语句编译出来的时间不完全一致,举个简单例子;
for(i=0,i<=100;i++)
for(j=0;j<=10;j++);

for(i=0,i<=10;i++)
for(j=0;j<=100;j++);
其实理论上来讲,这个时间都是一个指令周期*10*100,对吧,但是实际效果而讲,这两个时间不一样,都知道可以实现跳转的指令机器周期有几种,到底编译器是如何实现的,我们可以通过编译之后看它对应的汇编语句(编译器中一般都可以看到),然后通过计算汇编的时间,才基本能确定你用C编译之后这个延时程序到底延时多少,如果你换个编译器,比如从keil转到wave,又不能确定时间是否一致;其实你到网上看看,对于时间要求很严格的地方,延时程序基本都是汇编写的,大不了是C和汇编嵌套,或者用定时器;如果你说的是大概一秒的话,那么你百度一下就是一大堆;我做个一个表,即使用定时器,藐视很准确,其实走上一天可能就差几秒甚至几分钟,因为C语言中的中断程序,以及每次进入中断退出中断的指令周期,这些你都要考虑在内,这样你才能做的很准;有点说偏题了。我的意思就是你要真的要把一秒作准,请用汇编或参考汇编,还要把每个语句的执行时间考虑在内,这样你才能做的很准确追问

C语言中 怎样嵌入 汇编的 求教

追答

具体的做法太多了,刚给你搜索了一下,百度中答案相当多,顺便给你找了一个,我感觉写的挺详细的,希望对你有帮助,http://wenku.baidu.com/view/30d7a98a6529647d272852d9.html
比如#include "reg52.h"

void main()
{
P2=1;
#pragma asm
mov P3,#55h
#pragma endasm
P2=0;
while(1);
}

这是我刚刚弄的一个示例;

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-03
你的意思是完全用_nop()_延时1s?
这太坑爹了吧
用定时器吧
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
TR0=1;
中断里面来个++count>=20就是1s啊
比延时函数精确多了

51单片机 用c语言 调用-nop- 编一个 延时一秒 程序
如果你换个编译器,比如从keil转到wave,又不能确定时间是否一致;其实你到网上看看,对于时间要求很严格的地方,延时程序基本都是汇编写的,大不了是C和汇编嵌套,或者用定时器;如果你说的是大概一秒的话,那么你百度一下就是一大堆;我做个一个表,即使用定时器,藐视很准确,其实走上一天可能就差...

单片机C51中c语言函数(-nop-())求助
extern void _nop_ (void); \/\/空操作,相当于8051的NOP指令 extern bit _testbit_ (bit); \/\/测试并清零位,相当于8051的JBC指令 extern unsigned char _cror_ (unsigned char, unsigned char); \/\/字符循环右移 extern unsigned int _iror_ (unsigned int, unsigned char...

51单片机c语言里 _nop_ 函数怎么用?
在单片机c语言中直接调用库函数即可,具体如下:include<intrins.h> \/\/ 声明了void _nop_(void);_nop_(); \/\/ 产生一条NOP指令。该函数的作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M...

_nop_在c语言里怎么用呢?
在c语言里没有这个_nop_函数,这个函数是在51单片机里使用的。作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。

哪位高手知道 单片机精确延时1秒得C语言子程序 谢谢了
程序如下:DELAY:MOV 72H,#100 LOOP3:MOV 71H,#100 LOOP1:MOV 70H,#47 LOOP0:DJNZ 70H,LOOP0 NOP DJNZ 71H,LOOP1 MOV 70H,#46 LOOP2:DJNZ 70H,LOOP2 NOP DJNZ 72H,LOOP3 MOV 70H,#48 LOOP4:DJNZ 70H,LOOP4 定时器延时:晶振12MHZ,延时1s,定时器0工作方式为方式1 DELAY1:MOV ...

51单片机c语言 _nop_()是一个空指令?短时间延时的?空几个机器周期?
这个_nop_()等效与汇编里面的,NOP指令,也就是空一个机器周期,如果是传统51单片机的话,等于空12个时钟周期【即一个机器周期】,操作方法如下:1、首先,可以利用keil来进行模拟实验,观察软件所显示的数值,然后再进行相关的运算,即可得出结果。2、在使用keil进行模拟之前,要“模拟”给单片机各个口...

单片机延时一秒的c程序
单片机延时一秒 程序是不固定的 要根据你的晶振 计算出一次循环执行需要的时间 然后 写循环次数 一般是 void delay_one_second(void){ int i; for(i = 0; i < TIMES; i++);}这样就可以了。 TIMES是要计算的。或者 根据示波器 自己尝试。

51单片机延时1us,12M晶振怎么用c语言写
51单片机12M晶振延时1us,只需要执行一个NOP就是了。C语言中也是如此。include<reg51.h> include<intrins.h> main(){ _nop_(); \/\/延时1us while(1);}

C中 nop()函数如何实现1us延时?
C语言中的_nop_()指令,堪称编程中的“静默使者”,看似简单,实则在关键时刻发挥着微妙作用。在51单片机的世界里,当晶振频率设定为12兆赫兹时,_nop_()指令的延时效果相当于一个周期,即1微秒。这看似微不足道,但在追求效率和精准控制的编程世界里,每一分每一秒都至关重要。C语言,作为一门广...

急求一个用51单片机编的可按键调时的数字时钟程序,数码管显示,C语言...
\/\/ 延时程序void delay(unsigned char ms){while(ms--){unsigned char i;for(i = 0; i< 250; i++) {_nop_(); \/\/执行一条_nop_()指令为一个机器周期_nop_();_nop_();_nop_();}}}\/\/测试LCD忙碌状态bit lcd_busy(){bit result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_...

相似回答