每當(dāng)夜幕降臨,在繁華的大都市到處是五顏六色,千變?nèi)f化的燈光,把大都市裝飾得那么美麗,讓人向往.試想一下,在你的家里也有這樣的七彩燈,是那么的讓人陶醉的事..
方案實(shí)現(xiàn):
紅外遙控器,采用電池供電,PIC12F629單片機(jī)控制.用軟件產(chǎn)生38KHZ的紅外載波信號(hào),驅(qū)動(dòng)紅外LED.目的是發(fā)揮PIC單片機(jī)的低功耗性能.七彩燈部份,外置電源適配器供電,單片機(jī)也是采用PIC12F629,接收和處理來自紅外接收頭的信號(hào).用軟件產(chǎn)生3路PWM信號(hào)驅(qū)動(dòng) RGB LED 實(shí)現(xiàn)三基色混色.這工作量對(duì)于PIC12F629來說,很有挑戰(zhàn)性.可體現(xiàn)出PIC的精簡優(yōu)勢(shì).做完項(xiàng)目,會(huì)發(fā)現(xiàn)單片機(jī)沒有做不到,只有想不到.
方案點(diǎn)評(píng):
這是一個(gè)偏向初學(xué)者的方案,讓初學(xué)者掌握一些比較常用和通用的PIC內(nèi)部模塊資源.當(dāng)你學(xué)完這個(gè)方案后,相信你也可以自己設(shè)計(jì)新方案了.








