紅外搖控HS5104解碼程序.doc_第1頁
紅外搖控HS5104解碼程序.doc_第2頁
紅外搖控HS5104解碼程序.doc_第3頁
紅外搖控HS5104解碼程序.doc_第4頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

紅外搖控HS5104解碼程序現(xiàn)在市面上,風(fēng)扇搖控器都用HS5104作編碼芯片,關(guān)鍵是以低格占據(jù)市場。用過HS5104的朋友都知道,它的工作電壓比較高,在低電壓3V以下工作時,經(jīng)常會出錯,很多朋友都說HS5104的接收程序不穩(wěn)定。其實,大多數(shù)是HS5104工作不穩(wěn)定引起的,只要你接收程序合理,多接收幾次作比較,碼寬的變動變化率允許大一點(我的程序允許碼寬變動在百分之三十),然后再保證HS5104的工作電壓在3V以上,那肯定是沒問題的。下面一段程序,之所以接收程序會那么復(fù)雜,是針對HS5104不穩(wěn)定而設(shè)計的。它放在中斷里進(jìn)行,希望能給使用合泰C開發(fā)的朋友提供參考,或者下載后稍作修改便可實現(xiàn)功能調(diào)試。/*紅外搖控 ht48r05A-1 & HS5104/*Make in QUSUN at 2008-01-18/*LCSOME*#include #pragma vector isr_4 0x4#pragma vector isr_8 0x8#define uchar unsigned char#define ulint unsigned long int#pragma rambank0unsigned char rf_addr1;unsigned char rf_addr2;/12位地址碼unsigned char rf_addr1_old;/unsigned char rf_addr2_old;unsigned char rf_cont;/接收次數(shù),判斷長按unsigned char rf_bitsum;/接收到的數(shù)據(jù)位的計數(shù)器unsigned char rf_0_sum;/接收到0的個數(shù)計數(shù)器unsigned char rf_mksum;/碼寬計數(shù)器uchar time_s;/秒計數(shù)器uchar time_ms;/毫秒計數(shù)器uchar time_us;/微秒計數(shù)器/*bit rf_sta;/起始位有效標(biāo)志有效bit rf_bdata;/前一個接收檢測電平bit rf_ture;/接收成功標(biāo)志有效bit rf_6ms ;/6毫秒低電平指示,1有效#define rf_in _pc1 /接收數(shù)據(jù)輸入端#define rf_1_sum rf_0_sum#define SPEAKER _pb2/*void isr_4() /外部中斷子程序 . /外部中斷子程序 /*void isr_8()/計數(shù)器0中斷子程序 if(!rf_sta)/如果起始位無效 /00 rf_1_sum+; if(rf_1_sum100)rf_cont=0;/如果釋放按鍵則清計數(shù)器 if(!rf_6ms)/1 如果未滿足6毫秒電平 if(!rf_in)rf_1_sum=0;/如果接收到的是低電平,則清計數(shù) if(rf_1_sum40)/2 rf_6ms=1;/置6毫秒高電平有效 /2 /1 else /如果已滿足6毫秒電平,則等待起始位 /003 if(!rf_in)/一收到有低電平,則判為有開始 rf_addr1=0; rf_6ms=0; rf_bdata=0; rf_bitsum=11;/初始化接收到的數(shù)據(jù)位,先接收11位,第12位獨立接收 rf_0_sum=0;/ rf_mksum=0;/碼寬計數(shù)器 rf_sta=1 ;/置起始位有效 /003 /00 else/起始位有效 /200 rf_mksum+;/碼長計數(shù)器加 if(rf_bitsum=0) /如果已經(jīng)接收完11位,則處理接收第12位數(shù)據(jù) if(rf_in)/等待高電平 if(rf_mksum=5)_c=0;else _c=1;/判斷最后一位數(shù)據(jù) _rlc(&rf_addr1);_rlc(&rf_addr2);/移位存入數(shù)據(jù),已經(jīng)接收完12位數(shù)據(jù) _rlc(&rf_addr1);_rlc(&rf_addr2);/修正ADDR2存5位數(shù)據(jù) addr1存7位按鍵碼 /addr1按鍵碼存在高7位,第0位無意義 rf_sta=0;/ 置起始位無效,重新接收下一貞 if(rf_addr2=0x1b)&(rf_addr1_old=rf_addr1) rf_cont+; if(rf_cont=3)rf_ture=1; /如果與上一次接收相同 else rf_addr1_old=rf_addr1; rf_cont=0; /與上一次接收不相同,重新接收 rf_addr1=0;/清洗 goto timeret;/第12位數(shù)據(jù),不處理低電平計數(shù) /如果已經(jīng)接收完11位,則處理接收第12位數(shù)據(jù) if(!rf_in) /3 如果接收的是低電平則處理如下 if(!rf_bdata)goto timeret;/如果上次接收的是低電平,則退出 rf_bdata=0; if(rf_mksum13) rf_sta=0;goto timeret; /如果碼太長,說明協(xié)議不同,放棄處理 rf_mksum=0;/碼寬計數(shù)器重新開始計數(shù) if(rf_1_sum=5)_c=1;else _c=0; _rlc(&rf_addr1);_rlc(&rf_addr2); rf_1_sum=0 ; rf_bitsum-; /3處理接收 else /如果接收的是高電平則如此處理 rf_bdata=1; rf_1_sum+;/計算高電平的寬度 /200 timeret: time_us+; /中斷子程序/*void safeguard_init() /初始化 _tmr = 0x64;/150毫秒中斷一次 _tmrc = 0x91;/內(nèi)部定時,打開計數(shù) 分頻比為1:4 . . . _intc=0x7;/允許定時0中斷,允許外部中斷,允許總中斷 _wdts=0x0f;/WDT預(yù)分頻1:128 /初始化/*void spbb(void)/蜂鳴器叫一聲 . . . /*/*void main() uchar i,y; safeguard_init();/初始化 spbb();/上電時,蜂鳴器叫一聲 /*while(1) /01主體 _clrwdt(); if(rf_ture)/接收有效 /123 switc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論