1. 程式人生 > >紅外編解碼徹底解析

紅外編解碼徹底解析

複製程式碼
#include “at89x52.h”
#define    NULL        0×00        //資料無效
#define    RESET       0X01        //程式復位
#define    REQUEST     0X02        //請求訊號
#define    ACK         0×03        //應答訊號,在接收資料後傳送 ACK 訊號表示資料接收正確,也位請求訊號的應答訊號
#define    NACK        0×04        //應答訊號,表示接收資料錯誤
#define    BUSY        0×05        //忙訊號,表示正在忙
#define
FREE 0×06 //空閒訊號,表示處於空閒狀態 #define READ_IR 0x0b //讀取紅外 #define STORE_IR 0x0c //儲存資料 #define READ_KEY 0x0d //讀取鍵值 #define RECEIVE 0Xf400 //接收緩衝開始地址 #define SEND 0xfa00 //傳送緩衝開始地址 #define IR 0×50 //紅外接收緩衝開始地址 #define HEAD 0xaa //
資料幀頭 #define TAIL 0×55 //資料幀尾 #define SDA P1_7 #define SCL P1_6 unsigned char xdata *buf1; //接受資料緩衝 unsigned int buf1_length; //接收到的資料實際長度 unsigned char xdata *buf2; //傳送資料緩衝 unsigned int buf2_length; //要傳送的資料實際長度 bit buf1_flag; //接收標誌,1 表示接受到一個數據幀,0 表示沒有接受到資料幀或資料幀為空
bit buf2_flag; //傳送標誌,1 表示需要傳送或沒傳送完畢,0 表示沒有要傳送的資料或傳送完畢 unsigned char state1,state2; //用來標誌接收字元的狀態,state1 用來表示接收狀態,state2 用來表示傳送狀態 unsigned char data *ir; union{ unsigned char a[2]; unsigned int b; unsigned char data *p1[2]; unsigned int data *p2[2]; unsigned char xdata *p3; //紅外緩衝的指標 unsigned int xdata *p4; }p; //union{ // // unsigned char a[2]; // // unsigned int b; // unsigned char data *p1[2]; // unsigned int data *p2[2]; // unsigned char xdata *p3; // unsigned int xdata *p4; //地址指標 //}q; // union{ unsigned char a[2]; unsigned int b; }count; union{ unsigned char a[2]; unsigned int b; }temp; union{ unsigned char a[4]; unsigned int b[2]; unsigned long c; }ir_code; union{ unsigned char a[4]; unsigned int b[2]; unsigned long c; unsigned char data *p1[4]; unsigned int data *p2[4]; unsigned char xdata *p3[2]; unsigned int xdata *p4[2]; }I; unsigned char ir_key; bit ir_flag; //紅外接收標誌,0 為緩衝區空,1 為接收成功,2 為緩衝溢位 void sub(void); void delay(void); void ie_0(void); void tf_0(void); void ie_1(void); void tf_1(void); void tf_2(void); void read_ir(void); void ir_jiema(void); void ir_init(void); void ir_exit(void); void store_ir(void); void read_key(void); void reset_iic(void); unsigned char read_byte_ack_iic(void); unsigned char read_byte_nack_iic(void); bit write_byte_iic(unsigned char a); void send_ack_iic(void); void send_nack_iic(void); bit receive_ack_iic(void); void start_iic(void); void stop_iic(void); void write_key_data(unsigned char a); unsigned int read_key_data(unsigned char a); void ie0(void) interrupt 0{ie_0();} void tf0(void) interrupt 1{tf_0();} void ie1(void) interrupt 2{ie_1();} void tf1(void) interrupt 3{tf_1();tf_2();} void tf2(void) interrupt 5{ //採用中斷方式跟查詢方式相結合的辦法解碼 EA="0"; //禁止中斷 if(TF2){ //判斷是否是溢位還是電平變化產生的中斷 TF2=0; //如果是溢位產生的中斷則清除溢位位,重新開放中斷退出 EA="1"; goto end; } EXF2=0; //清除電平變化產生的中斷位 *ir=RCAP2H; //把捕捉的數儲存起來 ir++; *ir=RCAP2L; *ir++; F0=1; TR0=1; //開啟計數器0 loop: TL0=0; //將計數器0 重新置為零 TH0=0; while(!EXF2){ //查詢等待EXF2 變為1 if(TF0) goto exit; //檢查有沒超時,如果超時則退出 }; EXF2=0; //將EXF2 清零 if(!TH0) //判斷是否是長低電平脈衝過來了 { //不是長低電平脈衝而是短低電平 if(F0)count.b++; //短脈衝數加一 temp.a[0]=RCAP2H; //將捕捉數臨時存放起來 temp.a[1]=RCAP2L; goto loop; //返回繼續查詢 } else{ //是低電平脈衝,則進行處理 F0=0; *ir=temp.a[0]; //把連續的短脈衝總時間記錄下來 ir++; *ir=temp.a[1]; ir++; *ir=RCAP2H; //把長電平脈衝時間記錄下來 ir++; *ir=RCAP2L; ir++; if(ir>=0xda) { goto exit; //判斷是否溢位緩衝,如果溢位則失敗退出 } goto loop; //返回繼續查詢 } exit: ir_flag=1; //置ir_flag 為1 表示接收成功 end: ; } void rs232(void) interrupt 4{ static unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2; //sbuf1,sbuf2 用來接收發送臨時用,rsbuf1,rsbuf2 用來分別用來存放接收發送的半位元組 EA="0"; //禁止中斷 if(RI){ RI="0"; //清除接收中斷標誌位 sbuf1=SBUF; //將接收緩衝的字元複製到sbuf1 if(sbuf1==HEAD){ //判斷是否幀開頭 state1=10; //是則把state 賦值為10 buf1=RECEIVE; //初始化接收地址 } else{ switch(state1){ case 10: sbuf2=sbuf1>>4; //把高半位元組右移到的半位元組 sbuf2=~sbuf2; //把低半位元組取反 if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判斷接收是否正確 { //接收錯誤,有可能接收的是資料幀尾,也有可能是接收錯誤 if(sbuf1==TAIL) //判斷是否接收到資料幀尾 { //是接收到資料幀尾 buf1=RECEIVE; //初始化接收的地址 if(*buf1==RESET) //判斷是否為復位命令 { ES="0"; sbuf2=SP+1; for(p.p1[0]=SP-0×10; p.p1[0]<=sbuf2; p.p1[0]++)*p.p1[0]=0; } state1=0; //將接收狀態標誌置為零,接收下一個資料幀 buf1_flag=1; //置接收標誌為1,表示已經接收到一個數據幀 REN="0"; //禁止接收 } else { //不是接受到資料幀尾,表明接收錯誤 state1=0; // 將接收狀態標誌置為零,重新接收 buf1=RECEIVE; //初始化傳送的地址 *buf1=NACK; //把NACK 訊號存入接收緩衝裡 buf1_flag=1; //置標誌位為1,使主程式能對接收錯誤進行處理 REN="0"; //禁止接收 } } else { //接收正確 rsbuf1=~sbuf1; //按位取反,使高半位元組變原碼 rsbuf1&=0xf0; //僅保留高半位元組,低半位元組去掉 state1=20; //將狀態標誌置為20,準備接收低半位元組 } break; case 20: sbuf2=sbuf1>>4; //把高半位元組右移到的半位元組 sbuf2=~sbuf2; //將低半位元組取反 if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判斷接收是否正確 { //接受錯誤 state1=0; // 將接收狀態標誌置為零,重新接收 buf1=RECEIVE; //初始化接收的地址 *buf1=NACK; //把NACK 訊號存入傳送緩衝裡 buf1_flag=1; //置標誌位為1,使主程式能對接收錯誤進行處理 REN="0"; //禁止接收 } else { sbuf1&=0x0f; //僅保留低半位元組,去掉高半位元組 rsbuf1|=sbuf1; //高低半位元組合併 *buf1++=rsbuf1; //將接收的資料儲存至接收緩衝裡,並且資料指標加一 buf1_length++; //接收資料長度加一 state1=10; //將state1 置為10,準備接收下個位元組的高半位元組 } break; } } } else{ TI="0"; //清除傳送中斷標誌 if(buf2_length) //判斷髮送長度是否為零 { //傳送長度不為零 if(state2==0) //判斷是否傳送高半位元組 { //傳送高半位元組 sbuf2=*buf2; //將要傳送的位元組送到sbuf2 rsbuf2=~sbuf2; //取反,使高半位元組變為反碼 sbuf2>>=4; //將高半位元組右移到低半位元組 rsbuf2&=0xf0; //保留高半位元組,去掉低半位元組 sbuf2&=0x0f; //保留低半位元組,去掉高半位元組 rsbuf2|=sbuf2; //合併高低半位元組 SBUF="rsbuf2"; //傳送出去 state2=10; //將state2 置為10 準備傳送下半位元組 } else { //傳送低半位元組 sbuf2=*buf2; //將要傳送的位元組送到sbuf2 buf2++; //指標加一 buf2_length–; //傳送資料長度減一 rsbuf2=~sbuf2; //取反,使低半位元組變為反碼 rsbuf2<<=4; //將低半位元組反碼左移到高半位元組 rsbuf2&=0xf0; //保留高半位元組,去掉低半位元組 sbuf2&=0x0f; //保留低半位元組,去掉高半位元組 rsbuf2|=sbuf2; //合併高低半位元組 SBUF="rsbuf2"; //傳送出 state2=0; } } else { //如果傳送資料長度為零則傳送資料幀尾 if(buf2_flag){ //判斷是否發過資料幀尾 SBUF="TAIL"; //將資料幀尾傳送出去 while(TI==0); TI="0"; buf2_flag=0; //置傳送標誌為零,表示傳送完畢 } } } EA="1"; //開放中斷 }

相關推薦

紅外解碼徹底解析

#include “at89x52.h” #define NULL 0×00 //資料無效 #define RESET 0X01 //程式復位 #define REQUEST 0X02 //請求訊號 #defin

死磕Netty原始碼之Netty解碼原始碼解析

前言 Netty的底層是基於TCP實現的,TCP協議在傳輸資料的過程中一個完整的業務可能會被TCP拆分成多個包進行傳送,也有可能把多個小的包封裝成一個大的資料包傳送,因此我們需要考慮Netty的粘包拆包問題 訊息解碼器 Netty提供了拆包的基類Byt

base64解碼原始碼解析

base64 decode const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//可以自己定製,比如說把+和/改成-和_

FFmpeg視頻解碼庫,無法解析的外部符號、找不到inttypes.h文件的問題

detail program targe image types lib 包含 mage 程序 ffmpeg報錯,link2019,無法解析的外部符號。 以下嘗試: 在檢查 包含目錄、庫目錄、鏈接器輸入和系統環境變量 均設置無誤的情況下,包含的文件要寫成以下形式: ex

螞蟻金服通訊框架SOFABolt解析 | 解碼機制

SOFA Scalable Open Financial Architecture 是螞蟻金服自主研發的金融級分散式中介軟體,包含了構建金融級雲原生架構所需的各個元件,是在金融場景裡錘鍊出來的最佳實踐。 本文為《螞蟻金服通訊框架SOFABolt解析》系列第一篇,

【H.264/AVC視訊解碼技術詳解】二十二、熵編碼(7):語法元素的CABAC解析

《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼的形式操作一遍,才能對視訊壓

【H.264/AVC視訊解碼技術詳解】十二、解析H.264碼流的巨集塊結構(上)

《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼

【H.264/AVC視訊解碼技術詳解】十三、熵編碼演算法(4):H.264使用CAVLC解析巨集塊的殘差資料

《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼

【H.264/AVC視訊解碼技術詳解】 九、序列引數集Sequence Paramater Set(SPS)解析

《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼

Android硬解碼介面MediaCodec使用完全解析(一)

由於4月初要離職了,在找新工作,發現很多企業的招聘資訊都有“附上自己的技術部落格可以加分”類似的說明,正好最後的這段時間會比較閒,所以打算整理一下以前記錄的一些筆記發上來,也算是回顧一下。由於這些筆記或多或少的參考了其他資料,所以本人不擁有其版權,可以隨便

【H.264/AVC視訊解碼技術詳解】十一、H.264的Slice Header解析

《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼

netty原始碼解解析(4.0)-18 ChannelHandler: codec--解碼框架

  編解碼框架和一些常用的實現位於io.netty.handler.codec包中。   編解碼框架包含兩部分:Byte流和特定型別資料之間的編解碼,也叫序列化和反序列化。不型別資料之間的轉換。   下圖是編解碼框架的類繼承體系:   其中MessageToByteEncoder和ByteToMessage

netty原始碼解解析(4.0)-19 ChannelHandler: codec--常用解碼實現

  資料包編解碼過程中主要的工作就是:在編碼過程中進行序列化,在解碼過程中從Byte流中分離出資料包然後反序列化。在MessageToByteEncoder中,已經解決了序列化之後的問題,ByteToMessageDecoder中已經部分第解決了從Byte流中分離出資料包的問題。實現具體的資料包編解碼,只需要

Netty 中的訊息解析解碼

本篇內容主要梳理一下 Netty 中編解碼器的邏輯和編解碼器在 Netty 整個鏈路中的位置。 前面我們在分析 ChannelPipeline 的時候說到入站和出站事件的處理都在 pipeline 中維護著,通過list的形式將處理事件的 handler 按照先後關係儲存為一個列表,有對應的事件過來就按照列

IP通信中音頻解碼技術與抗丟包技術概要

自適應 b+ 極致 較高的 嵌入式 根據 電子 dshow 部分 此文較長,建議收藏起來看。 一、一個典型的IP通信模型 二、Server2Server技術分類 Server2Server這塊也是一個專門的領域,這裏只簡單分個類。 1、同一國家相同運營商之間:

HDBn解碼原理 n階高密度雙極性碼

規則 如果 span 不變 自己 這就是 color 密度 一個 /*------------------------------------------------------------------ HDB3 編碼解碼原理     // 轉載 ----------

Java入門 第一季第五章 程練習解析

使用 接收 family 程序 基本 快捷 ng- 導入 ear 這是我學習慕課網Java課程的筆記。原視頻鏈接為:http://www.imooc.com/learn/85 5-1 基本寫法 自己主動補全快捷鍵:alt + /

關於Tomcat上請求的解碼問題

tomcat 編碼最近翻閱《深入分析 Java Web 技術內幕》(作者:許令波),關於Tomcat上Web請求的編解碼問題,少了一個小點,可能影響了部分讀者的理解,我特意查證了一下,特總結如下:1. 請求的PathInfo部分用Tomcat的Connector元素的URIEncoding屬性指定的編碼來解碼

幾個平臺環境裏視頻解碼和圖像scale的硬件加速的方法

and -c med hub 開發 roi ace 擴展 all 記錄一下遇到幾個平臺裏的視頻編解碼和圖像scale的硬件加速的方法 1,intel平臺可基於VA-API實現視頻codec和圖像scale的硬件加速,具體可使用libyami這個接口友好的封裝庫。加速處理過

【H.264/AVC視頻解碼技術具體解釋】十三、熵編碼算法(3):CAVLC原理

統計 視頻編解碼 高效 png h264 轉化 頻率 遊程編碼 而且 《H.264/AVC視頻編解碼技術具體解釋》視頻教程已經在“CSDN學院”上線。視頻中詳述了H.264的背景、標準協議和實現,並通過一個實戰project的形式對H.264的標準進行解