打印

求求大家了来帮帮我啊

[复制链接]
1458|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
piao520|  楼主 | 2008-12-30 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;---------------------------------------------------------------------------
;             以下为白织灯亮度调节程序
;             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, #0DH         ;设置初始亮度
           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,#9BH        ;定时为1ms预设值
           MOV         TL1,#0FFH
           SETB        EA              ;开总中断允许
           SETB        ET1             ;允许定时/计数1中断
           SETB        TR1             ;启动定时器
;-----------------------------------------------------------------------------
;             主程序(产生亮度调节脉冲)
;-----------------------------------------------------------------------------
MAIN:      JB      P3.0,    MAIN ;50HZ交流电未过零转MAIN
           SETB    P2.0          ;关调光脉冲
           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:     CLR         TR1
           CLR         ET1
           CLR         EA 
           MOV         TH1,#9BH       ;定时为1ms值
           MOV         TL1,#0FFH
           JB          T_ON_OFF, LOP1 ;长键标示位为1
           CLR         L_KEY          ;长键标示位为0,清亮度调节标示位
T_1:       JNB         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   ;未释放可转长键处判断
           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 ,       #01H,  LOOP2
           MOV         A,        #0DH  ;A中的值为1,重装A中的值
           MOV         B,        A     ;读出B中的值
           AJMP        INT_RET         ;退出中断
LOOP2:     SUBB        A,        50H   ;A中的值减2
           MOV         B,         A    ;读A中的值,作为亮度调节脉冲
INT_RET:   SETB        EA
           SETB        ET1
           SETB        TR1
           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

那位高手帮我调一下以上程序(白织灯亮度调节).
为什么我的程序没办法达到亮度调节的功能??
是因为中断时间问题?
还是因为过零点没处理好??
求求大家了来帮帮我啊
沙发
piao520|  楼主 | 2008-12-30 17:36 | 只看该作者

为什么没人帮我呢???

;---------------------------------------------------------------------------
;             以下为白织灯亮度调节程序
;             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--------------------------
现在有几个问题:
    第一,为什么按键按下时灯会灭
    第二,亮度调节没办法达到要求
    第三,当比较暗时灯闪的比较历害

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

185

帖子

0

粉丝