• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

PIC12F629 ---------- 红外遥控七彩灯

方案简介:
    每当夜幕降临,在繁华的大都市到处是五颜六色,千变万化的灯光,把大都市装饰得那么美丽,让人向往.试想一下,在你的家里也有这样的七彩灯,是那么的让人陶醉的事..

方案实现:
    红外遥控器,采用电池供电,PIC12F629单片机控制.用软件产生38KHZ的红外载波信号,驱动红外LED.目的是发挥PIC单片机的低功耗性能.七彩灯部份,外置电源适配器供电,单片机也是采用PIC12F629,接收和处理来自红外接收头的信号.用软件产生3路PWM信号驱动 RGB LED 实现三基色混色.这工作量对于PIC12F629来说,很有挑战性.可体现出PIC的精简优势.做完项目,会发现单片机没有做不到,只有想不到.

方案点评:
    这是一个偏向初学者的方案,让初学者掌握一些比较常用和通用的PIC内部模块资源.当你学完这个方案后,相信你也可以自己设计新方案了.


500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/77/1073571242438767.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20');}" onmousewheel="return imgzoom(this);">
500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/77/1073571242438923.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20');}" onmousewheel="return imgzoom(this);">
500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/77/1073571242438930.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20');}" onmousewheel="return imgzoom(this);">
500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/77/1073571242438957.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20');}" onmousewheel="return imgzoom(this);">
500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/77/1073571242438991.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20');}" onmousewheel="return imgzoom(this);">
500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/77/1073571242439006.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20');}" onmousewheel="return imgzoom(this);">
500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/77/1073571242439015.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20');}" onmousewheel="return imgzoom(this);">
500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/77/1073571242439023.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20');}" onmousewheel="return imgzoom(this);">

;----------------------------------------------------------
;项目名称:PIC12F629 PWM
;项目简介:遥控七彩灯项目,该项目是这为了提高本论坛的人气而建
;造的.采用PIC12F629作主控,在用中断产生三路PWM信号,还要进行
;红外信号解码.对于PIC12F629来说很居有挑战性..
;
;实现功能:PIC12F629工作于5V@20MHz.用定时中断产生三路PWM
;信号驱动RGBLED,配合三基色原理,实现多彩渐变,十三色跳变.
;红外接收头将解调后的信号输入PIC12F629,用软件对信号进行解
;码处理.识别出三个按键,分别为关机模式,渐变模式,跳变模式.
;
;项目作者:点点滴滴 (PIC单片机初学论坛+编程技术交流)版主
;建造日期:2009年5月5日 至 2009年5月15日
;软件版本:V 1.0
;编译平台:MPASMWIN v5.30.01, mplink v4.30.01 MPLAB V8.30
;----------------------------------------------------------

;定义器件, 默认为十进制
        list P = 12f629, R = DEC

;加载头文件            
  #include         

;熔丝配置: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

;内存分配

;PWM 周期计数
#define     PWM_H   20H
#define     PWM_L   21H

;PWM 电平缓冲
#define     OUT_H   22H
#define     OUT_L   23H

;PMW 占空比
#define     DUTY    24H

;查表索引值
#define     INDEX   25H

;PWM 输出时间
#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



更多详情请访问www.pic16.com 遥控七彩灯开源项目

红外遥控器专贴
http://pic16.com/bbs/dispbbs.asp?boardID=8&ID=44165&page=1

七彩灯近控制
http://pic16.com/bbs/dispbbs.asp?boardID=8&ID=44506&page=1
全部回复(8)
正序查看
倒序查看
nsl168
LV.6
2
2009-05-16 10:21
能提供DEMO板吗?我想用这种方案做LED射灯
0
回复
2009-05-21 11:11
我顶!!!
0
回复
2009-06-02 18:37
@点点滴滴
我顶!!!
我再顶!!!
0
回复
xiongls
LV.3
5
2009-06-03 17:30
@点点滴滴
我再顶!!!
这么简单个东西有啥好顶的?
0
回复
2009-06-05 16:36
@xiongls
这么简单个东西有啥好顶的?
那楼上的你一定是高手咯..有空请多多指教!!!
0
回复
lzl0807
LV.3
7
2009-11-30 12:35
@点点滴滴
那楼上的你一定是高手咯..有空请多多指教!!!
可不可以将不加遥控的源程序发一份我参考学习一下,先谢谢了.我的邮箱是:LZL@LGDD.COM.CN
0
回复
larry98012
LV.10
8
2011-10-26 08:48
发DEMO板资料过来!!larry98012@163.com
0
回复
林霖
LV.1
9
2013-10-12 19:31

