英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 3934|回复: 0
打印 上一主题 下一主题

[分享]遥控七彩灯

[复制链接]
跳转到指定楼层
1#
发表于 2012-8-20 10:49:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;----------------------------------------------------------
;项目名称:PIC12F629 PWM
;项目简介:遥控七彩灯
;造的。采用PIC12F629作主控,在用中断产生三路PWM信号,还要进行
;红外信号解码。对于PIC12F629来说很居有挑战性。。
;
;实现功能:PIC12F629工作于5V-20MHz,用定时中断产生三路PWM
;信号驱动RGBLED,配合三基色原理,实现多彩渐变,十三色跳变。
;红外接收头将解调后的信号输入PIC12F629,用软件对信号进行解
;码处理。识别出三个按键,分别为关机模式,渐变模式,跳变模式。
;
;编译平台:MPASMWIN v5.30.01, mplink v4.30.01 MPLAB V8.30
;----------------------------------------------------------
;定义器件, 默认为十进制
        list P = 12f629, R = DEC
;加载头文件            
  #include <p12f629.inc>        
;熔丝配置:20M振荡器,看门狗关,使能上电延时,内部复位,欠压检测开
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_ON
;----------------------------------------------------------
;共阳 LED
#define    ANODE
;共阴 LED
;#define   CATHODE
;定时器初值
#define     TIME_VALUE  240
;电平时间常数           中断补尝  实际数据
#define     TIME_DECO   1600      ;1950
#define     TIME_DELAY  20        ;30
;关机模式
#define     OFF     00000000B
;渐变模式
#define     MICRO   00000011B
;跳变模式
#define     JUMP    00000101B
;按键数据
#define     KEY_1   00001100B
#define     KEY_2   00001010B
#define     KEY_3   00000110B
;换页操作
#define     BANK0   BCF STATUS,RP0
#define     BANK1   BSF STATUS,RP0
;红外信号输入
#define     SIGNA   GPIO,3
;内存分配
WM 周期计数
#define     PWM_H   20H
#define     PWM_L   21H
WM 电平缓冲
#define     OUT_H   22H
#define     OUT_L   23H
MW 占空比
#define     DUTY    24H
;查表索引值
#define     INDEX   25H
WM 输出时间
#define     TIME_1  26H   
#define     TIME_2  27H
;任务状态标志
#define     MARK    28H  
;跳变 渐变模式
#define     FUNC    29H      
;中断现场保护
#define     W_TEMP  2AH
#define     S_TEMP  2BH
;共接收32位
#define     BYTE    2CH
#define     BIT     2DH
;电平时间计数
#define     COUNT   2EH
#define     DELAY   2FH
;接收缓冲区
#define     BUFF_0  5CH
#define     BUFF_1  5DH
#define     BUFF_2  5EH
#define     BUFF_3  5FH
;----------------------------------------------------------
        ORG     0000H
        GOTO    START
;----------------------------------------------------------  
;函数名称:TIME_ISR:
;输入参数:无
;输出参数:无
;功能描述:定时器中断服务
;----------------------------------------------------------
        ORG     00004H
TIME_ISR:
;       保护中断现场
        MOVWF   W_TEMP
        SWAPF   STATUS,W
        MOVWF   S_TEMP
;       中断服务 模式识别
        
;       开关机识别
        BTFSS   FUNC,0
        GOTO    $+5
;       渐变模式
        BTFSC   FUNC,1
        CALL    MODE_MICRO
;       跳变模式
        BTFSC   FUNC,2
        CALL    MODE_JUMP
;       清中断标志
        BCF    INTCON,T0IF
;       加载定时器初值
        MOVLW   TIME_VALUE
        MOVWF   TMR0
;       还原中断现场
        SWAPF   S_TEMP,W
        MOVWF   STATUS
        SWAPF   W_TEMP,F
        SWAPF   W_TEMP,W
;       中断返回
        RETFIE
;----------------------------------------------------------  
;函数名称:START
;输入参数:无
;输出参数:无
;功能描述:上电初始化
;----------------------------------------------------------
START:
  BANK0
#IFDEF  ANODE
;       共阳 关闭LED
        MOVLW   00000111B
        MOVWF   GPIO
#ELSE
;       共阴 关闭LED
        CLRF    GPIO
#ENDIF
        
;       关模拟比较器
        MOVLW    00000111B
        MOVWF    CMCON
;               |-------- GIE  禁止所有中断
;               | |------ T0IE 使能定时中断
;               | |  |--- T0IF 定时标志清零
        MOVLW   00100000B
        MOVWF   INTCON

        BANK1
