;--------------------------------------------------------------------------- ; 以下为白织灯亮度调节程序 ; P0.2,为开调光和调光亮度调节 ; P2.2,为蜂鸣器 ; P2.0,控制可控硅脉冲信号(控制白织灯亮度) ;---------------------------------------------------------------------------- ; 标示位 ;----------------------------------------------------------------------------- T_ON_OFF BIT 01H ;亮度调节标示位(当该位为1时可调)长键标示位 L_KEY BIT 02H ;变亮标示位 ;----------------------------------------------------------------------------- ; 上电软件复位 ;----------------------------------------------------------------------------- ORG 0000H ;程序开始地址 LJMP START ;跳至START执行 ORG 001BH ;定时器T1中断入口地址 LJMP INTT1 ;跳至INTT1中断服务程序 ORG 100H ;------------------------------------------------------------------------------ ; 上电初始化程序 ;------------------------------------------------------------------------------ START: MOV P0,#0FFH ;P0-P3口置1 MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH MOV B, #0EH ;设置初始亮度 MOV A, B MOV 73H,#5H ;蜂鸣器响50MS MOV 74H,#64H ;长按一秒为长键 MOV 50H, #02H ;按一次B中的内容减2 MOV IE,#00H ;关所有中断 MOV TMOD,#10H ; 定时/计数器1工作在方式1状态 MOV TH1,#0F5H ;定时为1ms预设值 MOV TL1,#0FFH SETB EA ;开总中断允许 SETB ET1 ;允许定时/计数1中断 SETB TR1 ;启动定时器 ;----------------------------------------------------------------------------- ; 主程序(产生亮度调节脉冲) ;----------------------------------------------------------------------------- MAIN: JB P3.0, MAIN ;50HZ交流电未过零转MAIN LCALL DLX ;过零点时调用延时子程序(延时可变) CLR P2.0 ;发调光脉冲 LCALL DELAY ;持续512微秒 SETB P2.0 ;关调光脉冲 LJMP MAIN ;转MAIN循环 DLX: MOV 52H, B ;置延时初值 DLX1: LCALL DELAY ;调512微秒延时子程序 DJNZ 52H, DLX1 ;循环控制 RET ;返回 ;--------------------------------------------------------------------------------- ; 中断子程序 ;--------------------------------------------------------------------------------- INTT1: MOV TH1,#0F5H ;定时为1ms值 MOV TL1,#0FFH 1_____________________________________________________________________ JB T_ON_OFF, LOP1 ;长键标示位为1 (将JNB改成JB)1_____________________________________________________________________ CLR L_KEY ;长键标示位为0,清亮度调节标示位 T_1: JB P0.2, T_2 ;P0.2=0有键按下(T_ON_OFF为0)所以只能长键有效 AJMP INT_RET ;退出中断 T_2: ACALL DL10MS ;调用延时去抖 JB P0.2, INT_RET ;干扰退出中断 DJNZ 74H, T_2 ;还没到1秒继续查P0.2 MOV 74H, #64H ;到了1秒,重装 T_3: JNB P0.2, T_3 ;等待按键释放 ACALL BZ ;调用蜂鸣器子程序 SETB T_ON_OFF ;置长键标示位 SETB L_KEY ;置短键标示位 AJMP INT_RET ;退出中断 LOP1: JB L_KEY, LOP2 ;短键标示位为1 AJMP INT_RET ;短键标示位为0,退出中断 LOP2: JNB P0.2, LOP3 ;短键标示位为1,查P0.2是否有按下 AJMP INT_RET ;没键按下退出中断 LOP3: ACALL DL10MS ;调用去抖动 JB P0.2, INT_RET LOP4: JNB P0.2, LOP6 ;未释放可转长键处判断 2------------------------------------------------------------------- MOV 74H, #64H ;比上程序多加了一条 2-------------------------------------------------------------------- AJMP LOOP ;释放转短键处理程序 LOP6: ACALL DL10MS ;调用延时 DJNZ 74H, LOP4 ;判断1秒时间还没到转短键 LOP7: JNB P0.2, LOP7 ;1秒时间到,等等长键释放 MOV 74H, #64H ;重新装延时1秒循环值 ACALL BZ ;调用蜂鸣器程序 CLR T_ON_OFF ;清长键标示 CLR L_KEY ;清短键标示 AJMP INT_RET ;退出中断 LOOP: MOV A, B ;读B中的值 CJNE A , #00H, LOOP2 MOV A, #0EH ;A中的值为1,重装A中的值 MOV B, A ;读出B中的值 AJMP INT_RET ;退出中断 LOOP2: SUBB A, 50H ;A中的值减2 MOV B, A ;读A中的值,作为亮度调节脉冲 INT_RET: RETI ;中返回 ;------------------------------------------------------------------------------------ ;延时子程序采用循环结构实现513微秒、10微秒、500微秒延时功能。 ;------------------------------------------------------------------------------------- DELAY: MOV 71H, #0FFH ;513微秒延时程序 DELAY1: DJNZ 71H, DELAY1 RET DL10MS: MOV R3, #14H ;10毫秒延时程序 DL10MS1: LCALL DELAY DJNZ R3, DL10MS1 RET DL500MS: MOV 72H,#32H ;500毫秒延时程序 DL500MS1: LCALL DL10MS DJNZ 72H,DL500MS1 RET BZ: CLR P2.2 BZ1: ACALL DL10MS DJNZ 73H, BZ1 SETB P2.2 RET END 说明:上面在1___________________________中间是有改动 2-------------------------- 现在有几个问题: 第一,为什么按键按下时灯会灭 第二,亮度调节没办法达到要求 第三,当比较暗时灯闪的比较历害 |