CVAVR 软件中启动delay库,调用delay_ms()函数,自动带了喂狗程序
- 格式:doc
- 大小:37.00 KB
- 文档页数:5
c延时函数delay延时函数(delay function)是一种在程序中用来暂停一段时间的函数。
在C语言中,延时函数通常用于需要控制时间间隔的应用程序中,例如时钟、定时器、动画等。
在C语言中,实现延时函数有多种方法,下面将介绍两种常用的方法。
1.使用循环计数法延时函数最常见的实现方式之一是使用循环计数法。
具体步骤如下:-接收一个参数,表示延时的毫秒数;-将参数转换为循环需要的次数。
在现代计算机中,循环一次通常需要几十纳秒到几百纳秒的时间,因此需要将毫秒数转换为相应的循环次数;-使用一个循环来延时,每次循环后递减计数器,直到计数器为0。
下面是一个使用循环计数法实现的延时函数的示例代码:```c#include <stdio.h>#include <stdlib.h>void delay(int milliseconds)for(int i = 0; i < iterations; i++)//什么都不做,只是进行循环迭代}printf("Before delay\n");delay(1000); // 延时1秒printf("After delay\n");return 0;```2.使用标准库函数- `sleep(`函数:使程序休眠指定的秒数。
参数是休眠的秒数。
下面是使用`usleep(`函数实现延时的示例代码:```c#include <stdio.h>#include <stdlib.h>#include <unistd.h>void delay(int milliseconds)usleep(milliseconds * 1000); // 将毫秒转换为微秒int maiprintf("Before delay\n");delay(1000); // 延时1秒printf("After delay\n");```无论是使用循环计数法还是使用标准库函数,延时函数都有一定的局限性。
早就知道AVR的编译器有自带的延时子函数(或者说是头文件),但一直没时间一探究竟,今天终于揭开了其内幕。
AVR编译器众多,可谓是百家齐鸣,本人独尊WinAVR.说明:编译器版本WinAVR-20080610先说winAVR的_Delay.h_肯定是在Include文件夹下了,进去一看果然有,可打开一看,其曰:“This file has been moved to<util/delay.h>."在util文件夹中找到delay头文件如下:--------------------------------------------------------------------------------------------------------------------------------------------void_delay_us(double __us){uint8_t __ticks;double __tmp = ((F_CPU) / 3e6) * __us; //3e6=3000000if (__tmp< 1.0)__ticks = 1;else if (__tmp> 255){_delay_ms(__us / 1000.0);return;}else__ticks = (uint8_t)__tmp;_delay_loop_1(__ticks);}-----------------------------------------------------------------------------------------------------------------------------------------------_delay_ms(double __ms){uint16_t __ticks;double __tmp = ((F_CPU) / 4e3) * __ms;if (__tmp< 1.0)__ticks = 1;else if (__tmp> 65535){// __ticks = requested delay in 1/10 ms__ticks = (uint16_t) (__ms * 10.0);while(__ticks){// wait 1/10 ms_delay_loop_2(((F_CPU) / 4e3) / 10);__ticks --;}return;}else__ticks = (uint16_t)__tmp;_delay_loop_2(__ticks);}1、分析程序发现上面两个子函数,分别using _delay_loop_1() and using_delay_loop2()2、还有一点,用此头文件时,必须设置主频和优化项,否则会出现如下提示:#ifndef F_CPU/* prevent compiler error by supplying a default */# warning "F_CPU not defined for <util/delay.h>"# define F_CPU 1000000UL#endif#ifndef__OPTIMIZE__# warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"#endif3、通过查找发现_Delay_loop1()和_Delay_loop2()在文件delay_basic.h中,如下:/** \ingrouputil_delay_basicDelay loop using an 8-bit counter \c __count, so up to 256 iterations are possible. (The value 256 would have to be passedas 0.) The loop executes three CPU cycles per iteration, not including the overhead the compiler needs to setup the counter register.Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds can be achieved.*/上面翻译如下:循环变量为8位,所以可达256(其值256和0等同),每次循环好执行3个CPU时钟,不包括程序调用和退出该函数所花费的时间。
CodeVisionA VR V ersion 1.24.7 User Manual 读书笔记1、CodeVisionA VR 是一个交互的C 编译器,有完整的IDE和自动生成初始化程序的功能,并且支持A VR系列的微控制器。
2、CV A VR编译器几乎完全贯彻了ANSI C语言的标准,为了更好地支持A VR 微控制器和对嵌入式系统的需要,CV A VR进行了专门的优化处理。
3、CV A VR编译生成的“COFF”(一种通用的对象文件格式(Common Object File Format))目标文件支持C源代码级的调试,例如变量观察;同时“COFF”也能在A VR的官方调试仿真工具“Atmel A VR Studio debugger ”中进行仿真调试。
4、CV A VR的IDE内建了A VR在线编程功能,能自动传输二进制代码文件到A VR芯片上。
并且对大多数常用的的串并在线ISP编程提供了界面友好的支持。
(我也用它来烧写芯片)5、CV A VR还提供了一个在调试时很有用的串口终端,能接收来自微控制器传过来的实时调试信息(这是很有用的一个功能,一般调试单片机程序有接LED显示调试参数,软件仿真,硬件仿真,和通过串口实时传输调试信息到PC上)。
6、除了标准的C语言函数库外,CV A VR 还提供了一些专用的库,例如:* Alphanumeric LED modules* Philips I2C bus* National Semiconductor LM75 Temperature Sensor* Philips PCF8563, PCF8583, Maxim/Dallas Semiconductor DS 1302 and DS1307 Real Time Clocks* Maxim/Dallas Semiconductor 1 Wire protocol* Maxim/Dallas Semiconductor DS1820, DS18S20 and DS18B20 Temperature Sensors * Maxim/Dallas Semiconductor DS1621 Thermometer/Thermostat* Maxim/Dallas Semiconductor DS2430 and DS2433 EEPROMs* SPI* Delays* Gray code conversion7、CV A VR IDE 有强大的自动生成初始化A VR单片机内部集成的硬件功能的代码功能。
延时程序计算公式CV A VR中提供了2个延时函数:The functions are:void delay_us(unsigned int n)generates a delay of n mseconds. n must be a constant expression.void delay_ms(unsigned int n)generates a delay of n milliseconds.This function automatically resets the watchdog timer every 1ms by generating the wdr instruction.其中delay_us(unsigned int n)要求n是常数,因为us要准确,使用变量的话会大大影响精度。
1us执行的指令不多。
在C程序中调用delay_us()后,你可以看生成的ASM代码,它不是使用CALL,而是用的宏,嵌入了一段代码。
当你系统时钟为1M时,调用delay_us(1)还会编译出错,因为嵌入的一段代码,已经超过了1us!而delay_ms(unsigned int n)中的N就可以是变量,它生成的汇编是采用CALL调用函数,两者不同。
另外,在delay_ms()中还清WDT(就是你使用了WDT,也能使用该函数)。
作为通用的delay_ms(),代码当然多了点。
以上可以查看CV A VR编译后产生的LST文件。
1。
没有好的汇编基础,和对A VR的彻底透彻的掌握,一般人写不出比它还要优化的通用代码。
2。
我已经说过多少遍了。
在实际的系统中尽量不要使用软件延时,浪费资源不说,系统很难做到并行处理。
因此对于10us以下的延时,考虑直接嵌入汇编的_nop_指令。
10-100us可以适当考虑使用delay_us(),而大于100us的延时,应该采用定时器中断了。
/************************************************************** ****/A VR单片机的指令,从执行每条指令的时钟数分:单时钟指令、双时钟指令、三时钟指令、四时钟指令4种,A VR单片机在外接8MHZ 晶振时,单时钟指令:ADC为例,每us(微秒)可以执行8条,即每条指令用时0.125us。
AVR的精确延时程序(2009-12-28 06:41:30)标签:avr延时杂谈分类:技术1.毫秒级的延时延时1ms;void delay_1ms(void){unsigned int i;for(i=1;i<(unsigned int)(xtal*143-2_;i++);}在上式中,xtal为晶振频率,单位为MHz.当晶振频率为8M时,延时函数软件仿真的结果为1000.25μs.当晶振频率为4M时,延时函数软件仿真结果为999.5μs.如果需要准确的1ms延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值,并且循环中还必须关闭全局中断,防止中断影响延时函数的延时时间。
下面的函数可以获得1ms的整数倍的延时时间:void delay(unsigned int n){unsigned int i;for(i=0;i<n;i++)delay_1ms();}如果需要准确的延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值.2.微秒延时晶振频率为8MHz时1μs延时函数:void delay_1us(void){asm("nop");}当然也可以使用宏定义来实现1μs延时:#define delay_1us();asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop")如果小于1μs的延时,只有使用宏定义实现,当然,也可以直接插入在线汇编asm("nop");语句实现延时。
在程序中需要微秒级的延时时,可以用以下函数实现。
void delay_us(unsigned int n){unsigned int i;for(i=0;i<n;i++)delay_1us();}说明:如果需要准确的延时时间,则还必须关中断,并通过软件仿真后,再确定循环的次数及循环初值.强调:在实际应用中一般不直接使用软件进行长时间的延时,因为MCU一直停留延时函数中(称为阻断),不能再干其它的事睛(除了中断外),只有非常简单的应用或者简单的演示时才能使用延时函数实现长时间延时。
c语言精确delay函数C语言中的精确延时函数是指能够以指定的时间精确延迟程序执行的函数。
在实际开发中,我们经常会遇到需要程序暂停一段时间的情况,这时就需要使用延时函数来实现。
在C语言中,常用的延时函数有两种,一种是使用循环来实现延时,另一种是使用系统提供的延时函数。
下面将详细介绍这两种方法的实现原理及其使用场景。
1. 循环延时法循环延时法是通过循环来实现延时的方法,其原理是让程序在一个循环中空转一段时间,从而达到延时的效果。
具体实现代码如下:```cvoid delay(unsigned int ms){unsigned int i, j;for(i = 0; i < ms; i++)for(j = 0; j < 10000; j++);}```上述代码中,delay函数接收一个参数ms,表示要延时的毫秒数。
函数内部使用两个嵌套的循环,外层循环控制延时的次数,内层循环则是一个空转的过程,通过调整内层循环的次数来控制延时的时间。
循环延时法的优点是简单易懂,适用于较简单的延时场景。
但是由于循环的执行时间受到处理器的影响,不同的处理器执行相同的循环时间可能会有差异,因此不能保证延时的精确性。
2. 系统延时函数系统延时函数是通过调用系统提供的函数来实现延时的方法,其原理是让程序暂停一段时间,从而达到延时的效果。
具体实现代码如下:```c#include <unistd.h>void delay(unsigned int ms){usleep(ms * 1000);}```上述代码中,delay函数接收一个参数ms,表示要延时的毫秒数。
函数内部使用usleep函数来实现延时,usleep函数的参数是微秒,所以需要将毫秒转换为微秒。
系统延时函数的优点是精确可靠,适用于对延时精度要求较高的场景。
由于系统延时函数是由操作系统提供的,可以保证延时的精确性,不受处理器的影响。
C语言中的精确延时函数有循环延时法和系统延时函数两种方法,根据实际需求选择合适的方法来实现延时。
c延时函数delay
c语言中的延时函数delay函数是一种简单的延时函数,它能够在程序中帮助我们指定一段时间内暂停一段时间,它可以帮助我们控制程序的运行速度。
delay函数在多种编程语言中均有实现,而在c 语言中,只需要在代码中增加delay函数就可以实现延时的效果。
delay函数的使用非常简单,只需要在程序中添加delay函数,并指定延时时间即可实现延时功能。
delay函数的语法如下所示:delay(time);其中time参数是指定延时时间,单位为毫秒(ms)。
以下是一个C程序,它演示了在程序中使用delay函数实现延时功能: #include <stdio.h>
#include <windows.h>
int main()
{
tprintf(Program starts.
tSleep(3000); //Delay for 3 seconds
tprintf(Program continues.
treturn 0;
}
在这段代码中,我们使用delay函数Sleep()来指定程序延时3秒钟来实现延时功能。
另外,delay函数也可以被用作测试程序的工具,可以用它来观察程序的运行情况,这可以帮助我们更好地了解程序的执行细节,并及时发现可能出现的问题。
总之,delay函数是一种非常有用的函数,用它可以在程序中控制程序的运行速度,也可以做到测试程序运行状态的功能,使得我们在运用c语言开发软件的过程中可以轻松的实现延时功能。
CVAVR库函数介绍1.I/O口操作函数:CVAVR提供了一系列的I/O口操作函数,可以对单片机的I/O口进行读写操作。
例如,包括设置引脚为输入或输出、读取引脚状态、设置输出引脚电平等功能。
2.定时器相关函数:CVAVR包含了定时器相关的函数,可以方便地配置和使用单片机的定时器。
例如,包括设置定时器的计数模式、设置定时器的计数值、启动和停止定时器等功能。
3.中断相关函数:CVAVR提供了中断相关的函数,可以方便地配置和使用单片机的中断功能。
例如,包括使能和禁止中断、设置中断触发条件、中断优先级等功能。
4.串口通信函数:CVAVR提供了串口通信的相关函数,可以方便地实现单片机与外部设备的串口通信。
例如,包括配置串口通信的波特率、发送和接收数据、检查接收缓冲区是否为空等功能。
5.LCD显示函数:CVAVR包含了针对LCD显示器的函数,可以方便地控制单片机与LCD显示器的交互。
例如,包括初始化LCD显示器、写入字符或字符串到指定位置、清除LCD显示内容等功能。
6.ADC采样函数:CVAVR提供了ADC采样的函数,可以方便地实现模拟信号的采样。
例如,包括配置ADC的参考电压、设置ADC的通道、启动ADC转换等功能。
7.PWM波产生函数:CVAVR包含了PWM波产生的函数,可以方便地实现单片机的PWM输出功能。
例如,包括设置PWM输出的占空比、设置PWM输出的频率等功能。
8.温度传感器函数:CVAVR提供了用于温度传感器的函数,可以方便地读取温度传感器的数据。
例如,包括初始化温度传感器、读取温度传感器的数据等功能。
9.蜂鸣器函数:CVAVR包含了用于控制蜂鸣器的函数,可以方便地实现单片机对蜂鸣器的控制。
例如,包括使能或禁止蜂鸣器、设置蜂鸣器的频率等功能。
10. 存储器操作函数:CVAVR提供了存储器操作的函数,可以方便地读写单片机的EEPROM或Flash存储器。
例如,包括写入数据到EEPROM、从EEPROM读取数据、写入程序代码到Flash等功能。
AVRGCC延时库函数的理解WinAVR20081205 延时函数:void_delay_loop_1(uint8_t __count){__asm__ volatile ("1: dec %0" "\n\t""brne 1b": "=r" (__count): "0" (__count));}准确延时是3*__count个时钟周期(0<__count<256)void_delay_loop_2(uint16_t __count){__asm__ volatile ("1: sbiw %0,1" "\n\t""brne 1b": "=w" (__count): "0" (__count));}准确延时是4*__count+1个时钟周期(0<__count<256*256-1)_delay_loop_1() 最小延时是3个时钟周期,最大延时是256*3个时钟周期_delay_loop_2() 最小延时是4+1个时钟周期,最大延时是256*256*4+1个时钟周期void_delay_us(double __us){uint8_t __ticks;double __tmp = ((F_CPU) / 3e6) * __us;if (__tmp < 1.0)__ticks = 1;else if (__tmp > 255){_delay_ms(__us / 1000.0);return;}else__ticks = (uint8_t)__tmp;_delay_loop_1(__ticks);}void_delay_ms(double __ms){uint16_t __ticks;double __tmp = ((F_CPU) / 4e3) * __ms;if (__tmp < 1.0)__ticks = 1;else if (__tmp > 65535){// __ticks = requested delay in 1/10 ms__ticks = (uint16_t) (__ms * 10.0);while(__ticks){// wait 1/10 ms_delay_loop_2(((F_CPU) / 4e3) / 10);__ticks --;}return;}else__ticks = (uint16_t)__tmp;_delay_loop_2(__ticks);}_dealy_us()最小延时与_delay_loop_1()相同,是3个时钟周期,_delay_us(0)就是最小延时,相当于_delay_loop_1(1),在8M时钟下,_delay_us(0.375)也是最小延时(0.375us是3个时钟周期)_delay_us(0.7499999)仍然是最小延时,相当于_delay_loop_1(1),而_delay_us(0.74999999)则相当于_delay_loop_1(2)了。
CVAVR库函数介绍CVAVR是一款嵌入式开发的集成开发环境,它提供了许多库函数用于简化嵌入式系统的编程。
这些库函数涵盖了各种常见的功能,包括数字输入输出、模拟输入输出、串口通信、定时器、中断等。
在下面的文章中,我将逐一介绍CVAVR库函数的一些重要功能。
一、数字输入输出库函数1.GPIO库函数:这些函数允许控制单片机的引脚状态,包括设置引脚输出、读取引脚输入、设置引脚上拉电阻等。
2.LED库函数:这些函数提供了对LED的控制,包括设置LED亮度、开关灯等。
3.数码管库函数:这些函数提供了对数码管的控制,包括显示数字、设置亮度等。
二、模拟输入输出库函数1.ADC库函数:这些函数允许读取模拟信号,包括设置ADC通道、读取ADC转换结果等。
2.PWM库函数:这些函数提供了对PWM信号的生成,包括设置PWM频率、占空比等。
三、串口通信库函数ART库函数:这些函数提供了对串口通信的控制,包括初始化串口、发送数据、接收数据等。
四、定时器库函数1. Timer库函数:这些函数提供了对定时器的控制,包括设置计数器的计数范围、中断处理函数等。
五、中断库函数1. Interrupt库函数:这些函数提供了对中断的控制,包括开启中断、关闭中断、设置中断优先级等。
以上只是CVAVR库函数的一部分功能,还有其他许多功能未一一列举。
这些库函数使得嵌入式开发变得更加简单和高效,极大地提高了开发效率。
通过使用CVAVR库函数,开发者可以更加专注于业务逻辑的实现,而不必花费过多的精力在底层驱动的编写上。
CVAVR库函数具有良好的兼容性和易用性。
它们通过简单的函数调用接口,使得开发者轻松地使用各种功能。
此外,CVAVR还提供了详细的文档和示例代码,帮助用户更快地熟悉和掌握库函数的使用方法。
这些文档和示例代码覆盖了大部分的应用场景,开发者可以根据自己的需求选择合适的函数进行开发。
尽管CVAVR库函数功能丰富、易用,但也存在一些限制。
c语言延时函数delay用法
delay函数是c语言中的延时函数,是在程序的特定时机给程序设定一段固定的延时从而使程序实现暂停,从而达到控制程序逻辑运行的目的。
一、delay函数的用法:
1、函数说明:delay函数的原型为:void delay(unsigned int ms),其中ms表示毫秒。
2、函数功能:该函数用于按设定的毫秒数作出延时;函数执行时程序停止运行,所以用这个函数时需要将它放在需要延时的程序中;
3、函数用法:delay函数一般用于遥控程序,让程序具备一定的定时功能和延时功能。
4、函数使用示例:
delay(1000); //程序暂停1s
二、delay函数注意事项:
1、delay函数只能精确到毫秒,误差范围为 ±20ms,所以不适用于对时间要求较为严格的情况;
2、为了更加精确,可以使用带循环的delay函数,例如for循环嵌套delay函数;
3、一般使用delay函数时,一定要注意,要给函数设定一个合理的参数;
4、delay函数运行时会阻塞程序,如果延时时间比较长,可能会造成程序出现不可知的错误;
5、使用delay函数时,可以使用轮询的方式,使之在节省时间的同时也能实现延时的目的;
6、如果程序要求暂停较短时间,可以使用void pause()函数来暂停程序运行而不是利用delay函数;
7、delay函数一般只能用于短期延时,如果需要长期延时,则可以使用其他系统函数,如Sleep()或Suspend()系统函数代替;
8、关于delay函数的使用,要根据具体情况选择合适的参数,如ms应该在100~1000范围内,以达到精确控制程序的运动时间。