性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

PIC12F629 ---------- 紅外遙控七彩燈

方案簡介:
    每當(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
全部回復(fù)(8)
正序查看
倒序查看
nsl168
LV.6
2
2009-05-16 10:21
能提供DEMO板嗎?我想用這種方案做LED射燈
0
回復(fù)
2009-05-21 11:11
我頂!!!
0
回復(fù)
2009-06-02 18:37
@點(diǎn)點(diǎn)滴滴
我頂!!!
我再頂!!!
0
回復(fù)
xiongls
LV.3
5
2009-06-03 17:30
@點(diǎn)點(diǎn)滴滴
我再頂!!!
這么簡單個(gè)東西有啥好頂?shù)?
0
回復(fù)
2009-06-05 16:36
@xiongls
這么簡單個(gè)東西有啥好頂?shù)?
那樓上的你一定是高手咯..有空請(qǐng)多多指教!!!
0
回復(fù)
lzl0807
LV.3
7
2009-11-30 12:35
@點(diǎn)點(diǎn)滴滴
那樓上的你一定是高手咯..有空請(qǐng)多多指教!!!
可不可以將不加遙控的源程序發(fā)一份我參考學(xué)習(xí)一下,先謝謝了.我的郵箱是:LZL@LGDD.COM.CN
0
回復(fù)
larry98012
LV.10
8
2011-10-26 08:48
發(fā)DEMO板資料過來?。?a href="mailto:larry98012@163.com">larry98012@163.com
0
回復(fù)
林霖
LV.1
9
2013-10-12 19:31

能不能幫我改下程序啊。我做的也是遙控調(diào)光燈。謝謝,我的郵箱是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;//外部中斷標(biāo)志位
   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);//這個(gè)值越小越亮
    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;//外部中斷標(biāo)志位
   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; //初始狀態(tài)調(diào)整 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
回復(fù)
發(fā)