;                   |---- IR_IN 输入
;                   ||--- LED_B 输出
;                   |||-- LED_G 输出
;                   ||||- LED_R 输出              
        MOVLW   00001000B
        MOVWF   TRISIO
;               |-------- GPPU 上拉被禁止
;               ||------- INTEDG
;               |||------ T0CS 内部指令周期
;               ||||----- T0SE
;               |||||---- PSA 分配给WDT
;               ||||||--- PS2 分频比 1:1      
;               |||||||-- PS1
;               ||||||||- PS0
        MOVLW   10000000B
        MOVWF   OPTION_REG
        BANK0
        GOTO    MAIN
;----------------------------------------------------------  
;函数名称:INDEX_MICRO
;输入参数:查表索引 W
;输出参数:LED 数据 W
;功能描述:渐变查表点亮LED
;----------------------------------------------------------
INDEX_MICRO:
;       渐变模式查表
        MOVWF   PCL
TAB_MICRO:
;                |--------- LED_B PWM_H_OUT
;                ||-------- LED_G
;                |||------- LED_R               
;                ||| |----- LED_B PWM_L_OUT
;                ||| ||---- LED_G
;                ||| |||--- LED_R  
;                ||| |||               
        RETLW   00010001B ; 红
        RETLW   00110001B ; 红 > 黄
        RETLW   00110011B ; 黄
        RETLW   00100011B ; 黄 > 绿
        RETLW   00100010B ; 绿
        RETLW   01100010B ; 绿 > 青
        RETLW   01100110B ; 青
        RETLW   01000110B ; 青 > 蓝
        RETLW   01000100B ; 蓝
        RETLW   01010100B ; 蓝 > 紫

        RETLW   01010101B ; 紫
        RETLW   01110101B ; 紫 > 白

        RETLW   01110111B ; 白
        RETLW   00010111B ; 白 > 红
;----------------------------------------------------------  
;函数名称:INDEX_JUMP
;输入参数:查表索引 W
;输出参数:LED 数据 W
;功能描述:跳变查表点亮LED
;----------------------------------------------------------
INDEX_JUMP:
;       跳变模式查表
        MOVWF   PCL
TAB_JUMP:
;                |--------- LED_B PWM_H_OUT
;                ||-------- LED_G
;                |||------- LED_R               
;                ||| |----- LED_B PWM_L_OUT
;                ||| ||---- LED_G
;                ||| |||--- LED_R  
;                ||| |||                  
        RETLW   00010001B ; 红
        RETLW   00100010B ; 绿
        RETLW   01000100B ; 蓝
        RETLW   00110011B ; 黄
        RETLW   01100110B ; 青
        RETLW   01010101B ; 紫
        RETLW   00010011B ; 浅黄
        RETLW   00100110B ; 浅青
        RETLW   01000101B ; 浅紫
        RETLW   00110001B ; 深黄
        RETLW   01100010B ; 深青
        RETLW   01010100B ; 深紫
        RETLW   01110111B ; 白
;----------------------------------------------------------  
;函数名称:MODE_MICRO
;输入参数:无
;输出参数:无
;功能描述:RGB 渐变模式
;----------------------------------------------------------
MODE_MICRO:  
;       1号任务
        BTFSC   MARK,0
        GOTO    PWM_L_MICRO
;       2号任务
        BTFSC   MARK,1
        GOTO    PWM_H_MICRO
;       3号任务
        BTFSC   MARK,2
        GOTO    PWM_CYCLE_MICRO
;       4号任务
        BTFSC   MARK,3
        GOTO    PWM_TIME_MICRO
INIT_MICRO:
;       PWM  索引查表   
        MOVF    INDEX,W
        ADDLW   TAB_MICRO
        CALL    INDEX_MICRO
;       PWM_L 数据缓存        
        MOVWF   OUT_L
;       PWM_H 数据缓存
        SWAPF   OUT_L,W
        MOVWF   OUT_H
;       LED 共阴 共阳识别
        #IFDEF  ANODE
        COMF    OUT_H,F
        COMF    OUT_L,F
        #ENDIF
;       加载最小占空比 1 / 256
        INCF    DUTY,F
PWM_TIME_MICRO:
;       下个任务
        MOVLW   0x04
        MOVWF   MARK
;       PWM 时间计数 7
        MOVLW   7
        MOVWF   TIME_1
PWM_CYCLE_MICRO:
;       下个任务
        MOVLW   0x02
        MOVWF   MARK
;       PWM_H 周期计数
        MOVF    DUTY,W
        MOVWF   PWM_H
;       PWM_L 周期计数
        SUBLW   0
        MOVWF   PWM_L
