新聞中心

        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毫秒了。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 巩义市| 莎车县| 海盐县| 温州市| 娱乐| 锦州市| 安溪县| 长葛市| 仁寿县| 大悟县| 清流县| 乌拉特中旗| 阜南县| 临沂市| 永济市| 皮山县| 上杭县| 宁化县| 宜良县| 东源县| 曲阳县| 年辖:市辖区| 南丰县| 宜兰县| 高淳县| 九寨沟县| 晋中市| 荣成市| 宝丰县| 蒙自县| 酒泉市| 泾川县| 延庆县| 象山县| 阿拉善盟| 郎溪县| 灯塔市| 河间市| 水富县| 孟津县| 交口县|