每当夜幕降临,在繁华的大都市到处是五颜六色,千变万化的灯光,把大都市装饰得那么美丽,让人向往.试想一下,在你的家里也有这样的七彩灯,是那么的让人陶醉的事..
方案实现:
红外遥控器,采用电池供电,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