作者:未知 来源:89s52.cn
;*************************************
;* (INCEPT3.ASM) * *
;* *
;*************************************
;
;**********************************************************************
;* *
;* A P1.0 1 40 VCC *
;* B P1.1 2 39 P0.0 LED0 *
;* C P1.2 3 38 P0.1 LED1 *
;* P1.3 4 37 P0.2 LED2 *
;* P1.4 5 36 P0.3 LED3 *
;* P1.5 6 35 P0.4 LED4 *
;* P1.6 7 34 P0.5 LED5 *
;* P1.7 8 33 P0.6 LED6 *
;* 100HZ RST 9 32 P0.7 LED7 *
;* P3.0 10 MCS-51 31 EA VDD *
;* P3.1 11 30 ALE *
;* REMOTEIN P3.2 12 29 PSEN *
;* P3.3 13 28 P2.7 调光脉冲 *
;* P3.4 14 27 P2.6 LED8 *
;* P3.5 15 26 P2.5 LED9 *
;* P3.6 16 25 P2.4 LED10 *
;* P3.7 17 24 P2.3 LED11 *
;* XTAL2 18 23 P2.2 LED12 *
;* XTAL1 19 22 P2.1 LED13 *
;* VSS 20 21 P2.0 DEV14(灯泡) *
;* *
;* *
;**********************************************************************
;注:P3.0为100HZ的交流电源过零点相位参考输入
;
;
;*************************************
;* *
;* 主程序和中断程序入口 *
;* *
;*************************************
ORG 0000H ;程序开始地址
LJMP START ;跳至START执行
ORG 0003H ;外中断0中断入口
LJMP INTEX0 ;跳至INTEX0执行中断服务程序
ORG 000BH ;定时器T0中断入口地址
RETI ;中断返回(不开中断)
ORG 0013H ;外中断1中断入口地址
RETI ;中断返回(不开中断)
ORG 001BH ;定时器T1中断入口地址
RETI ;中断返回(不开中断)
ORG 0023H ;串行口中断入口地址
RETI ;中断返回(不开中断)
ORG 002BH ;定时器T2中断入口地址
RETI ;中断返回(不开中断)
;
;***************************
;* *
;* 初始化程序 *
;* *
;****************************
CLEARMEMIO: CLR A ;
DEC A ;A为#0FFH
MOV P0,A ;P1-P3口置1
MOV P1,A ;
MOV P2,A ;
MOV P3,A ;
CLEARMEM: MOV IE,#00H ;关所有中断
SETB EX0 ;开外中断
SETB EA ;总中断允许
RET ;子程序返回
;
;*************************************
;* *
;* 主程序 *
;* *
;*************************************
START: LCALL CLEARMEMIO ;上电初始化
LCALL LOOP ;调用调光控制程序
;
MAIN: JB P3.0,MAIN ;50HZ交流电未过零转MAIN
LCALL DLX ;过零点时调用延时子程序(延时可变)
CLR P2.7 ;发调光脉冲
LCALL DELAY ;持续512微秒
SETB P2.7 ;关调光脉冲
LJMP MAIN ;转MAIN循环
NOP ;PC值出错处理
NOP
LJMP START ;出错时重新初始化
;******************************
; 遥控接收程序
;******************************
;采用中断接收
INTEX0: CLR EX0 ;关外中断
JNB P3.1,READ1 ;P3.1口为低电平转READ1
READOUTT0: SETB EX0 ;P3.1口为高电平开中断(系干扰)
RETI ;退出中断
;
READ1: CLR A ;清A
MOV DPH,A ;清DPTR
MOV DPL,A ;
HARD1: JB P3.1,HARD11 ;P3.1变高电平转HARD11
INC DPTR ;用DPTR对低电平计数
NOP ;1微秒延时
NOP
AJMP HARD1 ;转HARD1循环(循环周期为8微秒)
HARD11: MOV A,DPH ;DPTR高8位放入A
JZ READOUTT0 ;为0(脉宽小于8*255=2毫秒)退出
CLR A ;不为0,说明是第一个宽脉冲(3毫秒)
READ11: INC A ;脉冲个数计1
READ12: JNB P3.1,READ12 ;低电平时等待
MOV R1,#06H ;高电平宽度判断定时值
READ13: JNB P3.1,READ11 ;变低电平时转READ11脉冲计数
LCALL DELAY ;延时(512微秒)
DJNZ R1,READ13 ;6次延时不到转READ13再延时
DEC A ;超过3毫秒判为结束,减1
DEC A ;减1
JZ FUN0 ;为0执行FUN0(2个脉冲)
DEC A ;减1
JZ FUN1 ;为0执行FUN1(3个脉冲)
DEC A ;
JZ FUN2 ;为0执行FUN2(4个脉冲)
DEC A ;
JZ FUN3 ;为0执行FUN3(5个脉冲)
DEC A ;
JZ FUN4 ;为0执行FUN4(6个脉冲)
DEC A ;
JZ FUN5 ;为0执行FUN5(7个脉冲)
DEC A ;
JZ FUN6 ;为0执行FUN6(8个脉冲)
DEC A ;
JZ FUN7 ;为0执行FUN7(9个脉冲)
DEC A ;
JZ FUN8 ;为0执行FUN8(10个脉冲)
DEC A ;
JZ FUN9 ;为0执行FUN9(11个脉冲)
DEC A ;
JZ FUN10 ;为0执行FUN10(12个脉冲)
DEC A ;
JZ FUN11 ;为0执行FUN11(13个脉冲)
DEC A ;
JZ FUN12 ;为0执行FUN12(14个脉冲)
DEC A ;
JZ FUN13 ;为0执行FUN13(15个脉冲)
DEC A ;
JZ FUN14 ;为0执行FUN14(16个脉冲)
DEC A ;
JZ FUN15 ;为0执行FUN15(17个脉冲)
NOP ;
NOP ;
LJMP READOUTT0 ;出错退出
;
FUN0: CPL P0.0 ;P0口各端口开关输出控制
LJMP READOUTT0 ;转中断退出
FUN1: CPL P0.1 ;
LJMP READOUTT0 ;
FUN2: CPL P0.2
LJMP READOUTT0
FUN3: CPL P0.3
LJMP READOUTT0
FUN4: CPL P0.4
LJMP READOUTT0
FUN5: CPL P0.5
LJMP READOUTT0
FUN6: CPL P0.6
LJMP READOUTT0
FUN7: CPL P0.7
LJMP READOUTT0
FUN8: CPL P2.6 ;P2口各端口开关输出控制
LJMP READOUTT0 ;转中断退出
FUN9: CPL P2.5
LJMP READOUTT0
FUN10: CPL P2.4
LJMP READOUTT0
FUN11: CPL P2.3
LJMP READOUTT0
FUN12: CPL P2.2
LJMP READOUTT0
FUN13: CPL P2.1
LJMP READOUTT0
FUN14: CPL P2.0 ;P2.0口开关控制
LJMP READOUTT0 ;转中断退出
FUN15: DEC P1 ;P1口值减1
MOV A,P1 ;移入A
CJNE A,#0F7H,OUTT0 ;不等转OUTT0(显示值小于7)
CLR A ;相等清A
DEC A ;A为#0FFH
MOV P1,A ;放回P1(显示值为7)
OUTT0: LCALL LOOP ;亮度调整
LJMP READOUTT0 ;中断退出
;
;*************************************
;* 延时 255 X 2 = 512 us *
;*************************************
;
DELAY: MOV R0,#0FFH
DELAY1: DJNZ R0,DELAY1
RET
;
;*************************************
;* 延时10 ms *
;*************************************
;
DL10MS: MOV R1,#14H
DL10MS1: LCALL DELAY
DJNZ R1,DL10MS1
RET
;
;*************************************
;* 调光延时时间控制 *
;*************************************
;
DLX: MOV R2,B ;置延时初值
DLX1: LCALL DELAY ;调512微秒延时子程序
DJNZ R2,DLX1 ;循环控制
RET ;返回
;
;*************************************
;* 调光控制程序 *
;*************************************
;根据数码管指示值设置调光脉冲延时值
LOOP: MOV A,P1 ;读入P1口值
SUBB A,#0FFH ;比较
JZ LOOP7 ;值为#0FFH(显示7)时转LOOP7
MOV A,P1 ;
SUBB A,#0FEH ;
JZ LOOP6 ;值为#0FEH(显示6)时转LOOP6
MOV A,P1 ;
SUBB A,#0FDH ;
JZ LOOP5 ;值为#0FDH(显示5)时转LOOP5
MOV A,P1 ;
SUBB A,#0FCH ;
JZ LOOP4 ;值为#0FCH(显示4)时转LOOP4
MOV A,P1 ;
SUBB A,#0FBH ;
JZ LOOP3 ;值为#0FBH(显示3)时转LOOP3
MOV A,P1 ;
SUBB A,#0FAH ;
JZ LOOP2 ;值为#0FAH(显示2)时转LOOP2
MOV A,P1 ;
SUBB A,#0F9H ;
JZ LOOP1 ;值为#0F9H(显示1)时转LOOP1
MOV A,P1 ;
SUBB A,#0F8H ;
JZ LOOP0 ;值为#0F8H(显示0)时转LOOP0
RET ;返回
;
LOOP7: MOV B,#01H ;设置延时值#01H(最亮)
RET ;返回
LOOP6: MOV B,#02H ;设置延时值#02H(次亮)
RET ;返回
LOOP5: MOV B,#04H ;
RET
LOOP4: MOV B,#06H ;
RET
LOOP3: MOV B,#08H ;
RET
LOOP2: MOV B,#0AH ;
RET
LOOP1: MOV B,#0CH ;设置延时值#0CH(次暗)
RET ;返回
LOOP0: MOV B,#0DH ;设置延时值#0DH(最暗)
RET ;返回
;
END ;程序结束