AVR单片机常用的延时函数

AVR单片机常用的延时函数
AVR单片机常用的延时函数

AVR单片机常用的延时函数

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

//C header files:Delay function for AVR

//MCU:ATmega8 or 16 or 32

//Version: 1.0beta

//The author:

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

#include

void delay8RC_us(unsigned int time) //8Mhz内部RC震荡延时Xus

{

do

{

time--;

}

while(time>1);

}

void delay8RC_ms(unsigned int time) //8Mhz内部RC震荡延时Xms

{

while(time!=0)

{

delay8RC_us(1000);

time--;

}

}

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

void delay1M_1ms(void) //1Mhz延时1ms

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=142;b>0;b--)

for(a=2;a>0;a--);

}

void delay1M_xms(unsigned int x) //1Mhz延时xms

{

unsigned int i;

for(i=0;i

{

delay1M_1ms();

}

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

void delay2M_1ms(void) //2Mhz延时1ms

{

unsigned char a,b;

for(b=4;b>0;b--)

for(a=248;a>0;a--);

NOP();

}

void delay2M_xms(unsigned int x) //2Mhz延时xms

{

unsigned int i;

for(i=0;i

{

delay2M_1ms();

}

}

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

void delay4M_1ms(void) //4Mhz延时1ms

{

unsigned char a,b,c;

for(c=7;c>0;c--)

for(b=8;b>0;b--)

for(a=34;a>0;a--);

}

void delay4M_1us(void) //4Mhz延时1us

{

NOP();

NOP();

}

void delay4M_xms(unsigned int x) //4Mhz延时xms

{

unsigned int i;

for(i=0;i

{

delay4M_1ms();

}

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

void delay73782M_1us(void) //7.3782Mhz延时1us

{

unsigned char a;

for(a=2;a>0;a--);

}

void delay73782M_1ms(void) //7.3782Mhz延时1ms

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=254;b>0;b--)

for(a=13;a>0;a--);

}

void delay73782M_xms(unsigned int x) //7.3782Mhz延时xms

{

unsigned int i;

for(i=0;i

{

delay73782M_1ms();

}

}

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

void delay8M_1ms(void) //8Mhz延时1ms

{

unsigned char a,b,c;

for(c=11;c>0;c--)

for(b=4;b>0;b--)

for(a=89;a>0;a--);

}

void delay8M_1us(void) //8Mhz延时1us

{

unsigned char a,b;

for(b=1;b>0;b--)

for(a=1;a>0;a--);

}

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

**********/

void delay12M_1us(void) //12Mhz延时1us

{

unsigned char a,b;

for(b=1;b>0;b--)

for(a=3;a>0;a--);

}

void delay12M_1ms(void) //12Mhz延时1ms

{

unsigned char a,b;

for(b=129;b>0;b--)

for(a=45;a>0;a--);

}

void delay12M_xms(unsigned int x) //12Mhz延时xms

{

unsigned int i;

for(i=0;i

{

delay12M_1ms();

}

}

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

void delay16M_1us(void) //16Mhz延时1us

{

unsigned char a,b;

for(b=1;b>0;b--)

for(a=5;a>0;a--);

}

void delay16M_1ms(void) //16Mhz延时1ms

{

unsigned char a,b,c;

for(c=17;c>0;c--)

for(b=134;b>0;b--)

for(a=2;a>0;a--);

}

void delay16M_xms(unsigned int x) //16Mhz延时xms

{

unsigned int i;

for(i=0;i

{

delay16M_1ms(); }

}

AVR单片机下载线

像我们这样搞电子的人,要的就是动手的乐趣。下面我们来介绍近期在网络上非常流行的USBasp下载线,因为现在的笔记本包括台式机都渐渐地舍弃了并口、串口;所以之前的并口或串口下载线已经不能再使用了,应该说是做个USBasp下载线是势在必行的,下面我们来介绍其制作的全过程。本 下载线与《51单片机C语言快速上手》完全同步,有兴趣的朋友可以从网上以关键字的形式搜索下载。 图(1) 图1为原作者设计的原理图,为了便于制作我修改过某部分电路如图2,其功能一样。

图(2) 在制作之前首先要搞清楚几点: 第一、这个USB下载线本身就是一块AVR单片机,在制作过程中也必需对其进行程序下载才能运行。 第二、先得大概了解一下这个AVR单机机ATmega8的基本资料。这样才能对电路有个了解,从而便于调试。 第三﹑COM1是PC机与USB相接的端口,我们在焊接时一定要区分GND、VCC、D+、D-,下面图(3)是对应本次制作的USB端口的引脚功能。在焊接的之前务必搞清楚,否则会造成PC机端口的USB或下载给的ATmega8烧毁。

图(3)USB端口引脚功能 第四﹑最后我们来了解一下电路的结构。对应图2,其中JP1是选择下载时的速度是快速或慢速,当JP1接地时选择低速,否则为高速。对于选择快速还是慢是相对于被下载的单片机晶振时钟而言的。一般来讲,目标单片机与USBasp的ATmega8的时钟不能相差太远。而JP2是电源的选择,当短接时被下载的单片机选择USBasp供电,则否选择独立供电。切记:两者只能任选其一。LED2为ATmega8程序运行的指示灯,当其点亮时就证明USBasp运行正常。LED1为下载程序时的工作指示灯,当接收到上位机信号时,此灯就会闪动。

基于51单片机的精确延时(微秒级)

声明: *此文章是基于51单片机的微秒级延时函数,采用12MHz晶振。 *此文章共包含4个方面,分别是延时1us,5us,10us和任意微秒。前三个方面是作者学习过程中从书本或网络上面总结的,并非本人所作。但是延时任意微秒函数乃作者原创且亲测无误。欢迎转载。 *此篇文章是作者为方便初学者使用而写的,水平有限,有误之处还望大家多多指正。 *作者:Qtel *2012.4.14 *QQ:97642651 ----------------------------------------------------------------------------------------------------------------------序: 对于某些对时间精度要求较高的程序,用c写延时显得有些力不从心,故需用到汇编程序。本人通过测试,总结了51的精确延时函数(在c语言中嵌入汇编)分享给大家。至于如何在c 中嵌入汇编大家可以去网上查查,这方面的资料很多,且很简单。以12MHz晶振为例,12MHz 晶振的机器周期为1us,所以,执行一条单周期指令所用时间就是1us,如NOP指令。下面具体阐述一下。 ----------------------------------------------------------------------------------------------------------------------1.若要延时1us,则可以调用_nop_();函数,此函数是一个c函数,其相当于一个NOP指令,使用时必须包含头文件“intrins.h”。例如: #include #include void main(void){ P1=0x0; _nop_();//延时1us P1=0xff; } ----------------------------------------------------------------------------------------------------------------------2.延时5us,则可以写一个delay_5us()函数: delay_5us(){ #pragma asm nop #pragma endasm } 这就是一个延时5us的函数,只需要在需要延时5us时调用此函数即可。或许有人会问,只有一个NOP指令,怎么是延时5us呢? 答案是:在调用此函数时,需要一个调用指令,此指令消耗2个周期(即2us);函数执行完毕时要返回主调函数,需要一个返回指令,此指令消耗2个周期(2us)。调用和返回消耗了2us+2us=4us。然后再加上一个NOP指令消耗1us,不就是5us吗。

单片机延时

如果用软件延时的话,那么在执行延时程序的时候就不能作其它事了,如LED、按键扫描等。 用中断则可以实现多任务。 所以中断是个很好的资源,要充分利用 秒=1000毫秒(ms) 1毫秒=1/1,000秒(s) 1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s) 1秒=1,000,000,000 纳秒(ns) 1纳秒=1/1,000,000,000秒(s) 1秒=1,000,000,000,000 皮秒(ps) 1皮秒=1/1,000,000,000,000秒(s) 参考资料:资料 用定时器延时,有时候显得有点麻烦,我们不如考虑软件精确延时,软件延时无非就是利用for或while多重循环。以前用到延时函数时,都是从网上下载别人写好的延时子程序。延时5ms,400ms,1s,……,这些延时函数的函数名中都清清楚楚地标明了延时的时间,可我一直不知道这些函数是如何编写的,确切地说,是如果根据延时时间来确定循环次数的。如果是纳秒级的延时,可以通过示波器来观察波形,或者反汇编一下,计算一下指令执行时间,但如果延时时间相对较长,示波器便无能为力了。这几天好好看了一下Keil调试,发现Keil的功能实在是太强大了。利用Keil uVersion的调试就可以写出精确的软件延时程序。以下是我的简单小结,文中所有程序都是在Xtal=11.0592MHZ下测试。 比如我需要一个400ms的延时,随便写了个两重循环,外层循环5次,内层循环暂且设为5000: void Delay400Ms(void){ uchar i=5; unint j; while(i--){ j=5000; //通过keil调试来确定循环次数 while(j--); } } 在main函数中调用Delay400Ms(): void main() { while(1){ P1=0; Delay400ms(); P1=1; } }

AVR单片机程序

* 文件名:闪烁灯.c * 杜邦线接法:用单条杜邦线把PD.0和J38的1端相连接。 ***********************************************************************/ #include #define F_CPU 8000000 //这里的值是单片机工作的相关晶振频率 #include #define LED1 PORTD|=~0XFE //LED=1 LED不亮 #define LED0 PORTD&=0XFE //LED=0 LED发光 int main(void) { DDRD = 0x01; //PD0定义为输出,PD的其他端口为输入。 while(1) { LED1; _delay_ms(500); LED0; _delay_ms(500); } }

* 文件名:闪烁灯2.c * 创建人:东流,2012年2月10日 * 版本号:1.0 * 杜邦线接法:用8针杜邦线把PD和J38的1--8连接(PD0对应J38的1端)。 用杜邦线把PB0对应J38的9端。 用杜邦线把PB1对应J38的10端。 用杜邦线把PB2对应J38的11端。 用杜邦线把PB3对应J38的12端。 ***********************************************************************/ #include #define F_CPU 8000000 //这里的值是单片机工作的相关晶振频率 #include int main(void) { DDRD = 0xff; DDRB = 0x0f; while(1) { /*北面的三个LED亮*/ PORTD = 0xf8; PORTB = 0xff; _delay_ms(300); /*东面的三个LED亮*/ PORTD = 0xc7; PORTB = 0xff; _delay_ms(300); /*南面的三个LED亮*/ PORTD = 0x3f; PORTB = 0xfe; _delay_ms(300); /*西面的三个LED亮*/ PORTD = 0xff; PORTB = 0xf1; _delay_ms(300); /*北面的两个LED亮,中间一个不亮*/ PORTD = 0xfa; PORTB = 0xff; _delay_ms(300); /*东面的两个LED亮,中间一个不亮*/ PORTD = 0xd7; PORTB = 0xff;

51单片机的几种精确延时

51单片机的几种精确延时实现延时 51单片机的几种精确延时实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。 1 使用定时器/计数器实现精确延时 单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。 在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC 语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。 2 软件延时与时间计算 在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。 2.1 短暂延时 可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下: void Delay10us( ) { _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); } Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。可以把这一函数

单片机C延时时间怎样计算

C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时 应该使用unsigned char作为延时变量。以某晶振为12MHz的单片 机为例,晶振为12M H z即一个机器周期为1u s。一. 500ms延时子程序 程序: void delay500ms(void) { unsigned char i,j,k; for(i=15;i>0;i--) for(j=202;j>0;j--) for(k=81;k>0;k--); } 计算分析: 程序共有三层循环 一层循环n:R5*2 = 81*2 = 162us DJNZ 2us 二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值 1us = 3us 三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us

循环外: 5us 子程序调用 2us + 子程序返回2us + R7赋值 1us = 5us 延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms 计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5 二. 200ms延时子程序 程序: void delay200ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=132;j>0;j--) for(k=150;k>0;k--); } 三. 10ms延时子程序 程序: void delay10ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=4;j>0;j--) for(k=248;k>0;k--);

单片机89C51精确延时

单片机89C51精确延时 高手从菜鸟忽略作起之(六)一,晶振与周期: 89C51晶振频率约为12MHZ。在此基础上,计论几个与单片机相关的周期概念:时钟周期,状态周期,机器周期,指令周期。 晶振12MHZ,表示1US振动12次,此基础上计算各周期长度。 时钟周期(W sz):Wsz=1/12=0.083us 状态周期(W zt) Wzt=2*Wsz=0.167us 机器周期(W jq): Wjq=6*Wzt=1us 指令周期(W zl): W zl=n*Wjq(n=1,2,4) 二,指令周期 汇编指令有单周期指令,双周期指令,四周期指令。指令时长分别是1US,2US,4US.指令的周期可以查询绘编指令获得,用下面方法进行记忆。 1.四周期指令:MUL,DIV 2.双周期指令:与SP,PC相关(见汇编指令周期表) 3.单周期指令:其他(见汇编指令周期表) 三,单片机时间换算单位 1.1秒(S)=1000毫秒(ms) 2.1毫秒(ms)=1000微秒(us) 3.1微秒(us)=1000纳秒(ns) 单片机指令周期是以微秒(US)为基本单位。 四,单片机延时方式 1.计时器延时方式:用C/T0,C/T1进行延时。 2.指令消耗延时方式: 本篇单片机精确延时主要用第2种方式。 五,纳秒(ns)级延时: 由于单片机指令同期是以微秒(US)为基本单位,因此,纳秒级延时,全部不用写延时。六,微秒(US)级延时:

1.单级循环模式:delay_us_1 最小值:1+2+2+0+2+1+2+2=12(US),运行此模式最少需12US,因此12US以下,只能在代码中用指定数目的NOP来精确延时。 最大值:256*2+12-2=522(US),256最大循环次数,2是指令周期,12是模式耗时,-2是模式耗时中计1个时钟周期。 延时范围:值域F(X)[12,522],变量取值范围[0,255]. 函数关系:Y=F(x):y=2x+12,由输入参数得出延时时间。 反函数:Y=F(x):y=1/2x-6:由延时时间,计算输入参数。例延时500US,x=500,y=244,即输入244时,精确延时500US. 2.双级循环模式:delay_us_2

个人总结的AVR的ATMEGA16L单片机程序

ATMAGE 16 的C语言程序

ATMAGE 16 的C语言程序 (1) 一、PB0 口的PB0.1 LED 发光管闪烁的程序: (3) 二、PA0、PB0、PC0口的LED 发光管闪烁的程序: (5) 三、I/O口的输入与输出 (6) 四、跑马灯 (8) 五、数码管计数显示设计 (10) 六、控制直流电机正反转 (16) 七、单片机的定时器(T/C0)应用 (20) AVR原理图 (24)

一、PB0 口的PB0.1 LED 发光管闪烁的程序: #include int main( void ) { unsigned char i, j, k,led=0; DDRB=0xFF; /* all outputs */ while (1) { if(led) PORTB|=0X01; /* |使最后一位为1 */

else PORTB&=0XFE; /*&最后一位为0 */ led=!led; //延时 for (i=0; i<255; i++) for(j=0; j<255;j++) k++; } } /////////////////////////////////////////////////////////////// #include int main( void ) { unsigned char i, j, k,led=0; DDRB=0xFF; /* all outputs */ while (1) { if(led) PORTB=0Xfe; else PORTB=0Xff; led=!led; for (i=0; i<255; i++) //延时 for(j=0; j<255;j++) k++; } }

用单片机实现延时(自己经验及网上搜集).

标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。 在keil C51中,直接调用库函数: #include // 声明了void _nop_(void; _nop_(; // 产生一条NOP指令 作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。 在选择C51中循环语句时,要注意以下几个问题 第一、定义的C51中循环变量,尽量采用无符号字符型变量。 第二、在FOR循环语句中,尽量采用变量减减来做循环。 第三、在do…while,while语句中,循环体内变量也采用减减方法。 这因为在C51编译器中,对不同的循环方法,采用不同的指令来完成的。 下面举例说明: unsigned char i; for(i=0;i<255;i++; unsigned char i; for(i=255;i>0;i--;

其中,第二个循环语句C51编译后,就用DJNZ指令来完成,相当于如下指令: MOV 09H,#0FFH LOOP: DJNZ 09H,LOOP 指令相当简洁,也很好计算精确的延时时间。 同样对do…while,while循环语句中,也是如此 例: unsigned char n; n=255; do{n--} while(n; 或 n=255; while(n {n--}; 这两个循环语句经过C51编译之后,形成DJNZ来完成的方法, 故其精确时间的计算也很方便。 其三:对于要求精确延时时间更长,这时就要采用循环嵌套的方法来实现,因此,循环嵌套的方法常用于达到ms级的延时。对于循环语句同样可以采用for,do…while,while结构来完成,每个循环体内的变量仍然采用无符号字符变量。 unsigned char i,j for(i=255;i>0;i--

单片机延迟函数

单片机延迟函数 /*************************************************************** *************** 12M 延时计算公式= 4.17+(n-1)*0.5 us 8M 延时计算公式= 6.25+(n-1)*0.75 us 7.3728M 延时计算公式= 6.78+(n-1)*0.81 us 或者6.51+(n-1)*0.82 us 4M 延时计算公式= 12.5+(n-1)*1.5 us 3.6864M 延时计算公式= 13.56+(n-1)*1.63 us 2M 延时计算公式= 25.00+(n-1)*3.0 us 1M 延时计算公式= 50.00+(n-1)*6.0 us **************************************************************** ***************/ void delay (unsigned int n) { unsigned int i; i = n; while (i--)

; } } /*************************************************************** *************** 12M 延时计算公式= 4.0+(n-1)*0.5 us 8M 延时计算公式= 6.0+(n-1)*0.75 us 7.3728M 延时计算公式= 6.51+(n-1)*0.81 us 或者6.51+(n-1)*0.82 us 4M 延时计算公式= 12.0+(n-1)*1.5 us 3.6864M 延时计算公式= 13.02+(n-1)*1.63 us 2M 延时计算公式= 24.00+(n-1)*3.0 us 1M 延时计算公式= 48.00+(n-1)*6.0 us **************************************************************** ***************/ void delay (unsigned int n) { unsigned int i; for (i=n;i>0;i--) { ;

avr单片机全系列选型指南

AVR Microcontrollers ATMEL? CORPORATION A VR? Microcontrollers: Product Line Reference January 2006 Customer Edition Table of Contents 1AVR Product Family (2) 1.1P RODUCT S ELECTION G UIDE - TINY AVR? (2) 1.2P RODUCT S ELECTION G UIDE - MEGA AVR? (3) 1.3P RODUCT S ELECTION G UIDE – PICO P OWER?AVR (4) 1.4P RODUCT S ELECTION G UIDE –AVR32 (4) 1.5P RODUCT S ELECTION G UIDE – MEGA AVR LCD AND ASSP AVR (5) 1.6P RODUCT S ELECTION G UIDE –AVR Z-L INK? (5) 1.7P RODUCT S ELECTION G UIDE –A UTOMOTIVE AVR (6) 2Application Area in Focus: Comparing power consumption (7) 2.1.1AVR BOD vs. TI BOR (7) 2.1.2Protection in sleep modes (8) 2.2O VERALL POWER CONSUMPTION (8) 3AVR Development Tools (9) 3.1T OOLS R EFERENCE (9) 3.2AVR S TUDIO?T OOLS AND D EVICE S UPPORT (10) 4Documentation (12) 4.1D ATASHEETS (12) 4.2A PPLICATION N OTES (13)

单片机几个典型延时函数

软件延时:(asm) 晶振12MHZ,延时1秒 程序如下: DELAY:MOV 72H,#100 LOOP3:MOV 71H,#100 LOOP1:MOV 70H,#47 LOOP0:DJNZ 70H,LOOP0 NOP DJNZ 71H,LOOP1 MOV 70H,#46 LOOP2:DJNZ 70H,LOOP2 NOP DJNZ 72H,LOOP3 MOV 70H,#48 LOOP4:DJNZ 70H,LOOP4 定时器延时: 晶振12MHZ,延时1s,定时器0工作方式为方式1 DELAY1:MOV R7,#0AH ;;晶振12MHZ,延时0.5秒 AJMP DELAY DELAY2:MOV R7,#14H ;;晶振12MHZ,延时1秒DELAY:CLR EX0 MOV TMOD,#01H ;设置定时器的工作方式为方式1 MOV TL0,#0B0H ;给定时器设置计数初始值 MOV TH0,#3CH SETB TR0 ;开启定时器 HERE:JBC TF0,NEXT1 SJMP HERE NEXT1:MOV TL0,#0B0H MOV TH0,#3CH DJNZ R7,HERE CLR TR0 ;定时器要软件清零 SETB EX0 RET

C语言延时程序: 10ms延时子程序(12MHZ)void delay10ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=4;j>0;j--) for(k=248;k>0;k--); } 1s延时子程序(12MHZ)void delay1s(void) { unsigned char h,i,j,k; for(h=5;h>0;h--) for(i=4;i>0;i--) for(j=116;j>0;j--) for(k=214;k>0;k--); }

单片机精确毫秒延时函数

单片机精确毫秒延时函数 实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。今天主要介绍软件延时以及单片机精确毫秒延时函数。 单片机的周期介绍在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号。脉冲信号之间的时间间隔称为周期;而将在单位时间(如1秒)内所产生的脉冲个数称为频率。频率是描述周期性循环信号(包括脉冲信号)在单位时间内所出现的脉冲数量多少的计量名称;频率的标准计量单位是Hz(赫)。电脑中的系统时钟就是一个典型的频率相当精确和稳定的脉冲信号发生器。 指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。 时钟周期:也称为振荡周期,一个时钟周期= 晶振的倒数。对于单片机时钟周期,时钟周期是单片机的基本时间单位,两个振荡周期(时钟周期)组成一个状态周期。 机器周期:单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作,如取指令、存储器读/写等。 机器周期=6个状态周期=12个时钟周期。 51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/ 晶振频率)= x s。常用单片机的晶振为11.0592MHz,12MHz,24MHz。其中11.0592MHz 的晶振更容易产生各种标准的波特率,后两种的一个机器周期分别为1 s和2 s,便于精确延时。 单片机精确毫秒延时函数对于需要精确延时的应用场合,需要精确知道延时函数的具体延

51单片机精确延时源程序

51单片机精确延时源程序 一、晶振为 11.0592MHz,12T 1、延时 1ms: (1)汇编语言: 代码如下: DELAY1MS: ;误差 -0.651041666667us MOV R6,#04H DL0: MOV R5,#71H DJNZ R5,$ DJNZ R6,DL0 RET (2)C语言: void delay1ms(void) //误差 -0.651041666667us { unsigned char a,b; for(b=4;b>0;b--) for(a=113;a>0;a--); } 2、延时 10MS: (1)汇编语言: DELAY10MS: ;误差 -0.000000000002us MOV R6,#97H DL0: MOV R5,#1DH DJNZ R5,$ DJNZ R6,DL0

RET (2)C语言: void delay10ms(void) //误差 -0.000000000002us { unsigned char a,b; for(b=151;b>0;b--) for(a=29;a>0;a--); } 3、延时 100MS: (1)汇编语言: DELAY100MS: ;误差 -0.000000000021us MOV R7,#23H DL1: MOV R6,#0AH I

棋影淘宝店:https://www.360docs.net/doc/4610812917.html,QQ:149034219 DL0: MOV R5,#82H DJNZ R5,$ DJNZ R6,DL0 DJNZ R7,DL1 RET (2)C语言: void delay100ms(void) //误差 -0.000000000021us { unsigned char a,b,c; for(c=35;c>0;c--) for(b=10;b>0;b--) for(a=130;a>0;a--); } 4、延时 1S: (1)汇编语言: DELAY1S: ;误差 -0.00000000024us MOV R7,#5FH DL1: MOV R6,#1AH DL0: MOV R5,#0B9H DJNZ R5,$ DJNZ R6,DL0 DJNZ R7,DL1 RET (2)C语言: void delay1s(void) //误差 -0.00000000024us { unsigned char a,b,c; for(c=95;c>0;c--) for(b=26;b>0;b--)

AVR单片机常用的延时函数

AVR单片机常用的延时函数 /******************************************************************** *******/ //C header files:Delay function for AVR //MCU:ATmega8 or 16 or 32 //Version: 1.0beta //The author: /******************************************************************** *******/ #include void delay8RC_us(unsigned int time) //8Mhz内部RC震荡延时Xus { do { time--; } while(time>1); } void delay8RC_ms(unsigned int time) //8Mhz内部RC震荡延时Xms { while(time!=0) { delay8RC_us(1000); time--; } } /******************************************************************** **********/ void delay1M_1ms(void) //1Mhz延时1ms { unsigned char a,b,c; for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } void delay1M_xms(unsigned int x) //1Mhz延时xms { unsigned int i; for(i=0;i

单片机写延时程序的几种方法

单片机写延时程序的几种方法 1)空操作延時(12MHz) void delay10us() { _NOP_(); _NOP_(); _NOP_(); _NOP_(); _NOP_(); _NOP_(); } 2)循環延時 (12MHz) Void delay500ms() { unsigned char i,j,k; for(i=15;i>;0;i--) for(j=202;j>;0;j--) for(k=81;k>;0;k--); }

