51单片机亮灯程序(入门)

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

例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

你可能感兴趣的:(51单片机亮灯程序(入门))