搜索
bottom↓
回复: 8

请教大家如何利用交流电源使单片机同步工作

[复制链接]

出0入0汤圆

发表于 2011-1-10 20:25:39 | 显示全部楼层 |阅读模式
想用检测交流电的方法使多个LED彩灯花样同步变化,请大家给个思路,先谢谢了。
==========
原程序如下:
;
;================================================================================   
              R0       ==    0X00
              TCC      ==    0X01
              PC       ==    0x02
              R3       ==    0X03
              PORT5    ==    0X05
              PORT6    ==    0X06
              IOCF     ==    0X0F
              IOCE     ==    0X0E
              IOCD     ==    0X0D
              R3F      ==    0X0F  ;不同型号修改
              C        ==    0X00         
              
              
              DELAY_C1 ==    0X10
              PWM_C1   ==    0X12
              PWM_C2   ==    0X13
              FLAG     ==    0X14
              BA       ==    0X15
              BR3      ==    0X16
              T_PARA   ==    0X17 ;变化周期
              I_PARA   ==    0X18 ;状态

              
              DIRECT_F ==    0
              COMP_F   ==    1
              AC_FLAG  ==    2
;===========================================================================
              TIME_PARA1==     1      ;可修改的时间参数
;============================================================================              
                       
              ORG     0X0
              JMP     START
            
;============================================================================            
;             ORG      0X8            ;中断服务程序
;INTT:        
;              MOV      BA,A
;              SWAP     BA
;              SWAPA    R3
;              MOV      BR3,A
;              
; ;             MOV      A,R3F           ;
; ;             JBS      R3F,2
; ;             JMP      INT_RETURN
;              clr       R3F
;              
;       inc   0x1d            
;              MOV     A,PWM_C2
;              SUB     A,T_PARA
;              JBS     0X03,0X02
;              JMP     INT_RETURN0
;              
;              MOV      A,@0
;              MOV      PWM_C2,A
;              MOV      PWM_C1,A
;              MOV      A,@TIME_PARA1        ;所有记数中断开始,严格同步
;              MOV      DELAY_C1,A
;              BS       FLAG,DIRECT_F
;              JMP     INT_RETURN   
;
;INT_RETURN0:
;              INC      PWM_C2
;
;INT_RETURN:
;              SWAPA    BR3
;              MOV      R3,A
;              SWAPA    BA
;              RETI                       
;============================================================================


;=====================================================================================
;上电后程序通过读拨码开关的状态,决定颜色变化的周期,
;以及开始点亮的初始状态
;P61,P62,P63,决定点亮的初始状态,P65,P66,P67,决定点颜色变化的周期,P64另做选程序用(led,lamp),
;P50,红,P51,绿,P52,蓝
;=====================================================================================            
START:        CALL    INIT             ;初始化
              MOV     A,@0X99
              MOV     T_PARA,A
/*             MOV     A,PORT6
              RRCA    PORT6
              MOV     T_PARA,A
              AND     A,@0X07
              MOV     I_PARA,A
              SWAPA   T_PARA
              AND     A,@0X07
              CALL    TRANS
              MOV     T_PARA,A
   
                           
              MOV     T_PARA,A
              MOV     A,I_PARA
              ADD     PC,A
              NOP             ;JMP     LOOP_T00取消第一个渐暗的状态
              JMP     LOOP_T10
              JMP     LOOP_T20
              JMP     LOOP_T30
              JMP     LOOP_T40
              JMP     LOOP_T50
              JMP     LOOP_T60
              JMP     LOOP_T70
              
TRANS:        ADD     PC,A
              NOP
              RETL    @0X33
              RETL    @0X66
              RETL    @0X99
              RETL    @0X0CC
              RETL    @0X0FF
              RETL    @0X0FF
              RETL    @0X0FF
              RETL    @0X0FF
              RETL    @0X0FF                     */
              
              
              
LOOP_T00:      MOV     A,@0B00000000        
               MOV     PORT5,A
            
LOOP_T0:      WDTC
              CALL    DELAY
              CALL    DETECT_AC
              JBS     FLAG,DIRECT_F
              JMP     LOOP_T0
              BC      FLAG,DIRECT_F         
   

LOOP_T10:     MOV     A,@0B00000000        
              MOV     PORT5,A
;============================================================
;红色由暗渐亮,其他暗
;============================================================              
LOOP_T1:     
              WDTC
              CALL    DELAY
              CALL    DETECT_AC
              MOV     A,PWM_C1
              SUB     A,PWM_C2
              JBS     0X03,0
              JMP     LT1
              BS      PORT5,3           
              JBS     FLAG,DIRECT_F
              JMP     LOOP_T1
              BC      FLAG,DIRECT_F
              JMP     LOOP_T20
              
       LT1:   BC      PORT5,3         
              JBS     FLAG,DIRECT_F   
              JMP     LOOP_T1
              BC      FLAG,DIRECT_F     