能不能帮我改下程序啊。我做的也是遥控调光灯。谢谢,我的邮箱是2019770987@qq.com

 

#include
#define uchar unsigned char
#define uint  unsigned int
__CONFIG(0x3B31);
unsigned char  irtime;
bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];
void delayms(uint);
void Ir_work(void);
void Ircordpro(void);
void delay_876us(void)  //876us
{
 #asm
 N EQU 70H
 M EQU 71H
 MOVLW  0X37
 MOVWF  N
 NOP
 NOP
 NOP
 NOP
 NOP
 DECFSZ  N
 GOTO $-6
 RETURN
 #endasm
}
void delay_1ms(void)
{
 #asm
 MOVLW  0X3F
 MOVWF  N
 NOP
 NOP
 NOP
 NOP
 NOP
 DECFSZ  N
 GOTO $-6
 RETURN
 #endasm
}
void delay_4730us(void)   
{
 #asm
 MOVLW  0X0B
 MOVWF  M
 MOVLW  0X4D
 MOVWF N
 DECFSZ   N
 GOTO $-1
 DECFSZ   M
 GOTO $-5
 RETURN
 #endasm
}
void ande()//最暗的

while(1)
  {
  TRISB=0xff;
 TRISD=0xff;
 TRISC=0xff;
 TRISE0=0xff;
 PORTC=0xff;
    PORTD=0xff;
   TRISA=0xff;
    GIE=1;//总中断
   PEIE=1;//
   INTE=1;//外部中断使能
   INTF=0;//外部中断标志位
   INTEDG=0;
 INTCON=0xc0;
 PIE1=1;
 T1CON=0x21;

    if(irok)                       
    {  
      Ircordpro();
     irok=0;
  break;
    }
  }

}
void INIT()//中等亮度
{  
while(1)
  {
 PORTD=0x00;   
 delayms(100);
 PORTD=0xff;   
 delayms(300);//这个值越小越亮
    if(irok)                       
    {  
      Ircordpro();
     irok=0;
  break;
    }
  }
}
  void kuai()//最高

while(1)
  {
   PORTD=0x00;   
    if(irok)                       
    {  
      Ircordpro();
     irok=0;
  break;
    }
  }
}
void interrupt com()
 {
 irtime++;
}
void Config_Timer0()
 {
 static unsigned char  i;            
 static bit startflag;              
if(startflag)                        
   {delay_876us();
    if(irtime<63&&irtime>=33)
       delay_876us();
         i=0;
      irdata[i]=irtime;
      irtime=0;
      i++;
      if(i==33)
        { delay_4730us();
       irok=1;
       i=0;
          }
    }
     else
   { delay_876us();
  irtime=0;
  startflag=1;
  }

}


void TIM0init(void)
{

TRISB=0xff;
 TRISD=0;
 TRISC=0;
 TRISE0=0;
 PORTC=0;
    PORTD=0;
   TRISA=0xff;
    GIE=1;//总中断
   PEIE=1;//
   INTE=1;//外部中断使能
   INTF=0;//外部中断标志位
   INTEDG=0;
}

void EX0init(void)
{
 INTCON=0xc0;
 PIE1=0x01;
 TMR1L=0x00;
 TMR1H=0x00;
 T1CON=0x21;
}


void Ir_work(void)
{
       switch(IRcord[2])
         {
           case 0x45:ande();break;
           case 0x46:INIT();break;
     case 0x47:kuai();break;
           default:break;
         }

        irpro_ok=0;
}

void Ircordpro(void)
{
  unsigned char i, j, k;
  unsigned char cord,value;
  k=1;
  for(i=0;i<4;i++)     
     {
      for(j=1;j<=8;j++)
         {delay_876us();
          cord=irdata[k];
          if(cord>7)
             value|=0x80;
          if(j<8)
       {
           delay_876us();
       value>>=1;
       }
           k++;
         }
     IRcord[i]=value;
     value=0;    
     }
  irpro_ok=1;
}


void main(void)
{

  EX0init();
  TIM0init();
  PORTD=0xff; //初始状态调整 ff全灭
  delayms(1);

 while(1)
   { delay_876us();    
    if(irok)                       
  {   delay_876us();
   Ircordpro();
     irok=0;
  }

    if(irpro_ok)                  
  {delay_876us();
   Ir_work();
     }
   }
}

void delayms(uint x) 
{
while(--x);
}

 

 

0
回复