延時總時間=[(k*2+3)*j+3]*i+5 k*2+3=165 us 165*j+3=33333 us 33333*i+5=500000 us=500 ms 3)計時器中斷延時(工作方式2) (12MHz) #include; sbit led=P1^0; unsigned int num=0; void main() { TMOD=0x02; TH0=6; TL0=6; EA=1; ET0=1; TR0=1; while(1) { if(num==4000) { num=0;

led=~led; } } } void T0_time() interrupt 1 { num++; } 4)C程序嵌入組合語言延時 #pragma asm …… 組合語言程序段 …… #pragma endasm KEIL軟件仿真測量延時程序延時時間

這是前段事件總結之延時程序、由於不懂組合語言,故NO.4無程序。希望對你有幫助!!! 對於12MHz晶振,機器周期為1uS,在執行該for循環延時程式的時候 Void delay500ms() { unsigned char i,j,k; for(i=15;i>;0;i--) for(j=202;j>;0;j--) for(k=81;k>;0;k--); } 賦值需要1個機器周期,跳轉需要2個機器周期,執行一次for循環的空操作需要2個機器周期,那么,對於第三階循環 for(k=81;k>;0;k--);,從第二階跳轉到第三階需要2機器周期,賦值需要1個機器周期,執行81次則需要2*81個機器周期,執行一次二階for循環的事件為81*2+1+2;執行了220次,則(81*2+3)*220+3,執行15次一階循環,則 [(81*2+3)*220+3]*15,由於不需要從上階跳往下階,則只加賦值的一個機器周期,另外進入該延時子函數和跳出該函數均需要2個機器周期,故

