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