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








;----------------------------------------------------------
;項目名稱: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