AVR单片机解锁方法

AVR单片机的熔丝位控制着其时钟、JTAG使能、FLASH操作、工作模式等等。。一旦配置错误, 会导致不可预见的结果,导致单片机下不进去 程序。。。最常见的就是时钟配置错误,尤其 初学者比较容易犯这一类错误。。。 AVR单片机如果是系统时钟相关熔丝位配置错了,那可以使用有源晶振、信号发生器等强时钟源给“振开”,其实最简单的方法是利用51单片机的ALE脚进行“急救”。。。。 以前没试过,今天我故意将时钟配置错误(在AVR STUDIO中将熔丝位设置成外部高速晶振,快启动,然后故意把外部晶振给拿掉),重启后果然出事儿了。。。再想下程序下不进去了(嘿嘿,这正合我意),为了解救这个ATMEGA16,我找来了一个AT89S52。。。注意不能用STC的哦,有的STC51单片机把ALE脚给禁止了。。。。 接下来就是最紧张的时刻了,我将两块板子共地,然后将AT89S52的ALE脚(第30脚)接到ATMEGA16的XTAL1脚(第13脚)。。。上电,用示波器看到A LE脚有时钟信号输出。。果断再次下载ATMEGA16的程序。。果然好使了!!!!!

如果大家以后遇到此类现象,不妨使用这个方法试试。。。如果是系统时钟相关熔丝位配置错误,那么这个招绝对管用。。。别的熔丝位设错了倒是没尝试过。。。不过大家尽量配置正确就是啦~~~~~

做设计时不小心锁了一块芯片ATMEGA16,真的很抑闷,网上查了一下资料,真的五花八门,今天自己用有源晶振在自己的作品上动手术,几分钟就把自己的芯片解锁了,收获很多,以后终于随心所欲地编写熔丝了,反正我能解锁! 实践才是检验真理的硬道理! 实际中我没有断开我原来的外部晶振! 解锁图: 解锁步骤: 一:按上面电路接好线,为了避免焊接后又脱焊的麻烦,所以建议用杜邦线接好。 二:用ISP下载线设置好正确的熔丝位,即可烧写熔丝,呵呵,大功告成,芯片又可以恢复使用了。 后话:AVR单片机被锁,不能写入程序,是因为错误地烧写时钟方式熔丝位造成的,选择的时钟方式与实际不同,造成单片机没有时钟信号输入,即不工作了,这样烧写程序当然error啦!

AVR单片机复习题+答案

AVR单片机复习题(答案在后面) 第一章 填空: 1.单片机的基本组成结构包括:、、、五大 部分。 2.哈佛结构是指,计算机由五大部分构成,五大部分分别 是:、、、 3.ATmega16包含程序存储器,数据存储器和的 EEPROM。 4.ATMEL公司生产的单片机以三大系列为主,分别是:、、 5.ATMEL公司生产的TinyAVR是属于单片机。、 6.ATMEL公司生产的megaA VR是属于单片机。 7.ATMEL公司生产的XMEGA是属于单片机。 选择: 1.ATMEL公司生产的单片机以三大系列为主,其中TinyAVR是属于() A、低档单片机 B、中档单片机 C、高档单片机 D、普通单片机 2.ATMEL公司生产的单片机以三大系列为主,其中megaA VR是属于() A、低档单片机 B、中档单片机 C、高档单片机 D、普通单片机 3.ATMEL公司生产的单片机以三大系列为主,其中XMEGA是属于() A、低档单片机 B、中档单片机 C、高档单片机 D、普通单片机 4. 单片机的基本组成结构包括:CPU、程序存储器、、输入接口、输出接口五大部分() A、EEPROM B、数据存储器 C、ROM D、堆栈 简答: 1.什么是ISP技术?采用ISP技术的单片机有什么优点? 2.什么是单片机? 3.说明单片机的RAM、FLASH ROM、EEPROM的用途和特点?(中等)

