新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機教程:單片機定時器、中斷試驗

        51單片機教程:單片機定時器、中斷試驗

        作者: 時間:2012-08-02 來源:網絡 收藏

        上面的兩個程序運行后,我們發現燈的閃爍非???,根本分辨不出來,只是視覺上感到燈有些晃動而已,為什么呢?我們能計算一下,中預置的數是5536,所以每計60000個脈沖就是定時時間到,這60000個脈沖的時間是多少呢?我們的晶體震蕩器是12M,所以就是60000微秒,即60毫秒,因此速度是非常快的。如果我想實現一個1S的定時,該怎么辦呢?在該晶體震蕩器瀕率下,最長的定時也就是65。536個毫秒??!上面給出一個例程。

        ORG 0000H

        AJMP START

        ORG 000BH ;0的向量地址

        AJMP TIME0 ;跳轉到真正的程序處

        ORG 30H

        START:

        MOV P1,#0FFH ;關所 燈

        MOV 30H,#00H ;軟件計數器預清0

        MOV TMOD,#00000001B ;定時/計數器0工作于方式1

        MOV TH0,#3CH

        MOV TL0,#0B0H ;即數15536

        SETB EA ;開總允許

        SETB ET0 ;開定時/計數器0允許

        SETB TR0 ;定時/計數器0開始運行

        LOOP: AJMP LOOP ;真正工作時,這里可寫任意程序

        TIME0: ;定時器0的處理程序

        PUSH ACC

        PUSH PSW ;將PSW和ACC推入堆棧保護

        INC 30H

        MOV A,30H

        CJNE A,#20,T_RET ;30H單元中的值到了20了嗎?

        T_L1: CPL P1.0 ;到了,取反P10

        MOV 30H,#0 ;清軟件計數器

        T_RET:

        MOV TH0,#15H

        MOV TL0,#9FH ;重置定時常數

        POP PSW

        POP ACC

        RETI

        END

        先自己分析一下,看看是怎么實現的?這里采用了軟件計數器的概念,思路是這樣的,先用定時/計數器0做一個50毫秒的定時器,定時是間到了以后并不是立即取反P10,而是將軟件計數器中的值加1,如果軟件計數器計到了20,就取反P10,并清掉軟件計數器中的值,不然直接返回,這樣,就變成了20次定時中斷才取反一次P10,因此定時時間就延長了成了20*50即1000毫秒了。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 通河县| 商洛市| 肇庆市| 柳林县| 津南区| 娄烦县| 卢龙县| 封丘县| 景宁| 象州县| 汉中市| 舟山市| 德保县| 阿瓦提县| 衡东县| 淅川县| 沙坪坝区| 名山县| 丁青县| 阳山县| 阳信县| 新乡县| 洮南市| 宣化县| 墨脱县| 灵宝市| 伊金霍洛旗| 响水县| 泽库县| 垦利县| 临夏县| 伊川县| 庆城县| 安徽省| 福泉市| 固原市| 新民市| 荥阳市| 贞丰县| 肃南| 澳门|