重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
如果是单片机上,是有可能的
创新互联公司从2013年创立,先为綦江等服务建站,綦江等地企业,进行企业商务咨询服务。为綦江企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
单片机12M晶振执行一条指令1us,所以C语言1us延时程序 用12M晶振延时1us,用—_nop_();
#includeintrins.h //头文件
_nop_(); //这一个语句表示1us延时
C语言的延迟函数一般是利用无意义程序运行来控制时间从而达到延时的目的
举个例子:
for(i=0;ix;i++)
for(j=0;j120;j++);
这是延时x毫秒的for循环语句。
值得注意的是记得最后的;一定得记得写。
延迟函数,一般建议调用系统函数。不建议循环。
特别是多任务操作系统,循环会消耗系统资源。
如果是Dos,indows,linux系统建立调用 Sleep()函数。
其他系统,请自行查找。
单片机的C语言关于延时函数主要有两种
一种是用for循环,通过单片机执行空指令达到延时的目的
如:
for(i=0;i100;i++)
{
;
}
这个简单的语句会执行100次空指令
每一次指令的时间可以大概确定
因此这个是最简单的延时函数
第二种是通过定时器的方式来实现
定时器是通过对单片机的晶振进行计数
然后在定时器中断服务函数里面实现定时时间的计算及设置
51单片机的定时器0中断服务函数为
void
time0()
interrupt
1
{
...
}
你是用pc还是用单片机啊?
pc的当然速度快了。
那要看pc的时钟才能做1ms的延时:
void delay(unsinged long n){....}
中间要加空语句的,但是pc实际上没哟这么用的。
要是单片机。
12M的晶振就是(非1T的)
void delay(unsinged int)
{
inti,j;
for(j=0;jn;j++)
for{i=0;i125;i++}{;}
}
假设一个延时函数如下:
void delay()
{
uint i;
for(i=0;i20000;i++);
}
我们怎么来算呢,先将20000转成16进制,得到4E20,然后将高字节4E乘以6得到468D,再将468+2=470,然后将470D*20HEX(即32D)=15040;所心这个延时函数总共要执行15040个周期,假设所用的晶振为12MHZ,则该段函数总延时:15.04ms。
有了这个公式我们如果想要设定指定的延时长度就可以用它的己知公式确定。即:总时间=[(6*i值的高8位)+2]*i的低8位。
例如:设要延时125ms。
我们将低字节先赋值200D*(即:C8),然后再算高低节的定值,由式中可知125ms=200*((i值的高字节*6)+2),又可推算出(高低节*6)+2的总延迟时间应等于625us,将625/6=104.1666,取整数得到104,将104转成16进制得到68H,再将高字节和低字节组合起来即得到了定值,即:68C8HEX,代入函数即如下:
void delay()
{
uint i;
for(i=0;i0x68C8;i++);
}
如果写直进行就要将68C8转成10进制,即:26824,代入后得到:
void delay()
{
uint i;
for(i=0;i0x26824;i++);
在c语言中嵌入一段汇编的延时程序呀,你自己看看书,很简单的
用在单片机里的可以C和汇编混合使用,因为用汇编编写延时要准确些,所以你不妨写一个汇编程序,然后再调用它好了,要用C来编精确的延时确实是比较难的哦.呵呵
谁说C语言不能精确延时,用51单片机的定时/计数器一或者用定时/计数器2的工作方式2,自动再装入8位计数器,就可以精确延时,别说1MS了就是100um也能精确做到。
其实很简单,采用定时器,将需要定时时间算好后写入单片机中断程序中即可,这种方法可以实现精确定时,最终的误差仅由晶振来确定了。
不错,用定时器最准确。但是定时器数量有限,有时候不见得能够用。比如温度检测(尤其是变化比较大、快的),一个定时器就得一直不停检测。这个时候如果另外一个定时器有正好分配的其他任务,就只有用其他方法延时了。
空循环就行了
如while(i--);根据i的不同决定了延时长短
不过C的延时不是非常准确,你得根据反汇编,看汇编语句的数量和指令周期来计算时间
也可以是
void mDelay(unsigned int Delay) //Delay = 1000 时间为1S
{
unsigned int i;
for(;Delay0;Delay--)
{
for(i=0;i124;i++)
{;}
}
}