第二章 填空: 1.单片机的三总线结构是指:、、。 2.ATmega16包含FLASH ROM,RAM和的EEPROM。 3.FLASH ROM支持用户,可以实现的(填读写或写 入)。 4.单片机的数据存储器包含和两大部分,其中是 的补充。 5.ATmega16中含有的EEPROM。它的擦写次数是,具 有、。 6.ATmega16的DIP封装共有引脚,其中共有I/O 口线。 7.ATmega16的数据存储器中共有通用工作寄存器,有寄存器可 以合并成为3个16位的寄存器。 8.在ATmega16的通用寄存器组中,有16位的寄存器。名称分别 为:、、。 9.ATmega16的中断向量表在FLASH ROM的,中断的向量地址, 中断的优先级越。 10.ATmega16的工作电压是, 所能使用的最高晶振频率为。 11.ATmega16可以使用内部晶振,晶振频率为、、、 赫兹。 12.ATmega16共有引脚,其中为VCC,脚为GND。 13.ATmega16的A VCC引脚是,作用是 14.ATmega16的AREF引脚是,作用是。 15.ATmega16的是GND ,引脚是XTAL1、XTAL2,作用是 16.ATmega16的复位引脚是,名称是。当在该引脚上出现一个 的电平,单片机复位。 17.A VR的指令长度为称为一字,PC指针为,FLASH存储器是 字。A VR 扩展外部程序存储器,这是因为 18.ATmega16配置系统时钟的熔丝位共有位,名称分别 是、。 选择: 1.单片机的三总线结构是指:数据总线、地址总线和_() A、控制总线 B、采集总线 C、接收总线 D、发送总线 2.单片机的三总线结构是指:控制总线、地址总线和_() A、发送总线 B、采集总线 C、接收总线 D、数据总线 3.ATmega16的DIP封装共有引脚,其中共有I/O 口线()

