⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 delay.c

📁 AVR-GCC的三个级别的延时程序
💻 C
字号:
#include "avr/io.h"
#include "util/delay.h"
#define uchar unsigned char
#define uint unsigned int

#define xtal 8


//****************此函数是在8M条件下得出的准1ms延时**********************//
//****************当使用4M时延时翻倍,因而减半参数即可*******************//


void delay1ms(uchar y)
{
asm  volatile("push r22"::);
asm  volatile("push r23"::);
asm  volatile("d1: ldi r23,205"::);
asm  volatile("d2: ldi r22,12"::);
asm  volatile("d3: dec r22"::);
asm  volatile("brne d3"::);
asm  volatile("dec r23"::);
asm  volatile("brne d2"::);
asm  volatile("dec r24"::);
asm  volatile("brne d1"::);
asm  volatile("pop r23"::);
asm  volatile("pop r22"::);

}

//****************此函数是在8M条件下得出的准1us延时**********************//
//****************当使用4M时延时翻倍,因而减半参数即可*******************//

void delay1us(unsigned char x) 
{ 
        asm  volatile("dus: dec r24" ::); 
        asm volatile("nop" ::); 
		asm volatile("nop" ::); 
        asm volatile("nop" ::);
        asm volatile("nop" ::); 
		asm volatile("nop" ::); 
        asm volatile("brne dus" ::); 
} 


//****************此函数是在8M条件下得出的准1s延时**********************//
//****************当使用4M时延时翻倍,因而减半参数即可*******************//
void delay1s(uchar z)
{
asm  volatile("push r22"::);
asm  volatile("push r23"::);
asm  volatile("push r25"::);
asm  volatile("ds0: ldi r25,250"::);
asm  volatile("ds1: ldi r23,248"::);
asm  volatile("ds2: ldi r22,42"::);
asm  volatile("ds3: dec r22"::);
asm  volatile("brne ds3"::);
asm  volatile("dec r23"::);
asm  volatile("brne ds2"::);
asm  volatile("dec r25"::);
asm  volatile("brne ds1"::);
asm  volatile("dec r24"::);
asm  volatile("brne ds0"::);
asm  volatile("pop r25"::);
asm  volatile("pop r23"::);
asm  volatile("pop r22"::);  	   
	   
	    
}


//网上精确延时1MS
void delay_1ms(void)
{
uint i;
for(i=0;i<(unsigned int)(xtal*143-2);i++);
}

//网上精确延时MS级别

void delay_ms(uint num)
{
uint i;
for(i=0;i<num;i++) delay_1ms();
}

//网上精确延时us级别
void shortdelay(unsigned char tt)
{
        asm("_L2: subi R16,1");  
        asm(" nop"); 
        asm(" brne _L2");
        asm(" nop");
        asm(" ret");
}





void delayms(uint t)

{uint i;

for(i=0;i<t;i++)
_delay_loop_2(8 * 250);  //此处8表示8MHZ,可以根据频率更改;  t=999时十分接近1s;

}

void delayus(uint t)
{t=t*2;
 while(--t>0);           //接近于1us  ,t=100,为99us,误差已经很小了
 }


int main(void)
{
 DDRB=0XFF;
 PORTB=0X00;
 while(1)
 {
  //delayms(999);
  shortdelay(200);
   
  PORTB=PORTB+1;
}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -