0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

51單片機(jī)軟件解碼程序的核心要點(diǎn)

GReq_mcu168 ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2017-11-21 09:30 ? 次閱讀

紅外接收頭的型號(hào)有很多HS0038 VS838等 功能大致相同,只是引腳封裝不同。

紅外接收有幾種統(tǒng)一的編碼方式,采樣哪種編碼方式取決于遙控器使用的芯片,接收頭收到的都是一樣的。

電視遙控器使用的是專用集成發(fā)射芯片來實(shí)現(xiàn)遙控碼的發(fā)射,如東芝TC9012,飛利浦AA3010T等,通常彩電遙控信號(hào)的發(fā)射,就是將某個(gè)按鍵所對(duì)應(yīng)的控制指令和系統(tǒng)碼(由0和1組成的序列),調(diào)制在38KHz的載波上,然后經(jīng)放大、驅(qū)動(dòng)紅外發(fā)射管將信號(hào)發(fā)射出去。不同公司的遙控芯片,采樣的遙控碼格式也不一樣,較普遍的有兩種,一種NEC標(biāo)準(zhǔn),一種是PHILIPS標(biāo)準(zhǔn)。

NEC標(biāo)準(zhǔn):遙控載波的頻率為38KHz(占空比1:3)當(dāng)某個(gè)鍵按下時(shí),系統(tǒng)首先發(fā)射一個(gè)完整的全碼,如果按鍵超過108ms仍未松開,接下來發(fā)射的代碼(連發(fā)代碼)將由起始碼(9ms)和結(jié)束碼(2.5ms)組成。

一個(gè)完整的全碼 = 引導(dǎo)碼 +用戶碼 +用戶碼 + 數(shù)據(jù)碼 + 數(shù)據(jù)碼 + 數(shù)據(jù)反碼。

其中,引導(dǎo)碼高電平9ms,低電平4.5ms;系統(tǒng)碼8位,數(shù)據(jù)碼8位,共32位;其中前16位為用戶識(shí)別碼,能區(qū)別不同的紅外遙控設(shè)備,以防止不同的機(jī)種遙控碼互相干擾。后16位為8位的操作碼和8位的操作反碼,用于核對(duì)數(shù)據(jù)是否接收準(zhǔn)確。收端根據(jù)數(shù)據(jù)碼做出應(yīng)該執(zhí)行上面動(dòng)作的判斷。

連發(fā)代碼是在持續(xù)按鍵時(shí)發(fā)送的碼。它告知接收端。某鍵是在被連續(xù)的按著。

NEC標(biāo)準(zhǔn)下的發(fā)射碼表示 發(fā)射數(shù)據(jù)0時(shí)用”0.56ms高電平 + 0.565ms低電平 = 1.125ms”表示; 數(shù)據(jù)1用”高電平0.56ms + 1.69ms = 2.25ms”表示。 遙控器發(fā)射信號(hào):

需要注意的是:當(dāng)一體化接收頭收到38kHz紅外信號(hào)時(shí),輸出端輸出低電平,否則為高電平。所以一體化接收頭輸出的波形和發(fā)射波形是反向的

PHILIPS標(biāo)準(zhǔn): 載波頻率38KHz:沒有筒,點(diǎn)按鍵時(shí),控制碼1和0之間切換,若持續(xù)按鍵,則控制碼不變。 一個(gè)全碼 = 起始碼’11’ +控制碼 + 用戶碼 + 用戶碼 數(shù)據(jù)0用“低電平1.778ms + 高電平1.778ms”表示; 數(shù)據(jù)1用“高電平1.778ms + 低電平1.778ms”表示。 連續(xù)碼重復(fù)延時(shí)114ms。

所謂的解碼就是一個(gè)區(qū)分脈沖寬度的過程。紅矮信號(hào)的0和1是通過脈沖持續(xù)時(shí)間的長短來區(qū)分的,

我的遙控器使用的是NEC標(biāo)準(zhǔn)的WD6122芯片,遙控器編碼如下:

以下是我用1602顯示紅外接收頭接收到編碼的程序: ①這個(gè)是對(duì)1602操作的函數(shù)

------------------------------------------------*/

#include "1602.h"

#include "delay.h"

#define CHECK_BUSY

sbit RS = P2^4; //定義端口

