新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 談談51單片機延時子程序

        談談51單片機延時子程序

        作者: 時間:2016-11-26 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201611/321877.htm

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

        ;延時350uS

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

        time350us:movr5,#0afh;351us

        time350us_1:djnzr5,time350us_1

        ret

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

        ;延時500uS

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

        time500us:movr5,#0fah;501us

        time500us_1:djnzr5,time500us_1

        ret

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

        ;延時1mS

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

        time1ms:movr5,#0fah;1001us

        time1ms_1:nop

        nop

        djnzr5,time1ms_1

        ret

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

        ;延時2.5mS

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

        time2_5ms:movr5,#05h;2.496ms

        time2_5ms_1:movr6,#0f8h;497us

        djnzr6,$

        djnzr5,time2_5ms_1

        ret

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

        ;延時10mS

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

        time10ms:movr5,#14h;10.262ms

        time10ms_1:movr6,#0ffh;511us

        djnzr6,$

        djnzr5,time10ms_1

        ret

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

        ;延時50mS

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

        time50ms:movr5,#63h;49.996ms

        time50ms_1:movr6,#0fbh;503us

        djnzr6,$

        djnzr5,time50ms_1

        ret

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

        ;延時100mS

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

        time100ms:movr5,#0c3h;100.036ms

        time100ms_1:movr6,#0ffh;511us

        djnzr6,$

        djnzr5,time100ms_1

        ret

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

        ;延時200mS

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

        time200ms:movr5,#02h;250.351ms

        time200ms_1:movr6,#0f4h;125.173ms

        time200ms_2:movr7,#0ffh;511us

        djnzr7,$

        djnzr6,time200ms_2

        djnzr5,time200ms_1

        ret

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

        ;延時500mS

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

        time500ms:movr5,#04h;500.701ms

        time500ms_1:movr6,#0f4h;125.173ms

        time500ms_2:movr7,#0ffh;511us

        djnzr7,$

        djnzr6,time500ms_2

        djnzr5,time500ms_1

        ret

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

        ;延時1S

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

        time1s:movr5,#08h;1001.401ms

        time1s_1:movr6,#0f4h;125.173ms

        time1s_2:movr7,#0ffh;511us

        djnzr7,$

        djnzr6,time1s_2

        djnzr5,time1s_1

        ret

        12M晶振 機器周期為1US  NOP為單周期指令 DJNZ為雙周期指令.

        3)

        ;;晶振12MHZ,延時1秒

        DELAY:MOV72H,#100

        LOOP3:MOV71H,#100

        LOOP1:MOV70H,#47

        LOOP0:DJNZ70H,LOOP0

        NOP

        DJNZ71H,LOOP1

        MOV70H,#46

        LOOP2:DJNZ70H,LOOP2

        NOP

        DJNZ72H,LOOP3

        MOV70H,#48

        LOOP4:DJNZ70H,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個發光二極管,產生流水燈的移動效果。

        ORG0;程序從0地址開始

        START:MOVA,#0FEH;讓ACC的內容為11111110

        LOOP:MOVP2,A;讓P2口輸出ACC的內容

        RRA;讓ACC的內容左移

        CALLDELAY;調用延時子程序

        LJMPLOOP;跳到LOOP處執行

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

        DELAY:MOVR7,#200;R7寄存器加載200次數

        D1:MOVR6,#250;R6寄存器加載250次數

        DJNZR6,$;本行執行R6次

        DJNZR7,D1;D1循環執行R7次

        RET;返回主程序

        END;結束程序


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 邯郸市| 团风县| 奉化市| 萝北县| 察隅县| 四川省| 朝阳区| 鹤庆县| 和静县| 扎赉特旗| 辉南县| 六安市| 壤塘县| 克拉玛依市| 康马县| 安塞县| 阳春市| 怀化市| 南靖县| 崇文区| 千阳县| 上高县| 大城县| 安岳县| 吉林市| 开江县| 扎兰屯市| 平度市| 陵川县| 甘德县| 珲春市| 祥云县| 伊春市| 民权县| 深水埗区| 正镶白旗| 商城县| 灵宝市| 汉寿县| 醴陵市| 虞城县|