推荐阅读最新更新时间:2024-03-16 14:42
关于51单片机中C语言编写的精确延时函数
有些特殊的应用会用到比较精确的延时(比如DS18B20等),而C不像汇编,延时精准度不好算。本人经过反复调试,对照KEIL编译后的汇编源文件,得出了以下几条精确延时的语句(绝对精确!本人已通过实际测试),今天贴上来,希望对需要的朋友有所帮助 sbit LED = P1^0; // 定义一个管脚(延时测试用) unsigned int i = 3; // 注意i,j的数据类型, unsigned char j = 3; // 不同的数据类型延时有很大不同 //-----------------各种精确延时语句----------------------------------- while( (i--)!=1 ); //
[单片机]
利用Keil u4调试,精确实现软件延时
用定时器延时,有时候显得有点麻烦,我们不如考虑软件精确延时,软件延时无非就是利用for或while多重循环。以前用到延时函数时,都是从网上下载别人写好的延时子程序。延时5ms,400ms,1s,……,这些延时函数的函数名中都清清楚楚地标明了延时的时间,可我一直不知道这些函数是如何编写的,确切地说,是如果根据延时时间来确定循环次数的。如果是纳秒级的延时,可以通过示波器来观察波形,或者反汇编一下,计算一下指令执行时间,但如果延时时间相对较长,示波器便无能为力了。这几天好好看了一下Keil调试,发现Keil的功能实在是太强大了。利用Keil uVersion的调试就可以写出精确的软件延时程序。以下是我的简单小结,文中所有程序都是在Xta
[单片机]
msp430之__delay_cycles精确延时的说明及改正
在这里, 我来讨论一下关于MSP430单片机使用__delay_cycles延时的问题. IAR for MSP430编译器提供了一个编译器内联的精确延时函数(并非真正的 函数)以提供用户精确延时使用, 该函数原型是: __intrinsic void __delay_cycles(unsigned long __cycles); 该内部函数实现__cycles个CPU周期的延时,但对于该参数的设置,我要陈述一下: __cycles需要我们传递的是CPU运行的周期个数 网上普遍的用法是: #define CPU_CLOCK 8000000 #define delay_us(us) __delay_cycl
[单片机]
用单片机C语言精确延时(定时)的方法
本人在闲暇的时候对单片机C语言下的各类延时程序做了下总结。由于单片机C语言下利用软件延时不容易做到精确的定时,所以很多人在编写延时子程序的时候不能好好的把握延时的具体时间。C语言下,延时程序主要有以下几种: 一: void delay(unsigned char k) { unsigned char i,k; //定义变量 for(i=0;i k;i++); //for循环语句 } 该程序在Keil环 境下, 会先将C语言转化成汇编语言 , 那么我们就可以根据汇编语言来计算出精确的时间,转化具体步骤如下: CLR A ;指令1 MOV R7,A ;指令2 LOOP: INC R7 ;
[单片机]
你会51单片机的精确延时吗
对于某些对时间精度要求较高的程序,用 c 写延时显得有些力不从心,故需用到汇编程序。本人通过测试,总结了 51 的精确延时函数(在 c 语言中嵌入汇编)分享给大家。至于如何在 c 中嵌入汇编大家可以去网上查查,这方面的资料很多,且很简单。以 12MHz 晶振为例,12MHz晶振的机器周期为 1us,所以,执行一条单周期指令所用时间就是 1us,如 NOP 指令。下面具体阐述一下。 若要延时 1us,则可以调用_nop_();函数,此函数是一个 c 函数,其相当于一个 NOP 指令 使用时必须包含头文件 intrins.h 例如: #include intrins.h #include reg52.h void m
[单片机]
IAR软件中的精确延时
在用单片机的时候常常会用到延时函数,430也不例外,常见的形式有: void delay(unsigned int ms) { unsigned int i,j; for( i=0;i ms;i++) for(j=0;j 1141;j++); //8MHz晶振时 } 以上程序段在要求延时精度不高的场合可以用。但是很多的时候要用到精确的延时。 在IAR软件中,自带有延时的库函数。 在intrinsics.h 头文件中可以查询得到。 __delay_cycles(x) x必须是常量或则是常量表达式,否则会报错的。x = 1时候是延时一个周期。 那么,如果这样定义的话 #define CPU_F ((double)8000000) #de
[单片机]
AVR的精确延时程序
C语言中,想使用精确的延时程序并不容易。IAR 中有这样的一个函数 __delay_cycles(),该函数在头文件intrinsics.h中定义,函数的作用就是延时N个指令周期。根据这个函数就可以实现精确的延时函数了(但不能做到100%精确度)。 实现的方法: 建立一个delay.h的头文件: #ifndef __IAR_DELAY_H #define __IAR_DELAY_H #include #define XTAL 8 //可定义为你所用的晶振频率(单位Mhz) #define delay_us(x) __delay_cycles ( (unsigned long)(x * XTAL) ) #define
[单片机]
单片机延时精确计算
在不同单片机中,有不同的单片机指令。每个指令都占用不同的时钟周期。一般延时程序就是通过循环去达到延时的作用。 下面以最基础的51单片机去做说明: 我这边用我之前debug过的2个延时程序,晶振使用12M: void delay_us_fun (unsigned int i) //us延时 { while (i--); } 这个是用来微秒级延时的,他在不同的参数i下,延时时间分别为实际为(9*i+16)us,这些延时的实际时间一般可以通过开发环境keil C51中模拟一下,看下时钟就知道了。 汇编好点的话也可以直接看汇编计算或者直接写汇编程序。 这时我们可以使用下面宏去调用上面的接口 #define _delay_
[单片机]