打印

行行好!帮我指出程序问题!!最好能帮我改改

[复制链接]
2070|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
piao520|  楼主 | 2008-12-30 15:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;---------------------------------------------------------------------------
;             以下为白织灯亮度调节程序
;             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

那位高手帮我调一下以上程序(白织灯亮度调节).
为什么我的程序没办法达到亮度调节的功能??
是因为中断时间问题?
还是因为过零点没处理好??
求求大家了来帮帮我啊

相关帖子

沙发
beiji1984| | 2008-12-30 16:09 | 只看该作者

路过……

使用特权

评论回复
板凳
piao520|  楼主 | 2008-12-30 17:33 | 只看该作者

自己改了一下程序

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

使用特权

评论回复
地板
红心j| | 2008-12-30 20:22 | 只看该作者

放弃这个程序思想吧,这样是搞不好的

使用特权

评论回复
5
piao520|  楼主 | 2008-12-31 11:41 | 只看该作者

红心j大哥

那你能不能帮我整一个好一点的程序
        要不给个思路也行

使用特权

评论回复
6
gx_huang| | 2008-12-31 12:45 | 只看该作者

等你用C写程序了,我才有精力看!

使用特权

评论回复
7
红心j| | 2008-12-31 13:27 | 只看该作者

简单谈谈看法

一、简评
(1)一个小的时序方面错误
MAIN:      JB      P3.0,    MAIN ;50HZ交流电未过零转MAIN
           LCALL   DLX           ;过零点时调用延时子程序(延时可变)
           CLR     P2.0          ;发调光脉冲
           LCALL   DELAY         ;持续512微秒
           SETB    P2.0          ;关调光脉冲
           LJMP    MAIN          ;转MAIN循环(×××此处评论×××)

没有判断新的半周到来,又去循环触发,造成触发时序上的错误

(2)按键按下时,由于检测时间长,造成过长时间没有触发,引起灯灭现象

二、编程思路

(1)可控硅的触发时序是最重要的实时处理事件,应具有绝对优先处理地位,不应被其它事件干扰。
(2)按键事件的处理可以是最不重要的。
(3)重要的实时处理事件应采用高级中断方式处理
(4)不重要的事件应采用低级中断方式和主程序循环中软件查询处理
(5)实时事件应采用中断处理方式

三、其他提醒

(1)时序、中断是MCU设计的重要环节,事关设计能力和设计水平

(2)如有其它疑问,可以联络,QQ:78166267

使用特权

评论回复
8
piao520|  楼主 | 2008-12-31 13:59 | 只看该作者

我想很快我就要用C了

  gx_huang 谢谢! 明年我肯定学C
   

       在这非常感谢! 红心j大师,让我在脑子中感觉有那么一点的灵感!
  红心j大师您好!这么说的话,我是不是要设置两个中断,把控制可控硅的中断设置成最为优先的中断和中断频率要快是这样子的吗???
        还是说,我把要可控硅的触发时序做成中断,然后把按键调节的程序做为主程序或底级中断????

使用特权

评论回复
9
红心j| | 2009-1-1 03:28 | 只看该作者

原则就是可控硅控制时序不能被干扰

一、交流过零信号边沿触发外部中断,然后
(1)初级编程:软件延时,找到可控硅触发点,输出触发信号
(2)高级编程:开定时器,退出外部中断;然后在定时器中断时得到可控硅触发点,输出触发信号。
(3)过零中断和定时器中断都应为高优先级中断

二、键盘处理可以采用低优先级中断方式处理,也可以采用主程序中查询处理,其中后者对初级编程来说不宜产生错误。

使用特权

评论回复
10
piao520|  楼主 | 2009-3-5 17:22 | 只看该作者

谢谢红心j 大哥

     最近有点小忙都没有再试!改天找个时间好好的从新试一下.到时有不明白的再找您学习学习.

使用特权

评论回复
11
xwj| | 2009-3-5 17:24 | 只看该作者

红心j???

听说过红心j蛋,不知道是不是红心j生的?

使用特权

评论回复
12
bjc125| | 2009-3-5 17:25 | 只看该作者

路过

使用特权

评论回复
13
21ic7158| | 2009-3-9 10:44 | 只看该作者

汇编看着就晕呐

相比还是C语言简单一些

使用特权

评论回复
14
piao520|  楼主 | 2009-3-10 17:01 | 只看该作者

C语言我一直想学,但都没行动

  在我的印像当中,C很难,所以我都没有勇气去学!!

使用特权

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

本版积分规则

20

主题

185

帖子

0

粉丝