sbit RW = P2^5;

sbit EN = P2^6;

#define RS_CLR RS=0

#define RS_SET RS=1

#define RW_CLR RW=0

#define RW_SET RW=1

#define EN_CLR EN=0

#define EN_SET EN=1

#define DataPort P0

/*------------------------------------------------

判忙函數(shù)

------------------------------------------------*/

bit LCD_Check_Busy(void)

{

#ifdef CHECK_BUSY

DataPort= 0xFF;

RS_CLR;

RW_SET;

EN_CLR;

_nop_();

EN_SET;

return (bit)(DataPort & 0x80);

#else

return 0;

#endif

}

/*------------------------------------------------

寫入命令函數(shù)

------------------------------------------------*/

void LCD_Write_Com(unsigned char com)

{

// while(LCD_Check_Busy()); //忙則等待

DelayMs(5);

RS_CLR;

RW_CLR;

EN_SET;

DataPort= com;

_nop_();

EN_CLR;

}

/*------------------------------------------------

寫入數(shù)據(jù)函數(shù)

------------------------------------------------*/

void LCD_Write_Data(unsigned char Data)

{

//while(LCD_Check_Busy()); //忙則等待

DelayMs(5);

RS_SET;

RW_CLR;

EN_SET;

DataPort= Data;

_nop_();

EN_CLR;

}

/*------------------------------------------------

清屏函數(shù)

------------------------------------------------*/

void LCD_Clear(void)

{

LCD_Write_Com(0x01);

DelayMs(5);

}

/*------------------------------------------------

寫入字符串函數(shù)

------------------------------------------------*/

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)

{

if (y == 0)

{

LCD_Write_Com(0x80 + x); //表示第一行

}

else

{

LCD_Write_Com(0xC0 + x); //表示第二行

}

while (*s)

{

LCD_Write_Data( *s);

s ++;

}

}

/*------------------------------------------------

寫入字符函數(shù)

------------------------------------------------*/

/* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)

{

if (y == 0)

{

LCD_Write_Com(0x80 + x);

}

else

{

LCD_Write_Com(0xC0 + x);

}

LCD_Write_Data( Data);

}*/

/*------------------------------------------------

初始化函數(shù)

------------------------------------------------*/

void LCD_Init(void)

{

LCD_Write_Com(0x38); /*顯示模式設(shè)置*/

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

LCD_Write_Com(0x08); /*顯示關(guān)閉*/

LCD_Write_Com(0x01); /*顯示清屏*/

LCD_Write_Com(0x06); /*顯示光標(biāo)移動(dòng)設(shè)置*/

DelayMs(5);

LCD_Write_Com(0x0C); /*顯示開及光標(biāo)設(shè)置*/

}

②延時(shí)函數(shù)

#include "delay.h"

/*------------------------------------------------

uS延時(shí)函數(shù),含有輸入參數(shù) unsigned char t,無返回值

unsigned char 是定義無符號(hào)字符變量,其值的范圍是

0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編,大致延時(shí)

長度如下 T=tx2+5 uS

------------------------------------------------*/

void DelayUs2x(unsigned char t)

{

while(--t);

}

/*------------------------------------------------

mS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值

unsigned char 是定義無符號(hào)字符變量,其值的范圍是

0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編

------------------------------------------------*/

void DelayMs(unsigned char t)

