51微控制器亮燈程式(入門)

weixin_34337265發表於2016-12-30

------------------------------------------------------------------------------------------------------------

例0:

ORG   0000H

SETB  TR0          ;啟動T0

MOV   R2, #250      ;定時計數初值

LOOP:

MOV   TH0, #(8192 - 10000) / 32   ;定時10ms

MOV   TL0, #(8192 - 5000) MOD 32

JNB   TF0, $       ;等待10ms

CLR   TF0

DJNZ  R2, LOOP     ;每隔5ms,R2減一次

CPL   P1.0         ;R2為0則LED亮滅轉換

LJMP  0000H

END

例1:

ORG 0000H;程式端存放位置

LJMP MAIN;主程式入口

ORG 000BH   ;指明記憶體地址

LJMP T0ISR     ;

ORG 0030H;跳過異常向量區

MAIN:

MOV TMOD,#01H    ;定時器0,工作方式1

MOV TH0,#HIGH(65536-50000);為了配置定時器溢位週期為50000對TH0寫入初值。HIGH()、LOW()都是巨集定義,用於取雙位元組變數的高半位元組和低半位元組。

MOV TL0,#LOW(65536-50000);

SETB TR0    ;開啟定時器0

SETB ET0    ;開啟定時器0中斷

SETB EA     ;開啟總中斷

CLR P1.0    ;燈滅

MOV R2,#10;定時次數

SJMP $

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-50000)     ;重賦初值

MOV TL0,#LOW(65536-50000)

SETB TR0

DJNZ R2,T0E    ;定時次數減1直到0,非0時直接轉T0E退出

CPL P1.0      ;10次中斷到則LED取反

MOV R2,#10;重賦計數值

T0E:

RETI

END

例2:

ORG 0000H

start:

MOV P1,#0FFH

CALL delay

MOV P1,#0H

CALL delay

CALL delay

LJMP start

delay:

MOV R7,#100

d2:   MOV R6,#250

d1:   DJNZ R6,d1

DJNZ R7,d2

RET

END

;100*250次*2*1us=500ms=0.5s

例3:

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV TMOD,#01H

MOV TH0,#HIGH(65536-50000)

MOV TL0,#LOW(65536-50000)

MOV R2,#100

SETB TR0

SETB ET0

SETB EA

CLR P0.0

SJMP $

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-50000)

MOV TL0,#LOW(65536-50000)

SETB TR0

DJNZ R2,T0E

MOV R2,#100

JNZ T001

SETB P0.0

SJMP T0E

T001:

DEC A

MOV R3,A

SETB P0.0

CLR P0.1

SJMP T0E

T0E:

RETI

END

相關文章