;----------------------------------------------------------
;項(xiàng)目名稱:PIC12F629 PWM
;項(xiàng)目簡介:遙控七彩燈項(xiàng)目,該項(xiàng)目是這為了提高本論壇的人氣而建
;造的.采用PIC12F629作主控,在用中斷產(chǎn)生三路PWM信號(hào),還要進(jìn)行
;紅外信號(hào)解碼.對(duì)于PIC12F629來說很居有挑戰(zhàn)性..
;
;實(shí)現(xiàn)功能:PIC12F629工作于5V@20MHz.用定時(shí)中斷產(chǎn)生三路PWM
;信號(hào)驅(qū)動(dòng)RGBLED,配合三基色原理,實(shí)現(xiàn)多彩漸變,十三色跳變.
;紅外接收頭將解調(diào)后的信號(hào)輸入PIC12F629,用軟件對(duì)信號(hào)進(jìn)行解
;碼處理.識(shí)別出三個(gè)按鍵,分別為關(guān)機(jī)模式,漸變模式,跳變模式.
;
;項(xiàng)目作者:點(diǎn)點(diǎn)滴滴 (PIC單片機(jī)初學(xué)論壇+編程技術(shù)交流)版主
;建造日期:2009年5月5日 至 2009年5月15日
;軟件版本:V 1.0
;編譯平臺(tái):MPASMWIN v5.30.01, mplink v4.30.01 MPLAB V8.30
;----------------------------------------------------------
;定義器件, 默認(rèn)為十進(jìn)制
list P = 12f629, R = DEC
;加載頭文件
#include
;熔絲配置:20M振蕩器,看門狗關(guān),使能上電延時(shí),內(nèi)部復(fù)位,欠壓檢測(cè)開
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_ON
;----------------------------------------------------------
;共陽 LED
#define ANODE
;共陰 LED
;#define CATHODE
;定時(shí)器初值
#define TIME_VALUE 240
;電平時(shí)間常數(shù) 中斷補(bǔ)嘗 實(shí)際數(shù)據(jù)
#define TIME_DECO 1600 ;1950
#define TIME_DELAY 20 ;30
;關(guān)機(jī)模式
#define OFF 00000000B
;漸變模式
#define MICRO 00000011B
;跳變模式
#define JUMP 00000101B
;按鍵數(shù)據(jù)
#define KEY_1 00001100B
#define KEY_2 00001010B
#define KEY_3 00000110B
;換頁操作
#define BANK0 BCF STATUS,RP0
#define BANK1 BSF STATUS,RP0
;紅外信號(hào)輸入
#define SIGNA GPIO,3
;內(nèi)存分配
;PWM 周期計(jì)數(shù)
#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 輸出時(shí)間
#define TIME_1 26H
#define TIME_2 27H
;任務(wù)狀態(tài)標(biāo)志
#define MARK 28H
;跳變 漸變模式
#define FUNC 29H
;中斷現(xiàn)場保護(hù)
#define W_TEMP 2AH
#define S_TEMP 2BH
;共接收32位
#define BYTE 2CH
#define BIT 2DH
;電平時(shí)間計(jì)數(shù)
#define COUNT 2EH
#define DELAY 2FH
;接收緩沖區(qū)
#define BUFF_0 5CH
#define BUFF_1 5DH
#define BUFF_2 5EH
#define BUFF_3 5FH
;----------------------------------------------------------
ORG 0000H
GOTO START
;----------------------------------------------------------
;函數(shù)名稱:TIME_ISR:
;輸入?yún)?shù):無
;輸出參數(shù):無
;功能描述:定時(shí)器中斷服務(wù)
;----------------------------------------------------------
ORG 00004H
TIME_ISR:
; 保護(hù)中斷現(xiàn)場
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF S_TEMP
; 中斷服務(wù) 模式識(shí)別
; 開關(guān)機(jī)識(shí)別
BTFSS FUNC,0
GOTO $+5
; 漸變模式
BTFSC FUNC,1
CALL MODE_MICRO
; 跳變模式
BTFSC FUNC,2
CALL MODE_JUMP
; 清中斷標(biāo)志
BCF INTCON,T0IF
; 加載定時(shí)器初值
MOVLW TIME_VALUE
MOVWF TMR0
; 還原中斷現(xiàn)場
SWAPF S_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
; 中斷返回
RETFIE
;----------------------------------------------------------
;函數(shù)名稱:START
;輸入?yún)?shù):無
;輸出參數(shù):無
;功能描述:上電初始化
;----------------------------------------------------------
START:
BANK0
#IFDEF ANODE
; 共陽 關(guān)閉LED
MOVLW 00000111B
MOVWF GPIO
#ELSE
; 共陰 關(guān)閉LED
CLRF GPIO
#ENDIF
; 關(guān)模擬比較器
MOVLW 00000111B
MOVWF CMCON
; |-------- GIE 禁止所有中斷
; | |------ T0IE 使能定時(shí)中斷
; | | |--- T0IF 定時(shí)標(biāo)志清零
MOVLW 00100000B
MOVWF INTCON
BANK1
; |---- IR_IN 輸入
; ||--- LED_B 輸出
; |||-- LED_G 輸出
; ||||- LED_R 輸出
MOVLW 00001000B
MOVWF TRISIO
; |-------- GPPU 上拉被禁止
; ||------- INTEDG
; |||------ T0CS 內(nèi)部指令周期
; ||||----- T0SE
; |||||---- PSA 分配給WDT
; ||||||--- PS2 分頻比 1:1
; |||||||-- PS1
; ||||||||- PS0
MOVLW 10000000B
MOVWF OPTION_REG
BANK0
GOTO MAIN
;----------------------------------------------------------
;函數(shù)名稱:INDEX_MICRO
;輸入?yún)?shù):查表索引 W
;輸出參數(shù):LED 數(shù)據(jù) W
;功能描述:漸變查表點(diǎn)亮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 ; 青 > 藍(lán)
RETLW 01000100B ; 藍(lán)
RETLW 01010100B ; 藍(lán) > 紫
RETLW 01010101B ; 紫
RETLW 01110101B ; 紫 > 白
RETLW 01110111B ; 白
RETLW 00010111B ; 白 > 紅
;----------------------------------------------------------
;函數(shù)名稱:INDEX_JUMP
;輸入?yún)?shù):查表索引 W
;輸出參數(shù):LED 數(shù)據(jù) W
;功能描述:跳變查表點(diǎn)亮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 ; 藍(lán)
RETLW 00110011B ; 黃
RETLW 01100110B ; 青
RETLW 01010101B ; 紫
RETLW 00010011B ; 淺黃
RETLW 00100110B ; 淺青
RETLW 01000101B ; 淺紫
RETLW 00110001B ; 深黃
RETLW 01100010B ; 深青
RETLW 01010100B ; 深紫
RETLW 01110111B ; 白
;----------------------------------------------------------
;函數(shù)名稱:MODE_MICRO
;輸入?yún)?shù):無
;輸出參數(shù):無
;功能描述:RGB 漸變模式
;----------------------------------------------------------
MODE_MICRO:
; 1號(hào)任務(wù)
BTFSC MARK,0
GOTO PWM_L_MICRO
; 2號(hào)任務(wù)
BTFSC MARK,1
GOTO PWM_H_MICRO
; 3號(hào)任務(wù)
BTFSC MARK,2
GOTO PWM_CYCLE_MICRO
; 4號(hào)任務(wù)
BTFSC MARK,3
GOTO PWM_TIME_MICRO
INIT_MICRO:
; PWM 索引查表
MOVF INDEX,W
ADDLW TAB_MICRO
CALL INDEX_MICRO
; PWM_L 數(shù)據(jù)緩存
MOVWF OUT_L
; PWM_H 數(shù)據(jù)緩存
SWAPF OUT_L,W
MOVWF OUT_H
; LED 共陰 共陽識(shí)別
#IFDEF ANODE
COMF OUT_H,F
COMF OUT_L,F
#ENDIF
; 加載最小占空比 1 / 256
INCF DUTY,F
PWM_TIME_MICRO:
; 下個(gè)任務(wù)
MOVLW 0x04
MOVWF MARK
; PWM 時(shí)間計(jì)數(shù) 7
MOVLW 7
MOVWF TIME_1
PWM_CYCLE_MICRO:
; 下個(gè)任務(wù)
MOVLW 0x02
MOVWF MARK
; PWM_H 周期計(jì)數(shù)
MOVF DUTY,W
MOVWF PWM_H
; PWM_L 周期計(jì)數(shù)
SUBLW 0
MOVWF PWM_L
; PWM 輸出高電平
MOVF OUT_H,W
MOVWF GPIO
PWM_H_MICRO:
DECFSZ PWM_H,F
RETURN
; 下個(gè)任務(wù)
MOVLW 0x01
MOVWF MARK
; PWM 輸出低電平
MOVF OUT_L,W
MOVWF GPIO
PWM_L_MICRO:
DECFSZ PWM_L,F
RETURN
; 下個(gè)任務(wù)
MOVLW 0x04
MOVWF MARK
; PWM 時(shí)間計(jì)數(shù)
DECFSZ TIME_1,F
RETURN
; 下個(gè)任務(wù)
MOVLW 0x08
MOVWF MARK
; PWM 占空比遞增
INCFSZ DUTY,F
RETURN
; 重置任務(wù)
CLRF MARK
; 查表索引值遞增
INCF INDEX,F
MOVF INDEX,W
; 查表索引值是否超界
SUBLW 14
BTFSC STATUS,Z
; 索引值清零
CLRF INDEX
; 函數(shù)返回
RETURN
;----------------------------------------------------------
;函數(shù)名稱:MODE_JUMP
;輸入?yún)?shù):無
;輸出參數(shù):無
;功能描述:RGB跳變模式
;----------------------------------------------------------
MODE_JUMP:
; 1號(hào)任務(wù)
BTFSC MARK,0
GOTO PWM_L_JUMP
; 2號(hào)任務(wù)
BTFSC MARK,1
GOTO PWM_H_JUMP
; 3號(hào)任務(wù)
BTFSC MARK,2
GOTO PWM_CYCLE_JUMP
INIT_JUMP:
; PWM 索引查表
MOVF INDEX,W
ADDLW TAB_JUMP
CALL INDEX_JUMP
; PWM_L 數(shù)據(jù)緩存
MOVWF OUT_L
; PWM_H 數(shù)據(jù)緩存
SWAPF OUT_L,W
MOVWF OUT_H
; LED 共陰 共陽識(shí)別
#IFDEF ANODE
COMF OUT_H,F
COMF OUT_L,F
#ENDIF
; 加載固定占空比 76 / 256
MOVLW 76
MOVWF DUTY
PWM_TIME_JUMP:
; 下個(gè)任務(wù)
MOVLW 0x04
MOVWF MARK
; PWM 時(shí)間計(jì)數(shù) 7 * 256
MOVLW 7
MOVWF TIME_1
CLRF TIME_2
PWM_CYCLE_JUMP:
; 下個(gè)任務(wù)
MOVLW 0x02
MOVWF MARK
; PWM_H 周期計(jì)數(shù)
MOVF DUTY,W
MOVWF PWM_H
; PWM_L 周期計(jì)數(shù)
SUBLW 0
MOVWF PWM_L
; PWM 輸出高電平
MOVF OUT_H,W
MOVWF GPIO
PWM_H_JUMP:
DECFSZ PWM_H,F
RETURN
; 下個(gè)任務(wù)
MOVLW 0x01
MOVWF MARK
; PWM 輸出低電平
MOVF OUT_L,W
MOVWF GPIO
PWM_L_JUMP:
DECFSZ PWM_L,F
RETURN
; 下個(gè)任務(wù)
MOVLW 0x04
MOVWF MARK
; PWM 時(shí)間計(jì)數(shù) 7 * 256
DECFSZ TIME_2,F
GOTO PWM_CYCLE_JUMP
DECFSZ TIME_1,F
GOTO PWM_CYCLE_JUMP
; 重置任務(wù)
CLRF MARK
; 查表索引值遞增
INCF INDEX,F
MOVF INDEX,W
; 查表索引值是否超界
SUBLW 13
BTFSC STATUS,Z
; 索引值清零
CLRF INDEX
; 函數(shù)返回
RETURN
;----------------------------------------------------------
;函數(shù)名稱:DECODE
;輸入?yún)?shù):無
;輸出參數(shù):無
;功能描述:紅外接收解碼
;----------------------------------------------------------
DECODE:
; 加載緩沖區(qū)首址
MOVLW BUFF_0
MOVWF FSR
; 共4 字節(jié)數(shù)據(jù)
MOVLW 4
MOVWF BYTE
; 每字節(jié)8 位
MOVLW 8
MOVWF BIT
RECE:
; 計(jì)數(shù)值清零
CLRF COUNT
RE_LOW:
; 低電平信號(hào)檢測(cè)
BTFSC SIGNA
GOTO TEST_BIT
; 延時(shí)匹配 周期為 20us
MOVLW TIME_DELAY
MOVWF DELAY
DECFSZ DELAY,F
GOTO $-1
; 計(jì)數(shù)值遞增
INCF COUNT,F
; 信號(hào)限定最大時(shí)間 +20%
MOVLW ((TIME_DECO * 6 / 5) / 20)
SUBWF COUNT,W
; 時(shí)間是否溢出
BTFSS STATUS,C
GOTO RE_LOW
; 時(shí)間溢出離開
RETURN
TEST_BIT:
; 數(shù)據(jù)位測(cè)試
MOVLW ((TIME_DECO / 5) / 20)
SUBWF COUNT,W
; 脈沖時(shí)間過窄 離開
BTFSS STATUS,C
RETURN
; 數(shù)據(jù)位識(shí)別
MOVF COUNT,W
SUBLW ((TIME_DECO / 2) / 20)
; (TIME_DECO / 2 / 20) < COUNT C = 0 數(shù)據(jù)位 = 0
; (TIME_DECO / 2 / 20) > COUNT C = 1 數(shù)據(jù)位 = 1
; 記錄一位數(shù)位 高位在先 低位在后
RLF INDF,F
RE_HIGH:
; 高電平信號(hào)檢測(cè)
BTFSS SIGNA
GOTO CHECK_BIT
; 延時(shí)匹配 周期為 20us
MOVLW TIME_DELAY
MOVWF DELAY
DECFSZ DELAY,F
GOTO $-1
; 計(jì)數(shù)值遞增
INCF COUNT,F
; 信號(hào)限定時(shí)間最大 +20%
MOVLW ((TIME_DECO * 6 / 5) / 20)
SUBWF COUNT,W
; 時(shí)間是否溢出
BTFSS STATUS,C
GOTO RE_HIGH
; 時(shí)間溢出離開
RETURN
CHECK_BIT:
; 信號(hào)限定最小時(shí)間 -20%
MOVLW ((TIME_DECO * 8 / 10) / 20)
SUBWF COUNT,W
; 時(shí)間是否過窄
BTFSS STATUS,C
; 信號(hào)過窄離開
RETURN
NEXT_BIT:
; 成功接收一位數(shù)據(jù)
DECFSZ BIT,F
GOTO RECE
; 每字節(jié)8 位
MOVLW 8
MOVWF BIT
; 指向下個(gè)緩沖區(qū)
INCF FSR,F
; 共接收4 個(gè)字節(jié)
DECFSZ BYTE,F
GOTO RECE
KEY_COM:
; 用戶正反碼對(duì)比
COMF BUFF_0,W
XORWF BUFF_1,F
; 校驗(yàn)失敗 離開
BTFSS STATUS,Z
RETURN
; 數(shù)據(jù)正反碼對(duì)比
COMF BUFF_2,W
XORWF BUFF_3,F
; 校驗(yàn)失敗 離開
BTFSS STATUS,Z
RETURN
; 按鍵1 識(shí)別
MOVF BUFF_2,W
XORLW KEY_1
BTFSC STATUS,Z
GOTO KEY_1_F
; 按鍵2 識(shí)別
MOVF BUFF_2,W
XORLW KEY_2
BTFSC STATUS,Z
GOTO KEY_2_F
; 按鍵3 識(shí)別
MOVF BUFF_2,W
XORLW KEY_3
BTFSC STATUS,Z
GOTO KEY_3_F
; 無效按鍵 離開
RETURN
KEY_1_F:
#IFDEF ANODE
; 共陽 關(guān)閉LED
MOVLW 00000111B
MOVWF GPIO
#ELSE
; 共陰 關(guān)閉LED
CLRF GPIO
#ENDIF
; 關(guān)機(jī)模式
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
; 加載定時(shí)器初值
MOVLW TIME_VALUE
MOVWF TMR0
; 清定時(shí)器中斷標(biāo)志
BCF INTCON,T0IF
; 啟動(dòng)中斷
BSF INTCON,GIE
; 函數(shù)返回
RETURN
;----------------------------------------------------------
;函數(shù)名稱:MAIN
;輸入?yún)?shù):無
;輸出參數(shù):無
;功能描述:主循環(huán)程序
;----------------------------------------------------------
MAIN:
; 變量全部清零
CLRF INDEX
CLRF MARK
CLRF DUTY
; 默認(rèn)漸變模式
MOVLW MICRO
MOVWF FUNC
; 加載定時(shí)器初值
MOVLW TIME_VALUE
MOVWF TMR0
; 啟動(dòng)中斷
BSF INTCON,GIE
LOOP:
; 紅外接收解碼
CALL DECODE
; 循環(huán)執(zhí)行程序
GOTO LOOP
;----------------------------------------------------------
END
更多詳情請(qǐng)?jiān)L問www.pic16.com 遙控七彩燈開源項(xiàng)目
紅外遙控器專貼
http://pic16.com/bbs/dispbbs.asp?boardID=8&ID=44165&page=1
七彩燈近控制
http://pic16.com/bbs/dispbbs.asp?boardID=8&ID=44506&page=1