{

while(t--)

{

//大致延時(shí)1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

③以下是主函數(shù)

#include //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義

#include"1602.h"

#include"delay.h"

sbit IR=P3^2; //紅外接口標(biāo)志

char code Tab[16]="0123456789ABCDEF";

/*------------------------------------------------

全局變量聲明

------------------------------------------------*/

unsigned char irtime;//紅外用全局變量

bit irpro_ok,irok;

unsigned char IRcord[4];

unsigned char irdata[33];

unsigned char TempData[16];

/*------------------------------------------------

函數(shù)聲明

------------------------------------------------*/

void Ir_work(void);

void Ircordpro(void);

/*------------------------------------------------

定時(shí)器0中斷處理

------------------------------------------------*/

void tim0_isr (void) interrupt 1 using 1

{

irtime++; //用于計(jì)數(shù)2個(gè)下降沿之間的時(shí)間

}

/*------------------------------------------------

外部中斷0中斷處理

------------------------------------------------*/

void EX0_ISR (void) interrupt 0 //外部中斷0服務(wù)函數(shù)

{

static unsigned char i; //接收紅外信號(hào)處理

static bit startflag; //是否開始處理標(biāo)志位

if(startflag)

{

if(irtime<63&&irtime>=33)//引導(dǎo)碼 TC9012的頭碼,9ms+4.5ms

i=0;

irdata[i]=irtime;//存儲(chǔ)每個(gè)電平的持續(xù)時(shí)間,用于以后判斷是0還是1

irtime=0;

i++;

if(i==33)

{

irok=1;

i=0;

}

}

else

{

irtime=0;

startflag=1;

}

}

/*------------------------------------------------

定時(shí)器0初始化

------------------------------------------------*/

void TIM0init(void)//定時(shí)器0初始化

{

TMOD=0x02;//定時(shí)器0工作方式2,TH0是重裝值,TL0是初值

TH0=0x00; //重載值

TL0=0x00; //初始化值

ET0=1; //開中斷

TR0=1;

}

/*------------------------------------------------

外部中斷0初始化

------------------------------------------------*/

void EX0init(void)

{

IT0 = 1; //指定外部中斷0下降沿觸發(fā),INT0 (P3.2)

EX0 = 1; //使能外部中斷

EA = 1; //開總中斷

}

/*------------------------------------------------

鍵值處理

------------------------------------------------*/

void Ir_work(void)

{

TempData[0] = Tab[IRcord[0]/16]; //處理客戶碼

TempData[1] = Tab[IRcord[0]%16];

TempData[2] = '-';

TempData[3] = Tab[IRcord[1]/16]; //處理客戶碼

TempData[4] = Tab[IRcord[1]%16];

TempData[5] = '-';

TempData[6] = Tab[IRcord[2]/16]; //處理數(shù)據(jù)碼

TempData[7] = Tab[IRcord[2]%16];

TempData[8] = '-';

TempData[9] = Tab[IRcord[3]/16]; //處理數(shù)據(jù)反碼

TempData[10] = Tab[IRcord[3]%16];

LCD_Write_String(5,1,TempData);

irpro_ok=0;//處理完成標(biāo)志

}

/*------------------------------------------------

紅外碼值處理

------------------------------------------------*/

void Ircordpro(void)//紅外碼值處理函數(shù)

{

unsigned char i, j, k;

unsigned char cord,value;

k=1;

for(i=0;i<4;i++) ? ? ?//處理4個(gè)字節(jié)

{

for(j=1;j<=8;j++) //處理1個(gè)字節(jié)8位

{

cord=irdata[k];

if(cord>7)//大于某值為1,這個(gè)和晶振有絕對(duì)關(guān)系,這里使用12M計(jì)算,此值可以有一定誤差

value|=0x80;

if(j<8)

{

value>>=1;

}

k++;

}

IRcord[i]=value;

value=0;

}

irpro_ok=1;//處理完畢標(biāo)志位置1

}

/*------------------------------------------------

主函數(shù)

------------------------------------------------*/

void main(void)

{

EX0init(); //初始化外部中斷

TIM0init(); //初始化定時(shí)器

LCD_Init(); //初始化液晶

DelayMs(20); //延時(shí)有助于穩(wěn)定

LCD_Clear(); //清屏

LCD_Write_String(0,0,"www.doflye.net");

LCD_Write_String(0,1,"Code:");

while(1)//主循環(huán)

{

if(irok) //如果接收好了進(jìn)行紅外處理

{

Ircordpro();

irok=0;

}

if(irpro_ok) //如果處理好后進(jìn)行工作處理,如按對(duì)應(yīng)的按鍵后顯示對(duì)應(yīng)的數(shù)字等

{

Ir_work();

}

}

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 51單片機(jī)
    +關(guān)注

    關(guān)注

    272

    文章

    5689

    瀏覽量

    122171
  • 集成發(fā)射芯片
    +關(guān)注

    關(guān)注

    0

    文章

    1

    瀏覽量

    728

原文標(biāo)題:紅外遙控系統(tǒng)原理附51單片機(jī)軟件解碼程序

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    最簡單的51單片機(jī)紅外遙控解碼程序

    介紹本人自編的51單片機(jī)紅外遙控解碼程序,自認(rèn)為是可能是史上最簡的紅外遙控解碼程序。
    發(fā)表于 03-20 10:05 ?1.6w次閱讀

    51單片機(jī)流水燈程序

    51單片機(jī)流水燈程序 51單片機(jī)流水燈程序
    發(fā)表于 12-21 15:52 ?170次下載

    Ev1527的pic單片機(jī)軟件接收解碼程序

    Ev1527的pic單片機(jī)軟件接收解碼程序
    發(fā)表于 02-27 16:57 ?88次下載

    51單片機(jī)程序下載軟件下載

    51單片機(jī)程序下載軟件燒寫程序
    發(fā)表于 04-08 17:20 ?14次下載

    使用51單片機(jī)進(jìn)行PS2鍵盤解碼實(shí)驗(yàn)的C語言程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用51單片機(jī)進(jìn)行PS2鍵盤解碼實(shí)驗(yàn)的C語言程序免費(fèi)下載。
    發(fā)表于 08-26 17:30 ?9次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>進(jìn)行PS2鍵盤<b class='flag-5'>解碼</b>實(shí)驗(yàn)的C語言<b class='flag-5'>程序</b>免費(fèi)下載

    最新的51單片機(jī)GPS解碼程序免費(fèi)下載

    本文的主要內(nèi)容是最新的51單片機(jī)GPS解碼程序免費(fèi)下載。
    發(fā)表于 06-26 17:43 ?6次下載
    最新的<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>GPS<b class='flag-5'>解碼</b><b class='flag-5'>程序</b>免費(fèi)下載

    51單片機(jī)燒寫程序的方法

    STC89C51是應(yīng)用廣泛的51單片機(jī),很多人都是通過該單片機(jī)入門學(xué)習(xí)的,單片機(jī)的學(xué)習(xí)需要勤動(dòng)手。單片機(jī)
    的頭像 發(fā)表于 04-04 15:54 ?2.4w次閱讀

    51 單片機(jī)串口燒錄程序方法

    51單片機(jī)串口燒錄程序方法51 單片機(jī)串口燒錄程序方法一、說明介紹二、
    發(fā)表于 11-25 18:21 ?120次下載
    <b class='flag-5'>51</b> <b class='flag-5'>單片機(jī)</b>串口燒錄<b class='flag-5'>程序</b>方法

    基于51單片機(jī)的1602遙控解碼設(shè)計(jì)資料源程序文件

    基于51單片機(jī)的1602遙控解碼設(shè)計(jì)資料源程序文件
    發(fā)表于 04-27 15:21 ?2次下載

    基于51單片機(jī)的VB遙控播放器紅外遙控解碼設(shè)計(jì)源程序

    基于51單片機(jī)的VB遙控播放器紅外遙控解碼設(shè)計(jì)資料源程序
    發(fā)表于 04-27 15:08 ?0次下載

    基于51單片機(jī)的紅外遙控解碼數(shù)碼管顯示設(shè)計(jì)資料源程序

    基于51單片機(jī)的紅外遙控解碼數(shù)碼管顯示設(shè)計(jì)資料源程序
    發(fā)表于 04-26 15:35 ?5次下載

    基于51單片機(jī)的遙控解碼通過電腦串口顯示設(shè)計(jì)資料源程序

    基于51單片機(jī)的遙控解碼通過電腦串口顯示設(shè)計(jì)資料源程序
    發(fā)表于 04-26 15:19 ?1次下載

    基于51單片機(jī)數(shù)碼管遙控解碼設(shè)計(jì)資料源程序

    基于51單片機(jī)數(shù)碼管遙控解碼設(shè)計(jì)資料源程序
    發(fā)表于 04-26 15:13 ?0次下載

    基于89C51單片機(jī)的紅外解碼1602液晶顯示源程序

    基于89C51單片機(jī)的紅外解碼1602液晶顯示源程序
    發(fā)表于 05-15 11:07 ?4次下載

    基于89C51單片機(jī)的紅外解碼數(shù)碼管顯示源程序

    基于89C51單片機(jī)的紅外解碼數(shù)碼管顯示源程序
    發(fā)表于 05-15 11:07 ?3次下載