精华内容
下载资源
问答
  • 51单片机延时子程序详解
  • 单片机延时子程序

    2013-04-21 01:45:02
    延时子程序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--); } 或者 void delay10ms() { for(a=100;a>0;...
  • 单片机常用延时子程序单片机常用延时子程序单片机常用延时子程序
  • 延时程序单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指令周期的区别和联系、...
  • 典型8051单片机延时子程序延时时间计算小软件
  • 谈谈51单片机延时子程序

    万次阅读 2010-07-23 11:48:00
    延时程序单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器 周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指 令...

    延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器

    周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指

    令周期的区别和联系、相关指令的用法等用图解法的形式详尽的回答读者

       我们知道程序设计是单片机开发最重要的工作,而程序在执行过程中常常需要完成延时的功能。例如

    在交通灯的控制程序中,需要控制红灯亮的时间持续30秒,就可以通过延时程序来完成。延时程序是如何

    实现的呢?下面让我们先来了解一些相关的概念。

    一、机器周期和指令周期

    1.机器周期是指单片机完成一个基本操作所花费的时间,一般使用微秒来计量单片机的运行速度,

    51 单片机的一个机器周期包括12 个时钟振荡周期,也就是说如果51 单片机采用12MHz 晶振,那么执行

    一个机器周期就只需要1μs;如果采用的是6MHz 的晶振,那么执行一个机器周期就需要2 μs。

       2 .指令周期是指单片机执行一条指令所需要的时间,一般利用单片机的机器周期来计量指令周期。

    在51 单片机里有单周期指令(执行这条指令只需一个机器周期),双周期指令(执行这条指令只需要两个

    机器周期),四周期指令(执行这条指令需要四个机器周期)。除了乘、除两条指令是四周期指令,其余均

    为单周期或双周期指令。也就是说,如果51 单片机采用的是12MHz 晶振,那么它执行一条指令一般只需

    1~2 微秒的时间;如果采用的是6MH 晶振,执行一条指令一般就需2~4 微秒的时间。

       现在的单片机有很多种型号,但在每个型号的单片机器件手册中都会详细说明执行各种指令所需的机

    器周期,了解以上概念后,那么可以依据单片机器件手册中的指令执行周期和单片机所用晶振频率来完成

    需要精确延时时间的延时程序。

    二、延时指令

       在单片机编程里面并没有真正的延时指令,从上面的概念中我们知道单片机每执行一条指令都需要一

    定的时间,所以要达到延时的效果,只须让单片机不断地执行没有具体实际意义的指令,从而达到了延时

    的效果。

    1.数据传送指令 MOV

       数据传送指令功能是将数据从一个地方复制、拷贝到另一个地方。

       如:MOV R7,#80H   ;将数据80H 送到寄存器R7,这时寄存器R7 里面存放着80H,就单这条

    指令而言并没有任何实际意义,而执行该指令则需要一个机器周期。

    2.空操作指令 NOP

       空操作指令功能只是让单片机执行没有意义的操作,消耗一个机器周期。

    3.循环转移指令 DJNZ

       循环转移指令功能是将第一个数进行减1 并判断是否为0,不为0 则转移到指定地点;为0 则往下执行。

       如:DJNZ R7,KK ;将寄存器R7 的内容减1 并判断寄存器R7 里的内容减完1 后是否为0,如果

       不为0 则转移到地址标号为KK 的地方;如果为0 则执行下一条指令。这条指令需要2 个机器周期。

       利用以上三条指令的组合就可以比较精确地编写出所需要的延时程序。

    三、1 秒延时子程序、流程图及时间计算 (以单片机晶振为12MHz 为例,1 个机器周期需要1μs)

    了解了以上的内容,现在让我们来看看

    程序总共所需时间:1+10+2560+330240+660480+5120+20+2=998433 μs≈1S

       在这里运行这段程序共需998433 μs,还差1567μs 才达到1S 的,所以想要达到完美的1S 延时,需

    要在返回指令RET 前再添加一些指令让它把1567μs 的延时完成。有兴趣的读者可以自己试着添加完成。

    最后补充一点,编写程序时一般将延时程序编写成独立的子程序,而所谓子程序也就是一个实现某个功能

    的小模块。这样在主程序中就可以方便地反复调用编写好的延时子程序。

       小提示:循环转移指令(DJNZ )除了可以给定地址标号让其跳转外,还可以将地址标号改成$,这样

    程序就跳回本指令执行。例如:

       DJNZ R7,$ ;R7 内容减1 不为0,则再次执行本指令;为0 则往下执行,当R7 的值改为10

    时,则执行完该条程序所需的时间为2*10=20 μs。

    51单片机汇编延时程序算法详解

    将以12MHZ晶振为例,详细讲解MCS-51单片机中汇编程序延时的精确算法。   

    指令周期、机器周期与时钟周期

      指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。

      时钟周期:也称为振荡周期,一个时钟周期 =晶振的倒数。

      MCS-51单片机的一个机器周期=6个状态周期=12个时钟周期。

      MCS-51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/12000000)=1μs。

      程序分析

      例1 50ms 延时子程序:

      DEL:MOV R7,#200 ①

      DEL1:MOV R6,#125 ②

      DEL2:DJNZ R6,DEL2 ③

      DJNZ R7,DEL1 ④

      RET ⑤

      精确延时时间为:1+(1*200)+(2*125*200)+(2*200)+2

      =(2*125+3)*200+3 ⑥

      =50603μs

      ≈50ms

      由⑥整理出公式(只限上述写法)延时时间=(2*内循环+3)*外循环+3 ⑦

    详解:DEL这个子程序共有五条指令,现在分别就 每一条指令 被执行的次数和所耗时间进行分析。

      第一句:MOV R7,#200 在整个子程序中只被执行一次,且为单周期指令,所以耗时1μs

      第二句:MOV R6,#125 从②看到④只要R7-1不为0,就会返回到这句,共执行了R7次,共耗时200μs

      第三句:DJNZ R6,DEL2 只要R6-1不为0,就反复执行此句(内循环R6次),又受外循环R7控制,所以共执行R6*R7次,因是双周期指令,所以耗时2*R6*R7μs。

      例2 1秒延时子程序:

      DEL:MOV R7,#10 ①

      DEL1:MOV R6,#200 ②

      DEL2:MOV R5,#248 ③

      DJNZ R5,$ ④

      DJNZ R6,DEL2 ⑤

      DJNZ R7,DEL1 ⑥

      RET ⑦

      对每条指令进行计算得出精确延时时间为:

       1+(1*10)+(1*200*10)+(2*248*200*10)+(2*200*10)+(2*10)+2

      =[(2*248+3)*200+3]*10+3 ⑧

      =998033μs≈1s

      由⑧整理得:延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+3 ⑨

      此式适用三层循环以内的程序,也验证了例1中式⑦(第三层循环相当于1)的成立。

      注意,要实现较长时间的延时,一般采用多重循环,有时会在程式序里加入NOP指令,这时公式⑨不再适用,下面举例分析。

      例3仍以1秒延时为例

      DEL:MOV R7,#10 1指令周期1

      DEL1:MOV R6,#0FFH 1指令周期10

      DEL2:MOV R5,#80H 1指令周期255*10=2550

      KONG:NOP 1指令周期128*255*10=326400

      DJNZ R5,$ 2指令周期2*128*255*10=652800

      DJNZ R6,DEL2 2指令周期2*255*10=5110

      DJNZ R7,DEL1 2指令周期2*10=20

      RET 2

      延时时间=1+10+2550+326400+652800+5110+20+2 =986893μs约为1s

      整理得:延时时间=[(3*第一层循环+3)*第二层循环+3]*第三层循环+3 ⑩

      结论:针对初学者的困惑,对汇编程序的延时算法进行了分步讲解,并就几种不同写法分别总结出相应的计算公式,只要仔细阅读例1中的详解,并用例2、例3来加深理解,一定会掌握各种类型程序的算法并加以运用。

    单片机延时子程序

    1)延时为:20ms 晶振12M

    1+(1+2*248+2)*4+1+1+1=20000US=20MS

    用汇编..优点就是精确...

    缺点就是算有点复杂.

    DELAY20MS:

    MOV R7,#4

    D1:

    MOV R6,#248

    DJNZ R6,$

    DJNZ R7,D1

    NOP

    NOP

    RET

    2)一些通过计算51汇编指令得出的软延时子程序

    ;*****************************************************************   

    ;延时10uS   

    ;*****************************************************************   

      

    time10us:               mov     r5,#05h                 ;11us   

                            djnz    r5,$   

                            ret  

      

    ;*****************************************************************   

    ;延时50uS   

    ;*****************************************************************   

      

    time50us:               mov     r5,#19h                 ;51us   

                            djnz    r5,$   

                            ret  

      

    ;*****************************************************************   

    ;延时100uS   

    ;*****************************************************************   

      

    time100us:              mov     r5,#31h                 ;99.6us   

                            djnz    r5,$   

                            ret  

      

    ;*****************************************************************   

    ;延时200uS   

    ;*****************************************************************   

      

    time200us:              mov     r5,#64h                 ;201us   

                            djnz    r5,$   

                            ret  

      

    ;*****************************************************************   

    ;延时250uS   

    ;*****************************************************************   

      

    time250us:              mov     r5,#7ch                 ;249.6us   

                            djnz    r5,$   

                            ret  

      

    ;*****************************************************************   

    ;延时350uS   

    ;*****************************************************************   

      

    time350us:              mov     r5,#0afh                 ;351us   

    time350us_1:            djnz    r5,time350us_1   

                            ret  

      

    ;*****************************************************************   

    ;延时500uS   

    ;*****************************************************************   

      

    time500us:              mov     r5,#0fah                 ;501us   

    time500us_1:            djnz    r5,time500us_1   

                            ret  

      

    ;*****************************************************************   

    ;延时1mS   

    ;*****************************************************************   

      

    time1ms:                mov     r5,#0fah                ;1001us   

    time1ms_1:              nop  

                            nop  

                            djnz    r5,time1ms_1   

                            ret  

      

    ;*****************************************************************   

    ;延时2.5mS   

    ;*****************************************************************   

      

    time2_5ms:              mov     r5,#05h          ;2.496ms   

    time2_5ms_1:            mov     r6,#0f8h         ;497us   

                            djnz    r6,$   

                            djnz    r5,time2_5ms_1   

                            ret  

      

    ;*****************************************************************   

    ;延时10mS   

    ;*****************************************************************   

      

    time10ms:               mov    r5,#14h         ;10.262ms   

    time10ms_1:             mov    r6,#0ffh        ;511us   

                            djnz   r6,$   

                            djnz   r5,time10ms_1   

                            ret  

      

    ;*****************************************************************   

    ;延时50mS   

    ;*****************************************************************   

      

    time50ms:               mov    r5,#63h         ;49.996ms   

    time50ms_1:             mov    r6,#0fbh        ;503us   

                            djnz   r6,$   

                            djnz   r5,time50ms_1   

                            ret  

      

    ;*****************************************************************   

    ;延时100mS   

    ;*****************************************************************   

      

    time100ms:              mov     r5,#0c3h        ;100.036ms   

    time100ms_1:            mov     r6,#0ffh        ;511us   

                            djnz    r6,$   

                            djnz    r5,time100ms_1   

                            ret  

      

    ;*****************************************************************   

    ;延时200mS   

    ;*****************************************************************   

      

    time200ms:              mov     r5,#02h         ;250.351ms   

    time200ms_1:            mov     r6,#0f4h        ;125.173ms   

    time200ms_2:            mov     r7,#0ffh        ;511us   

                            djnz    r7,$   

                            djnz    r6,time200ms_2   

                            djnz    r5,time200ms_1   

                            ret  

      

    ;*****************************************************************   

    ;延时500mS   

    ;*****************************************************************   

      

    time500ms:              mov    r5,#04h         ;500.701ms   

    time500ms_1:            mov    r6,#0f4h        ;125.173ms   

    time500ms_2:            mov    r7,#0ffh        ;511us   

                            djnz   r7,$   

                            djnz   r6,time500ms_2   

                            djnz   r5,time500ms_1   

                            ret  

      

    ;*****************************************************************   

    ;延时1S   

    ;*****************************************************************   

      

    time1s:                 mov    r5,#08h         ;1001.401ms   

    time1s_1:               mov    r6,#0f4h        ;125.173ms   

    time1s_2:               mov    r7,#0ffh        ;511us   

                            djnz   r7,$   

                            djnz   r6,time1s_2   

                            djnz   r5,time1s_1   

                            ret

    12M晶振 机器周期为1US  NOP为单周期指令 DJNZ为双周期指令.

    3)

    ;;晶振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

    4);延时1分钟子程序,F=6MHz

    ;程序已测过,延时时间60,000,000.0uS

    delay60s:mov r3,#228

             mov r2,#253

             mov r1,#219

    loop1:   djnz r1,$

             djnz r2,loop1

             djnz r3,loop1

             nop

             ret

    5)计算机反复执行一段程序以达到延时的目的称为软件延时,单片机程序中经常需要短时间的延时,但是相当一部分人对延时程序很模糊,对延时程序的算法不够了解,在这里我以12MHz晶振和两个经典延时子程序为例,详细分析单片机汇编延时程序。

    何为时钟周期、机器周期、和指令周期?

    时钟周期:也就是振荡周期,以12MHz的时钟脉冲为例,那时钟周期就为(1/12000000)s=(1/12)us;

    机器周期:1个机器周期=6个状态周期=12个时钟周期=1us;

    指令周期:CPU执行一条指令所需要的时间称为指令周期,指令周期是以机器周期为单位的,不同的指令所需的机器周期不一定相同,可参考51单片机指令速查表。

            由上可得:CPU执行一条单周期指令,需要1us;执行一条双周期指令需要2us。

            下面是具体的延时子程序分析:

    0.1s延时子程序(12MHz晶振):

               MOV R7,#200   ;单周期指令(1us)

    D1:     MOV R6,#250   ;单周期指令(1us)

               DJNZ R6,$      ;双周期指令(2us)//该指令自身执行R6次

               DJNZ R7,D1     ;双周期指令(2us)//D1执行R7次

               RET            ;双周期指令(2us)

    T=1+(1+2*R6+2)*R7+2

       =100603us

       ≈0.1s

    0.5s延时子程序(12MHz晶振):

               MOV R7,#5     ;单周期指令(1us)

    D1:     MOV R6,#200   ;单周期指令(1us)

    D2:     MOV R5,#250   ;单周期指令(1us

               DJNZ R5,$      ;双周期指令(2us)//该指令自身执行R5次

               DJNZ R6,D2     ;双周期指令(2us)//D2执行R6次

               DJNZ R7,D1     ;双周期指令(2us)//D1执行R7次

               RET            ;双周期指令(2us)

    T=1+[1+(1+2*R5+2)*R6+2]*R7+2

       =503018us

       ≈0.5s

    6) 51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。

                        ORG        0                   ;程序从0地址开始

    START:      MOV      A,#0FEH     ;让ACC的内容为11111110

    LOOP:         MOV      P2,A            ;让P2口输出ACC的内容

                         RR          A                  ;让ACC的内容左移

                         CALL     DELAY       ;调用延时子程序

                         LJMP     LOOP          ;跳到LOOP处执行

    ;0.1秒延时子程序(12MHz晶振)===================

    DELAY:      MOV      R7,#200      ;R7寄存器加载200次数

    D1:               MOV      R6,#250      ;R6寄存器加载250次数

                         DJNZ     R6,$             ;本行执行R6次

                         DJNZ     R7,D1          ;D1循环执行R7次

                         RET                            ;返回主程序

                         END                           ;结束程序

    展开全文
  • 51C 用循环作延时的程序比汇编不好写多了。...这另外2 个延时时间也是很有用的,3ms延时,可作为数码管显示中的防鬼影,10ms延时可作为按键防抖用,留着备用。 #include <reg51.h>#define...

    51C 用循环作延时的程序比汇编不好写多了。它不能计算的,只能用逐一试验的方法。这里也作个1 秒延时的,用P1口输出,每秒求反一次。仿真中可看出每秒红或蓝电平切换一次。改ms参数,可以改动延时时间,当然也是不断试验出的。这另外2 个延时时间也是很有用的,3ms延时,可作为数码管显示中的防鬼影,10ms延时可作为按键防抖用,留着备用。

    #include <reg51.h>
    #define uint unsigned int
    #define uchar unsigned char

    void delayms(ms);

    void main ()
    {
        while(1)
       {
          delayms(10);           //ms=1 为2.79ms,约 3ms,可作为数码管显示消鬼影延时

                                    //ms=8 为9.88ms,约 10ms,可作为按键防抖延时
                                    //ms=1000 为1.015s ,约 1s 延时
          P2=~P2;      //P2取反,P2口是LED灯
       }
    }

    void delayms(ms)          // 延时子程序
    {    
      uint a,b,c;
      for(a=2;a>0;a--)
      for(b=46;b>0;b--)
      for(c=ms;c>0;c--);
    }

    转载于:https://www.cnblogs.com/steararre/archive/2012/03/12/2392620.html

    展开全文
  • 本文主要介绍了一下关于PIC单片机C语言延时程序和循环子程序实现方法。
  • 单片机里的延时子程序在编程中使用非常广泛,但一些读者在学习中不知道延时程序的编写方法,本文以图解的的形式详尽的回答读者。
  • 51单片机各种汇编延时子程序大集合51单片机各种汇编延时子程序大集合
  • DELY]:通用延时子程序[地址]:7FEBH - FFEBH[功能]:延时[入口]:延时常数放在R2寄存器中。时间常数N(十六进制)所对应的延时时间(6MZH晶振时)见下表:[出口]:R2=0[占用寄存器]:R2[调用]:无例:延时1秒子...
  • 谈谈51单片机里的延时子程序 谈谈 51 单片机里的延时子程序 延时程序在单片机编程中使用非常广泛 ,但一些 读者在学习中不知道延时程序怎么编程 ,不知道 机器 周期和指令周期的区别 ,不知道延时程序指令的 用法 , ,...
  • 单片机中常用的延时控制方式有两种。一种是采用编程的方式达到延时的目的,另一种方法则是通过单片机中的两个定时器T0和T1进行计时达到延时的目的... 此程序的实际延时时间为:1+(1+2×250+2)×20=10.061ms  (2)0.5
  • 谈谈51单片机里的延时子程序 延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器 ?周期和指令周期的区别不知道延时程序指令的用法, 本文就此问题从延时程序的基本概念机器...
  • 单片机通用延时子程序使用方法如下:1、如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。2、如果想精确延时,一般需要用到定时器,延时时间与...

    单片机通用延时子程序

    使用方法如下:1、如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。

    2、如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

    通用延时子程序 [地址]

    7FEBH - FFEBH [功能]:延时 [入口]:延时常数放在 R2 寄存器中。时间常数 N(十六进制)所对应的延时时间(6MZH 晶振时)见下表: [出口]:R2=0 [占用寄存器]:R2 [调用]:无 例:延时1 秒子程序 MOV R2,#18H LCALL 7FEBH RET ORG 7FEBH ;通用延时子程序(07EBH & 0FEBH & ...) L7FEB: PUSH 02H ;R2(复位后R2即为 02H)存放时间常数,进栈保护 L7FED: PUSH 02H ; R2 进栈保护 L7FEF:

    展开全文
  • 单片机延时C语言程序

    2020-12-27 09:54:18
    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--); } 产生的汇编: C:0x0800 7F0F MOV R7,#...
    (晶振12MHz,一个机器周期1us.)
    一. 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--);
    }
    产生的汇编:
    C:0x0800     7F0F      MOV       R7,#0x0F
    C:0x0802     7ECA      MOV       R6,#0xCA
    C:0x0804     7D51      MOV       R5,#0x51
    C:0x0806     DDFE      DJNZ      R5,C:0806
    C:0x0808     DEFA      DJNZ      R6,C:0804
    C:0x080A     DFF6      DJNZ      R7,C:0802
    C:0x080C     22        RET      
    计算分析:
    程序共有三层循环
    一层循环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--);
    }
    产生的汇编
    C:0x0800     7F05      MOV       R7,#0x05
    C:0x0802     7E84      MOV       R6,#0x84
    C:0x0804     7D96      MOV       R5,#0x96
    C:0x0806     DDFE      DJNZ      R5,C:0806
    C:0x0808     DEFA      DJNZ      R6,C:0804
    C:0x080A     DFF6      DJNZ      R7,C:0802
    C:0x080C     22        RET

    三. 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--);
    }
    产生的汇编
    C:0x0800     7F05      MOV       R7,#0x05
    C:0x0802     7E04      MOV       R6,#0x04
    C:0x0804     7DF8      MOV       R5,#0xF8
    C:0x0806     DDFE      DJNZ      R5,C:0806
    C:0x0808     DEFA      DJNZ      R6,C:0804
    C:0x080A     DFF6      DJNZ      R7,C:0802
    C:0x080C     22        RET      

    四. 1s延时子程序
    程序:
    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--);
    }
    产生的汇编
    C:0x0800     7F05      MOV       R7,#0x05
    C:0x0802     7E04      MOV       R6,#0x04
    C:0x0804     7D74      MOV       R5,#0x74
    C:0x0806     7CD6      MOV       R4,#0xD6
    C:0x0808     DCFE      DJNZ      R4,C:0808
    C:0x080A     DDFA      DJNZ      R5,C:0806
    C:0x080C     DEF6      DJNZ      R6,C:0804
    C:0x080E     DFF2      DJNZ      R7,C:0802

    C:0x0810     22        RET

     

     

     

    时钟周期    时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。   在一个时钟周期内,CPU仅完成一个最基本的动作。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟周期为250us。由于时钟脉冲是计算机的基本工作脉冲,它控制着计算机的工作节奏(使计算机的每一步都统一到它的步调上来)。显然,对同一种机型的计算机,时钟频率越高,计算机的工作速度就越快。但是,由于不同的计算机硬件电路和器件的不完全相同,所以其所需要的时钟周频率范围也不一定相同。我们学习的8051单片机的时钟范围是1.2MHz-12MHz。   在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。机器周期    在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。指令周期    指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。    通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。<h1 class="mb-5" style="margin: 0px; padding: 0px;"><span class="ask-title">当80C51单片机晶振频率为12MHz时,时钟周期.机器周期各是多少?</span></h1><pre id="answer-content-375512566" class="answer-text mb-10" name="code" style="white-space: pre-wrap; word-wrap: break-word;">答:1.时钟周期为晶振频率的倒数:1/12微秒;    2.机器周期为12个时钟周期:1微秒;

     

     

    想要学习单片机语言的盆友可以加xyd118118领取线下免费试听课程

     

     

    展开全文
  • 前几天上单片机课时,老师给我们讲了 单片机 延时子程序,我也发现延时 程序 在单片机中 是非常 常用的,很重要 做作业 写延时程序的时候,感觉根本就不会写,写出来了也是套出来 的,而且 根本就不精确 于是 我...
  • 51单片机的汇编语言延时子程序,在网上收集的,可供初学汇编语言的参考
  • PIC单片机C语言延时程序和循环子程序实现方法很多朋友说C中不能精确控制延时时间,不能象汇编那样直观。其实不然,对延时函数深入了解一下就能设计出一个理想的框价出来。一般的我们都用for(x=100;--x;){;}此句等同与x...
  • 单片机C语言延时程序

    2021-01-15 00:15:53
    单片机C语言延时程序用C语言写出来程序非常的...所以,通过测试我给大家提供一个延时子程序模块,并以此给一个出我们经常用到的延时的数据表格。(注意:表格中的数据只适合我的延时模块,对其他的延时程序不适用,切忌
  • 单片机C语言延时1MS子程序 void delay(unsigned int m) { unsigned int i; unsigned int j; for(i=0;i;i++) for(j=0;j;j++); }
  • 在给单片机写程序的时候往往需要一个微秒或者毫秒的延时子程序,但是C语言不同于汇编,很难根据语句确定准确的延时时间,经过各种查资料得到一种简单实用的方法:通过keil下断点调试确定时间。
  • 所以,通过测试我给大家提供一个延时子程序模块,并以此给一个出我们经常用到的延时的数据表格。(注意:表格中的数据只适合我的延时模块,对其他的延时程序不适用,切忌!!!!!!!!别到时候延时不对来骂我)
  • 概括了大部分51单片机常用子程序,A/D,D/A,延时,显示,通信等
  • 用C语言写出来程序非常的简练,它是一种模块化的语言,一种比汇编更高级的语言,但是就是这样一种语言也还是有它不足之处:它的延时很不好控制,...非常精确的C语言延时子程序用C语言写出来程序非常的简练,它是一种模...
  • 一.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--);}产生的汇编:C:0x0800 7F0F MOV R7,#0x0F7ECA MOV R6,#0xCA7D51 MOV R5,#0x51...
  • 单片机定时器延时程序单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR...
  • 想要调用子程序,只要输入 LCALL XXXX,XXXX代表你子程序的名字 如一个延时子程序 LCALL DELY1MS 这是调用一个延时1毫秒的延时子程序 当然,子程序的名字可以自己定 DELY1MS: 这个名字一定要与调用中出现的名字一样...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,544
精华内容 2,617
关键字:

单片机延时子程序的延时时间