;============================================================
;红的保持亮,绿色由暗渐亮
;============================================================              
LOOP_T20:
              MOV     A,@0B00001000;1
              MOV     PORT5,A
            
LOOP_T2:      WDTC
              CALL    DELAY
              CALL    DETECT_AC
              MOV     A,PWM_C1
              SUB     A,PWM_C2
              JBS     0X03,0
              JMP     LT2
              BS      PORT5,1         
              JBS     FLAG,DIRECT_F
              JMP     LOOP_T2
              BC      FLAG,DIRECT_F
              JMP     LOOP_T30
              
       LT2:   BC      PORT5,1           
              JBS     FLAG,DIRECT_F   
              JMP     LOOP_T2
              BC      FLAG,DIRECT_F  

;============================================================
;绿色保持亮,红色色由亮渐暗
;============================================================               
LOOP_T30:  
              MOV     A,@0B00001010;1
              MOV     PORT5,A
              
LOOP_T3:      WDTC
              CALL    DELAY
              CALL    DETECT_AC
              MOV     A,PWM_C1
              SUB     A,PWM_C2
              JBS     0X03,0
              JMP     LT3
              BC      PORT5,3   
              JBS     FLAG,DIRECT_F
              JMP     LOOP_T3
              BC      FLAG,DIRECT_F
              JMP     LOOP_T40
              
       LT3:   BS      PORT5,3         
              JBS     FLAG,DIRECT_F   
              JMP     LOOP_T3
              BC      FLAG,DIRECT_F   

;============================================================
;绿色保持亮,兰色色由暗渐亮
;============================================================               
LOOP_T40:     MOV     A,@0B00000010;0
              MOV     PORT5,A
              
LOOP_T4:      WDTC
              CALL    DELAY
              CALL    DETECT_AC
              MOV     A,PWM_C1
              SUB     A,PWM_C2
              JBS     0X03,0
              JMP     LT4
              BS      PORT5,2     
              JBS     FLAG,DIRECT_F
              JMP     LOOP_T4
              BC      FLAG,DIRECT_F
              JMP     LOOP_T50
              
       LT4:   BC      PORT5,2  
              JBS     FLAG,DIRECT_F   
              JMP     LOOP_T4
              BC      FLAG,DIRECT_F  
              
;============================================================
;兰色保持亮,绿色由亮渐暗
;============================================================               
LOOP_T50:     MOV     A,@0B00000110;0
              MOV     PORT5,A
                        
LOOP_T5:      WDTC
              CALL    DELAY
              CALL    DETECT_AC
              MOV     A,PWM_C1
              SUB     A,PWM_C2
              JBS     0X03,0
              JMP     LT5
              BC      PORT5,1     
              JBS     FLAG,DIRECT_F
              JMP     LOOP_T5
              BC      FLAG,DIRECT_F
              JMP     LOOP_T60
              
       LT5:   BS      PORT5,1   
              JBS     FLAG,DIRECT_F   
              JMP     LOOP_T5
              BC      FLAG,DIRECT_F
                                                              
;============================================================
;兰色保持亮,红色由暗渐亮
;============================================================               
LOOP_T60:     MOV     A,@0B00000100;0
              MOV     PORT5,A
                              
LOOP_T6:      WDTC
              CALL    DELAY
              CALL    DETECT_AC
              MOV     A,PWM_C1
              SUB     A,PWM_C2
              JBS     0X03,0
              JMP     LT6
              BS      PORT5,3
              JBS     FLAG,DIRECT_F
              JMP     LOOP_T6
              BC      FLAG,DIRECT_F
              JMP     LOOP_T70
              
       LT6:   BC      PORT5,3
              JBS     FLAG,DIRECT_F   
              JMP     LOOP_T6
              BC      FLAG,DIRECT_F
                                
;============================================================
;红的保持亮,兰色色由亮渐暗
;============================================================            
LOOP_T70:  
              MOV     A,@0B00001100;1
              MOV     PORT5,A

LOOP_T7:      WDTC
              CALL    DETECT_AC
              CALL    DELAY
              MOV     A,PWM_C1
              SUB     A,PWM_C2
              JBS     0X03,0
              JMP     LT7
              BC      PORT5,2
              JBS     FLAG,DIRECT_F
              JMP     LOOP_T7
              BC      FLAG,DIRECT_F
              JMP     LOOP_T80
              
       LT7:    BS      PORT5,2        
              JBS     FLAG,DIRECT_F   
              JMP     LOOP_T7
              BC      FLAG,DIRECT_F                  
              JMP     LOOP_T80
;============================================================
;红色由暗渐亮
;============================================================               
LOOP_T80:     MOV     A,@0B00001000;1
              MOV     PORT5,A