;       PWM 输出高电平
        MOVF    OUT_H,W
        MOVWF   GPIO
PWM_H_MICRO:
        DECFSZ  PWM_H,F
        RETURN
;       下个任务
        MOVLW   0x01
        MOVWF   MARK
;       PWM 输出低电平
        MOVF    OUT_L,W
        MOVWF   GPIO
PWM_L_MICRO:
        DECFSZ  PWM_L,F
        RETURN
;       下个任务
        MOVLW   0x04
        MOVWF   MARK
;       PWM 时间计数
        DECFSZ  TIME_1,F
        RETURN      
;       下个任务
        MOVLW   0x08
        MOVWF   MARK
;       PWM 占空比递增
        INCFSZ  DUTY,F
        RETURN
;       重置任务
        CLRF    MARK
;       查表索引值递增
        INCF    INDEX,F
        MOVF    INDEX,W

;       查表索引值是否超界
        SUBLW   14
        BTFSC   STATUS,Z
  
;       索引值清零
        CLRF    INDEX     
;       函数返回
        RETURN
;----------------------------------------------------------  
;函数名称:MODE_JUMP
;输入参数:无
;输出参数:无
;功能描述:RGB跳变模式
;----------------------------------------------------------
MODE_JUMP:
;       1号任务
        BTFSC   MARK,0
        GOTO    PWM_L_JUMP
;       2号任务
        BTFSC   MARK,1
        GOTO    PWM_H_JUMP
;       3号任务
        BTFSC   MARK,2
        GOTO    PWM_CYCLE_JUMP
INIT_JUMP:
;       PWM 索引查表   
        MOVF    INDEX,W
        ADDLW   TAB_JUMP
        CALL    INDEX_JUMP
;       PWM_L 数据缓存        
        MOVWF   OUT_L
;       PWM_H 数据缓存
        SWAPF   OUT_L,W
        MOVWF   OUT_H
;       LED 共阴 共阳识别
        #IFDEF  ANODE
        COMF    OUT_H,F
        COMF    OUT_L,F
        #ENDIF
;       加载固定占空比 76 / 256
        MOVLW   76
        MOVWF   DUTY
PWM_TIME_JUMP:
;       下个任务
        MOVLW   0x04
        MOVWF   MARK
;       PWM 时间计数 7 * 256
        MOVLW   7
        MOVWF   TIME_1
        CLRF    TIME_2
PWM_CYCLE_JUMP:
;       下个任务
        MOVLW   0x02
        MOVWF   MARK
;       PWM_H 周期计数
        MOVF    DUTY,W
        MOVWF   PWM_H
;       PWM_L 周期计数
        SUBLW   0
        MOVWF   PWM_L
;       PWM 输出高电平
        MOVF    OUT_H,W
        MOVWF   GPIO
PWM_H_JUMP:
        DECFSZ  PWM_H,F
        RETURN
;       下个任务
        MOVLW   0x01
        MOVWF   MARK
;       PWM 输出低电平
        MOVF    OUT_L,W
        MOVWF   GPIO
PWM_L_JUMP:
        DECFSZ  PWM_L,F
        RETURN
;       下个任务
        MOVLW   0x04
        MOVWF   MARK
;       PWM 时间计数 7 * 256
        DECFSZ  TIME_2,F
        GOTO    PWM_CYCLE_JUMP
        DECFSZ  TIME_1,F
        GOTO    PWM_CYCLE_JUMP
;       重置任务
        CLRF    MARK
;       查表索引值递增
        INCF    INDEX,F
        MOVF    INDEX,W

;       查表索引值是否超界
        SUBLW   13
        BTFSC   STATUS,Z
  
;       索引值清零
        CLRF    INDEX  
;       函数返回
        RETURN
;----------------------------------------------------------  
;函数名称:DECODE
;输入参数:无
;输出参数:无
;功能描述:红外接收解码
;----------------------------------------------------------
DECODE:
;       加载缓冲区首址   
        MOVLW   BUFF_0
        MOVWF   FSR
        
;       共4 字节数据
        MOVLW   4
        MOVWF   BYTE
;       每字节8 位
        MOVLW   8
        MOVWF   BIT
RECE:
;       计数值清零
        CLRF   COUNT
RE_LOW:  
;       低电平信号检测
        BTFSC   SIGNA
        GOTO    TEST_BIT
;       延时匹配 周期为 20us
        MOVLW   TIME_DELAY
        MOVWF   DELAY
        DECFSZ  DELAY,F
        GOTO    $-1
;       计数值递增
        INCF    COUNT,F
;       信号限定最大时间 +20%
        MOVLW   ((TIME_DECO * 6 / 5) / 20)
        SUBWF   COUNT,W