单片机延时程序

实验一单片机延时程序实验 一、实验目的与要求: 在使用4MH在外部晶体振荡器的PIC16F877A上用软件设计一个20ms的软件延时子程序。另外,还要求用MPLAB的软件模拟器及其附带的软件工具窗口stopwatch观测延时程序执行的时间。 二、实验内容: 1.硬件电路设计: 本实验中用的是软件延时,利用循环来实现延时功能。电路就用了单片机的原本电路。没有用到其他的功能模块,单片机与ICD3相连接。 2.软件设计思路: 单片机软件延时的前提和基础是每条指令的执行时间是固定的,且大部分指令的执行时间是相同的。这要求对每条指令所花费的指令周期(Tcy)做到心中有数。指令集中5条无条件跳转指令GOTO,CALL.RETURN,RETLW和RETFIE,由于它们必然引起程序跳转,造成流水线中断,因此肯定将占用2个指令周期。而其他4条有可能引起程序跳转的条件跳转指令DECFSZ,INCFSZ,BTFSC和,BTFSS的执行时间,需要占用2个指令周期,当条件为假不发生跳转时,仅占用1个指令周期。其余所有指令都只用1个指令周期。

每个指令周期Tcy的时间长度,计算方法:如果采用4MHz 的外部晶体(fosc=4 MHz),则PIC中档单片机的指令周期Tcy 为1us,这是一个整数。而采用其他频率的外部晶体时,指令周期时间将反比于外部晶体频率。 至于软件延时的结构和实现方法,其实可以采用任何指令和结构,因为只是通过执行指令耗费时间。但通常情况下有两个选择延时程序结构的原则: (1)执行指令周期数计算方便。如果含有太多复杂的条件跳转循环等结构势必会造成指令周期的计算困难,甚至可 能造成执行所造成的软件延时时间不等。 (2)不能占用太多的程序空间。试想用20000个NOP指令来实现20ms的延时,显然是可以的,但是这样做浪费了 整整一个页的程序存储器,得不偿失,而通过适当的循 环结构,重复执行某些相同的程序是比较合理的方法。 因此,软件延时程序一般采用下列方法:如果延时时间 短(微妙级别),可以连续插入几条NOP指令;如果延 时时间长(几个毫秒级别),则可以使用双嵌套循环的 方法来实现。 实验的流程图:

AVR单片机入门教程

A VR单片机入门教程(一)AVR单片机入门范例 我们先以一个范例来带领大家进入AVR单片机的精彩世界 1. 新手在准备入门前,我们先以一个范例来带领大家进入单片机的精彩世界, 首先你需准备如下的硬件和软件: 1. WinAVR 20050214 版本(AVR单片机C语言编写、编译软件)。 2. AVR单片机开发实验板(有实验、编程、下载线功能)。 3. 实验板配套的编程下载软件(以下的范例将WS9500为例,配套的 软件实现和WinAVR的无缝链接功能将让你在反复调试程序的过程中如虎添 翼) 2. 实验内容: 编写一段C代码,实现实验板上的L0~L7八个LED的流水灯程序。(以后我们网站配套的AVR实验程序都将采用C代码编写,关于为什么采用C代码而不用汇编的原因大家请参考说明书的附录说明:开发学习AVR采用C语言而不用汇 编语言)

4. 安装WinAVR 20050214 版本:把光盘里的常用工具文件夹里的WinAVR文件夹拷贝到电脑的硬盘上,然后运行安装,安装全部使用缺省安装即可。如果需要删除,进入控制面板,使用“添加/删除程序”。但WinAVR PN的配置参数,仍会保存在:C:\Documents and Settings\[UserName]\Application Data\Echo Software\PN2 中。如果想将这些参数也删除,此上述目录删除即可。 安装完成后,直接到“开始”——“程序”——“WinAVR”里运行应用程 序即可 (二)WinAVR的初始环境配置 在用WinAVR编写、编译C程序之前还要对WinAVR进行一些必要的环境配置,这会让我们以后编写、调试程序更加得心应手。您也可直接跳过此步,直接进入下 面的WinAVR快速入门 配置步骤如下: 1.下面是WinAVR的操作界面:

相关文档
最新文档