EDN首页   博客首页

日志档案

发表于 2008-6-29 22:34:06

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   |   来源: 转贴   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(204)    回复(0)  

投一票您将和博主都有获奖机会!