EDN首页   博客首页

1

关于投票
AVR微秒级与毫秒级精确延时

AVR微秒级与毫秒级精确延时

/*******************************************************************

                             微秒级精确延时(ICC)

*******************************************************************/

include <iom8v.h>
/*======================================
 微秒级精确延时函数,晶振8M:          
 Delay = 0.125 *((tt*4-1)+9)微秒
 其中9包括了调用方的 r16 赋值 1t
 rcall 3t    nop 1t   ret 4t
 brne指令在当判断条件不成立时是单周期
 最后一次判断只有1个周期,补一个nop
 简化计算 = 0.5tt + 1 (us)
======================================*/
void shortdelay(unsigned char tt)
{
        asm("_L2: subi R16,1"); 
        asm(" nop")
        asm(" brne _L2");
        asm(" nop");
        asm(" ret");
}

void main()
{
        shortdelay( 18 );
        while(1)        {
                shortdelay( 48 );
        }
}

 

/************************************************************************

                                        毫秒级精确延时(ICC)

*************************************************************************/

#include<iom8v.h>

#define xtal 8 //以MHz为单位,不同的系统时钟要修改。

void delay_1ms(void)
{
uint i;
for(i=0;i<(unsigned int)(xtal*143-2);i++);
}


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

void main(void)
{
DDRB=0xff;
PORTB=0x00;

while(1)
{
delay_ms(100);
PORTB^=0xff;
}
}

系统分类: 单片机
用户分类: 学习AVR
标签: 无标签
来源: 转贴
发表评论 阅读全文(213) | 回复(0)
总共 , 当前 /