LOOP_T8:      WDTC
              CALL    DELAY
              CALL    DETECT_AC
              MOV     A,PWM_C1
              SUB     A,PWM_C2
              JBS     0X03,0
              JMP     LT8
              BC      PORT5,3
              JBS     FLAG,DIRECT_F
              JMP     LOOP_T8
              BC      FLAG,DIRECT_F
              JMP     LOOP_T00
              
       LT8:   BS      PORT5,3
              JBS     FLAG,DIRECT_F   
              JMP     LOOP_T8
              BC      FLAG,DIRECT_F
              JMP    LOOP_T00                  
;=======================================================
;pwm_c1在T_PARA范围内记数,记满循环,    10个指令周期(不包括RET)
;=======================================================            
DELAY:        DJZ     DELAY_C1
              JMP     DEL0
              
              MOV     A,@TIME_PARA1
              MOV     DELAY_C1,A
              MOV     A,PWM_C1
              SUB     A,T_PARA
              JBC     0X03,0X02
              JMP     DE50
              NOP
              INC     PWM_C1
              RET
DE50:         MOV     A,@0
              MOV     PWM_C1,A
              RET
                           
DEL0:         NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP              
              RET

INIT:      
              mov    a,@0;@0b00001011
              CONTW
              IOW    PORT5                ;端口5设为输出
              MOV    PORT5,A              ;
              MOV    FLAG,A
              MOV    A,@00
              IOW    IOCF                 ;禁止中断
              MOV    A,@0X80
              IOW    IOCE                 ;关WDTE,P60为中断
              MOV    A,@0X0FF
              IOW    PORT6                ;设为输入,中断进入
              MOV    A,@0X01              ;P60用外部上拉,其他使能内部上拉
              IOW    IOCD
              MOV    A,@TIME_PARA1
              MOV    DELAY_C1,A
              
              CLRA
              MOV    PWM_C1,A
              MOV    PWM_C2,A
              
              
              RET              
;==============================================================================   
;检测交流电的波形下降延 ,此子程序15个指令周期(不包括ret),各分支执行时间相等
;==============================================================================  
DETECT_AC:    JBS      FLAG,AC_FLAG
              JMP      PORT60IS0
              
PORT60IS1:    JBC      PORT6,0    ;检测底电平是否到
              JMP      RET_DELAY0
              BC       FLAG,AC_FLAG ;底电平到,
              
              MOV     A,PWM_C2
              SUB     A,T_PARA
              JBS     0X03,0X02
              JMP     DETECT1
              
              MOV      A,@0
              MOV      PWM_C2,A
              MOV      PWM_C1,A
              MOV      A,@TIME_PARA1        ;所有记数中断开始,严格同步
              MOV      DELAY_C1,A
              BS       FLAG,DIRECT_F
              RET

DETECT1:      INC      PWM_C2
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              RET
              
PORT60IS0:    JBS      PORT6,0
              JMP      RET_DELAY
              
              BS       FLAG,AC_FLAG
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              RET                     

RET_DELAY:    NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              RET              
              
RET_DELAY0:   NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              NOP
              RET              
                                                           

                                
              
END              
            

这是在网上下载的艺术彩灯代码,能看懂汇编的朋友帮忙看看是怎样实现交流同步检测的。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-1-10 20:44:18 | 显示全部楼层
同时给电,计周波数

出0入0汤圆

发表于 2011-1-10 20:54:53 | 显示全部楼层
应该是不可以,除非你另外加入自己的控制信号

出0入0汤圆

 楼主| 发表于 2011-1-10 21:02:17 | 显示全部楼层
回复【1楼】lloovve
-----------------------------------------------------------------------

能不能具体一些,是用中断检测交流过零吗,如果是怎样检测呢

出0入0汤圆

 楼主| 发表于 2011-1-11 19:01:31 | 显示全部楼层
自己顶

出0入0汤圆

发表于 2012-6-12 08:30:47 | 显示全部楼层
wtiechen1969 发表于 2011-1-11 19:01
自己顶

知道怎么搞了没有,我也准备搞这种?

出0入0汤圆

发表于 2012-6-12 08:33:10 | 显示全部楼层
谢谢楼主的代码,先研究一下。

出0入0汤圆

发表于 2012-6-12 08:43:29 | 显示全部楼层
用单片机检测频率    计时          实现同步变化

出0入0汤圆

发表于 2012-6-12 08:53:46 | 显示全部楼层
1.所有的单片机都是挂在同一相线上,这个是硬件保证。

2.上电初始化之后,等待第一个上升沿,所有的单片机就都同步了。

3.以后每个单片机都固定在同一个边沿作为新的时间同步。


----------------------------------割了就好了------------------------------------------------------------

你指望一个颜色的变化小于10mS吗?那是给外星人看的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表