;       时间是否溢出
        BTFSS   STATUS,C
        GOTO    RE_LOW
;       时间溢出离开
        RETURN
TEST_BIT:
;       数据位测试
        MOVLW   ((TIME_DECO / 5) / 20)
        SUBWF   COUNT,W
;       脉冲时间过窄 离开      
        BTFSS   STATUS,C
        RETURN
;       数据位识别
        MOVF    COUNT,W
        SUBLW   ((TIME_DECO / 2) / 20)
;       (TIME_DECO / 2 / 20) < COUNT C = 0 数据位 = 0
;       (TIME_DECO / 2 / 20) > COUNT C = 1 数据位 = 1
;       记录一位数位 高位在先 低位在后
        RLF     INDF,F      
RE_HIGH:  
;       高电平信号检测
        BTFSS   SIGNA
        GOTO    CHECK_BIT
;       延时匹配 周期为 20us
        MOVLW   TIME_DELAY
        MOVWF   DELAY
        DECFSZ  DELAY,F
        GOTO    $-1
;       计数值递增
        INCF    COUNT,F
;       信号限定时间最大 +20%
        MOVLW   ((TIME_DECO * 6 / 5) / 20)
        SUBWF   COUNT,W
;       时间是否溢出
        BTFSS   STATUS,C
        GOTO    RE_HIGH
;       时间溢出离开
        RETURN
CHECK_BIT:
;       信号限定最小时间 -20%
        MOVLW   ((TIME_DECO * 8 / 10) / 20)
        SUBWF   COUNT,W
;       时间是否过窄
        BTFSS   STATUS,C
;       信号过窄离开
        RETURN
NEXT_BIT:
;       成功接收一位数据
        DECFSZ  BIT,F
        GOTO    RECE
;       每字节8 位
        MOVLW   8
        MOVWF   BIT
;       指向下个缓冲区
        INCF    FSR,F
;       共接收4 个字节
        DECFSZ  BYTE,F
        GOTO    RECE  
KEY_COM:
;       用户正反码对比
        COMF    BUFF_0,W
        XORWF   BUFF_1,F
;       校验失败 离开
        BTFSS   STATUS,Z
        RETURN
;       数据正反码对比
        COMF    BUFF_2,W
        XORWF   BUFF_3,F
;       校验失败 离开
        BTFSS   STATUS,Z
        RETURN
;       按键1 识别     
        MOVF    BUFF_2,W
        XORLW   KEY_1
        BTFSC   STATUS,Z
        GOTO    KEY_1_F
;       按键2 识别
        MOVF    BUFF_2,W
        XORLW   KEY_2
        BTFSC   STATUS,Z
        GOTO    KEY_2_F
;       按键3 识别
        MOVF   BUFF_2,W
        XORLW   KEY_3
        BTFSC   STATUS,Z
        GOTO    KEY_3_F
;       无效按键 离开
        RETURN
KEY_1_F:
#IFDEF  ANODE
;       共阳 关闭LED
        MOVLW   00000111B
        MOVWF   GPIO
#ELSE
;       共阴 关闭LED
        CLRF    GPIO
#ENDIF              
;       关机模式
        MOVLW   OFF
        GOTO    KEY_FUN
        
KEY_2_F:
;       渐变模式
        MOVLW   MICRO
        GOTO    KEY_FUN
KEY_3_F:
;       渐变模式
        MOVLW   JUMP   
KEY_FUN:
;       禁止中断
        BCF     INTCON,GIE
;       加载工作模式
        MOVWF   FUNC
     
;       变量全部清零
        CLRF    INDEX   
        CLRF    MARK
        CLRF    DUTY
;       加载定时器初值
        MOVLW   TIME_VALUE
        MOVWF   TMR0   
;       清定时器中断标志
        BCF     INTCON,T0IF
;       启动中断
        BSF     INTCON,GIE  
;       函数返回
        RETURN
;----------------------------------------------------------  
;函数名称:MAIN
;输入参数:无
;输出参数:无
;功能描述:主循环程序
;----------------------------------------------------------
MAIN:
;       变量全部清零
        CLRF    INDEX   
        CLRF    MARK
        CLRF    DUTY
;       默认渐变模式
        MOVLW   MICRO
        MOVWF   FUNC
;       加载定时器初值
        MOVLW   TIME_VALUE
        MOVWF   TMR0   
;       启动中断
        BSF     INTCON,GIE      
LOOP:
;       红外接收解码
        CALL    DECODE
;       循环执行程序
        GOTO LOOP
  
;----------------------------------------------------------
        END

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-4-29 07:44 , Processed in 0.055080 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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