




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
一文教會(huì)你紅外線遙控器軟件解碼程序紅外線一開(kāi)始發(fā)送一段13.5ms的引導(dǎo)碼,引導(dǎo)碼由9ms的高電平和4.5ms的低電平組成,跟著引導(dǎo)碼是系統(tǒng)碼,系統(tǒng)反碼,按鍵碼,按鍵反碼,如果按著鍵不放,則遙控器則發(fā)送一段重復(fù)碼,重復(fù)碼由9ms的高電平,2.25ms的低電平,跟著是一個(gè)短脈沖。#include“at89x52.h”#defineNULL0x00//數(shù)據(jù)無(wú)效#defineRESET0X01//程序復(fù)位#defineREQUEST0X02//請(qǐng)求信號(hào)#defineACK0x03//應(yīng)答信號(hào),在接收數(shù)據(jù)后發(fā)送ACK信號(hào)表示數(shù)據(jù)接收正確,也位請(qǐng)求信號(hào)的應(yīng)答信號(hào)#defineNACK0x04//應(yīng)答信號(hào),表示接收數(shù)據(jù)錯(cuò)誤#defineBUSY0x05//忙信號(hào),表示正在忙#defineFREE0x06//空閑信號(hào),表示處于空閑狀態(tài)#defineREAD_IR0x0b//讀取紅外#defineSTORE_IR0x0c//保存數(shù)據(jù)#defineREAD_KEY0x0d//讀取鍵值#defineRECEIVE0Xf400//接收緩沖開(kāi)始地址#defineSEND0xfa00//發(fā)送緩沖開(kāi)始地址#defineIR0x50//紅外接收緩沖開(kāi)始地址#defineHEAD0xaa//數(shù)據(jù)幀頭#defineTAIL0x55//數(shù)據(jù)幀尾#defineSDAP1_7#defineSCLP1_6unsignedcharxdata*buf1;//接受數(shù)據(jù)緩沖unsignedintbuf1_length;//接收到的數(shù)據(jù)實(shí)際長(zhǎng)度unsignedcharxdata*buf2;//發(fā)送數(shù)據(jù)緩沖unsignedintbuf2_length;//要發(fā)送的數(shù)據(jù)實(shí)際長(zhǎng)度bitbuf1_flag;//接收標(biāo)志,1表示接受到一個(gè)數(shù)據(jù)幀,0表示沒(méi)有接受到數(shù)據(jù)幀或數(shù)據(jù)幀為空bitbuf2_flag;//發(fā)送標(biāo)志,1表示需要發(fā)送或沒(méi)發(fā)送完畢,0表示沒(méi)有要發(fā)送的數(shù)據(jù)或發(fā)送完畢unsignedcharstate1,state2;//用來(lái)標(biāo)志接收字符的狀態(tài),state1用來(lái)表示接收狀態(tài),state2用來(lái)表示發(fā)送狀態(tài)unsignedchardata*ir;union{unsignedchara[2];unsignedintb;unsignedchardata*p1[2];unsignedintdata*p2[2];unsignedcharxdata*p3;//紅外緩沖的指針unsignedintxdata*p4;}p;//union{////unsignedchara[2];////unsignedintb;//unsignedchardata*p1[2];//unsignedintdata*p2[2];//unsignedcharxdata*p3;//unsignedintxdata*p4;//地址指針//}q;//union{unsignedchara[2];unsignedintb;}count;union{unsignedchara[2];unsignedintb;}temp;union{unsignedchara[4];unsignedintb[2];unsignedlongc;}ir_code;union{unsignedchara[4];unsignedintb[2];unsignedlongc;unsignedchardata*p1[4];unsignedintdata*p2[4];unsignedcharxdata*p3[2];unsignedintxdata*p4[2];}I;unsignedcharir_key;bitir_flag;//紅外接收標(biāo)志,0為緩沖區(qū)空,1為接收成功,2為緩沖溢出voidsub(void);voiddelay(void);voidie_0(void);voidtf_0(void);voidie_1(void);voidtf_1(void);voidtf_2(void);voidread_ir(void);voidir_jiema(void);voidir_init(void);voidir_exit(void);voidstore_ir(void);voidread_key(void);voidreset_iIC(void);unsignedcharread_byte_ack_iic(void);unsignedcharread_byte_nack_iic(void);bitwrite_byte_iic(unsignedchara);voidsend_ack_iic(void);voidsend_nack_iic(void);bitreceive_ack_iic(void);voidstart_iic(void);voidstop_iic(void);voidwrite_key_data(unsignedchara);unsignedintread_key_data(unsignedchara);voidie0(void)interrupt0{ie_0();}voidtf0(void)interrupt1{tf_0();}voidie1(void)interrupt2{ie_1();}voidtf1(void)interrupt3{tf_1();tf_2();}voidtf2(void)interrupt5{//采用中斷方式跟查詢(xún)方式相結(jié)合的辦法解碼EA=0;//禁止中斷if(TF2){//判斷是否是溢出還是電平變化產(chǎn)生的中斷TF2=0;//如果是溢出產(chǎn)生的中斷則清除溢出位,重新開(kāi)放中斷退出EA=1;gotoend;}EXF2=0;//清除電平變化產(chǎn)生的中斷位*ir=RCAP2H;//把捕捉的數(shù)保存起來(lái)ir++;*ir=RCAP2L;*ir++;F0=1;TR0=1;//開(kāi)啟計(jì)數(shù)器0loop:TL0=0;//將計(jì)數(shù)器0重新置為零TH0=0;while(!EXF2){//查詢(xún)等待EXF2變?yōu)?if(TF0)gotoexit;//檢查有沒(méi)超時(shí),如果超時(shí)則退出};EXF2=0;//將EXF2清零if(!TH0)//判斷是否是長(zhǎng)低電平脈沖過(guò)來(lái)了{(lán)//不是長(zhǎng)低電平脈沖而是短低電平if(F0)count.b++;//短脈沖數(shù)加一temp.a[0]=RCAP2H;//將捕捉數(shù)臨時(shí)存放起來(lái)temp.a[1]=RCAP2L;gotoloop;//返回繼續(xù)查詢(xún)}else{//是低電平脈沖,則進(jìn)行處理F0=0;*ir=temp.a[0];//把連續(xù)的短脈沖總時(shí)間記錄下來(lái)ir++;*ir=temp.a[1];ir++;*ir=RCAP2H;//把長(zhǎng)電平脈沖時(shí)間記錄下來(lái)ir++;*ir=RCAP2L;ir++;if(ir》=0xda){gotoexit;//判斷是否溢出緩沖,如果溢出則失敗退出}gotoloop;//返回繼續(xù)查詢(xún)}exit:ir_flag=1;//置ir_flag為1表示接收成功end:;}voidrs232(void)interrupt4{staticunsignedcharsbuf1,sbuf2,rsbuf1,rsbuf2;//sbuf1,sbuf2用來(lái)接收發(fā)送臨時(shí)用,rsbuf1,rsbuf2用來(lái)分別用來(lái)存放接收發(fā)送的半字節(jié)EA=0;//禁止中斷if(RI){RI=0;//清除接收中斷標(biāo)志位sbuf1=SBUF;//將接收緩沖的字符復(fù)制到sbuf1if(sbuf1==HEAD){//判斷是否幀開(kāi)頭state1=10;//是則把state賦值為10buf1=RECEIVE;//初始化接收地址}else{switch(state1){case10:sbuf2=sbuf1》》4;//把高半字節(jié)右移到的半字節(jié)sbuf2=~sbuf2;//把低半字節(jié)取反if((sbuf2&0x0f)!=(sbuf1&0x0f))//判斷接收是否正確{//接收錯(cuò)誤,有可能接收的是數(shù)據(jù)幀尾,也有可能是接收錯(cuò)誤if(sbuf1==TAIL)//判斷是否接收到數(shù)據(jù)幀尾{//是接收到數(shù)據(jù)幀尾buf1=RECEIVE;//初始化接收的地址if(*buf1==RESET)//判斷是否為復(fù)位命令{ES=0;sbuf2=SP+1;for(p.p1[0]=SP-0x10;p.p1[0]《=sbuf2;p.p1[0]++)*p.p1[0]=0;}state1=0;//將接收狀態(tài)標(biāo)志置為零,接收下一個(gè)數(shù)據(jù)幀buf1_flag=1;//置接收標(biāo)志為1,表示已經(jīng)接收到一個(gè)數(shù)據(jù)幀REN=0;//禁止接收}else{//不是接受到數(shù)據(jù)幀尾,表明接收錯(cuò)誤state1=0;//將接收狀態(tài)標(biāo)志置為零,重新接收buf1=RECEIVE;//初始化發(fā)送的地址*buf1=NACK;//把NACK信號(hào)存入接收緩沖里buf1_flag=1;//置標(biāo)志位為1,使主程序能對(duì)接收錯(cuò)誤進(jìn)行處理REN=0;//禁止接收}}else{//接收正確rsbuf1=~sbuf1;//按位取反,使高半字節(jié)變?cè)arsbuf1&=0xf0;//僅保留高半字節(jié),低半字節(jié)去掉state1=20;//將狀態(tài)標(biāo)志置為20,準(zhǔn)備接收低半字節(jié)}break;case20:sbuf2=sbuf1》》4;//把高半字節(jié)右移到的半字節(jié)sbuf2=~sbuf2;//將低半字節(jié)取反if((sbuf2&0x0f)!=(sbuf1&0x0f))//判斷接收是否正確{//接受錯(cuò)誤state1=0;//將接收狀態(tài)標(biāo)志置為零,重新接收buf1=RECEIVE;//初始化接收的地址*buf1=NACK;//把NACK信號(hào)存入發(fā)送緩沖里buf1_flag=1;//置標(biāo)志位為1,使主程序能對(duì)接收錯(cuò)誤進(jìn)行處理REN=0;//禁止接收}else{sbuf1&=0x0f;//僅保留低半字節(jié),去掉高半字節(jié)rsbuf1“=sbuf1;//高低半字節(jié)合并*buf1++=rsbuf1;//將接收的數(shù)據(jù)保存至接收緩沖里,并且數(shù)據(jù)指針加一buf1_length++;//接收數(shù)據(jù)長(zhǎng)度加一state1=10;//將state1置為10,準(zhǔn)備接收下個(gè)字節(jié)的高半字節(jié)}break;}}}else{TI=0;//清除發(fā)送中斷標(biāo)志if(buf2_length)//判斷發(fā)送長(zhǎng)度是否為零{//發(fā)送長(zhǎng)度不為零if(state2==0)//判斷是否發(fā)送高半字節(jié){//發(fā)送高半字節(jié)sbuf2=*buf2;//將要發(fā)送的字節(jié)送到sbuf2rsbuf2=~sbuf2;//取反,使高半字節(jié)變?yōu)榉创asbuf2》》=4;//將高半字節(jié)右移到低半字節(jié)rsbuf2&=0xf0;//保留高半字節(jié),去掉低半字節(jié)sbuf2&=0x0f;//保留低半字節(jié),去掉高半字節(jié)rsbuf2|=sbuf2;//合并高低半字節(jié)SBUF=rsbuf2;//發(fā)送出去state2=10;//將state2置為10準(zhǔn)備發(fā)送下半字節(jié)}else{//發(fā)送低半字節(jié)sbuf2=*buf2;//將要發(fā)送的字節(jié)送到sbuf2buf2++;//指針加一buf2_length--;//發(fā)送數(shù)據(jù)長(zhǎng)度減一rsbuf2=~sbuf2;//取反,使低半字節(jié)變?yōu)榉创arsbuf2《《=4;//將
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廠區(qū)道路橫平豎直施工方案
- 湖南舊鋼煙囪防腐施工方案
- 帶視頻的數(shù)學(xué)試卷
- 電纜線下作業(yè)施工方案
- 杭州日式屋頂花園施工方案
- 數(shù)控加工工藝與編程技術(shù)基礎(chǔ) 教案 模塊二 項(xiàng)目三 自動(dòng)編程(3-4)
- 智能制造與傳統(tǒng)制造的區(qū)別
- 石油化工靜電接地的接地網(wǎng)設(shè)計(jì)
- 健全公共衛(wèi)生體系的策略及實(shí)施路徑
- 環(huán)保與可持續(xù)發(fā)展在新型城鎮(zhèn)化中的作用
- DB37∕T 5107-2018 城鎮(zhèn)排水管道檢測(cè)與評(píng)估技術(shù)規(guī)程
- 2022新冠疫苗疑似預(yù)防接種異常反應(yīng)監(jiān)測(cè)和處置方案
- 電磁學(xué)第三版趙凱華答案
- 酒精溶液體積濃度、質(zhì)量濃度與密度對(duì)照表
- 主要腸內(nèi)營(yíng)養(yǎng)制劑成分比較
- 老年人各系統(tǒng)的老化改變
- 小學(xué)五年級(jí)綜合實(shí)踐課教案
- 煤礦井下供電常用計(jì)算公式及系數(shù)
- ISO14001:2015中文版(20211205141421)
- 汽車(chē)總裝車(chē)間板鏈輸送線的應(yīng)用研究
- 工作日志模板
評(píng)論
0/150
提交評(píng)論