導航:首頁 > 操作系統 > 單片機紅外遙控代碼

單片機紅外遙控代碼

發布時間:2023-03-23 17:41:03

① 關於單片機紅外遙控代碼部分的幾個問題: 1.Ircordpro函數中if(cord>7)是干什麼用的

判斷長短脈寬啊,寬脈沖才是邏輯1。
看程序之前先看紅外協議的波形圖,光看程序的話當然難以理解的。

② 51單片機紅外遙控程序是什麼

#includex0dx0a#includex0dx0a#define uchar unsigned charx0dx0a#define uint unsigned intx0dx0asbit lcden = P2^7;x0dx0asbit lcdrs = P2^6;x0dx0asbit lcdwr = P2^5;x0dx0asbit IR = P3^2;x0dx0auchar IRCOM[6];//數組,用於存儲紅外編碼x0dx0auchar code table1[] = "remote control";x0dx0auchar code table2[] = "CODE:";x0dx0avoid delayms(uchar x)// 延時x*0.14msx0dx0a{x0dx0auchar i;x0dx0awhile(x--)x0dx0afor(i=0;i<13;i++){}x0dx0a}x0dx0avoid delay(uchar x)//延時xmsx0dx0a{x0dx0auchar i,j;x0dx0afor(i=x;i>0;i--)x0dx0afor(j=110;j>0;j--);x0dx0a}x0dx0a/****************************LCD部分***********************************************/x0dx0avoid write_com(uchar com)x0dx0a{x0dx0alcden = 0;x0dx0alcdrs = 0;x0dx0alcdwr = 0;x0dx0aP0 = com;x0dx0adelay(5);x0dx0alcden = 1;x0dx0adelay(5);x0dx0alcden = 0;//別忘了lcden拉低x0dx0a}x0dx0avoid write_date(uchar date)x0dx0a{x0dx0alcden = 0;x0dx0alcdrs = 1;x0dx0alcdwr = 0;x0dx0aP0 = date;x0dx0adelay(5);x0dx0alcden = 1;x0dx0adelay(5);x0dx0alcden = 0;x0dx0a}x0dx0avoid lcd_init(void)x0dx0a{x0dx0alcden = 0;x0dx0alcdrs = 0;x0dx0alcdwr = 0;x0dx0adelay(5);x0dx0awrite_com(0x38);x0dx0awrite_com(0x0c);x0dx0awrite_com(0x06);x0dx0awrite_com(0x01);x0dx0a}x0dx0a/*****************main()************************/x0dx0avoid main(void)x0dx0a{x0dx0auchar count=0;x0dx0aIR = 1;x0dx0alcd_init();x0dx0awrite_com(0x80);x0dx0awhile(table1[count]!='\0')x0dx0a{x0dx0awrite_date(table1[count]);x0dx0acount++;x0dx0adelay(5);x0dx0a}x0dx0acount = 0;x0dx0awrite_com(0x80+0x40);x0dx0awhile(table2[count]!='\0')x0dx0a{x0dx0awrite_date(table2[count]);x0dx0acount++;x0dx0adelay(5);x0dx0a}x0dx0ax0dx0aIE = 0x81; //開中斷x0dx0aTCON = 0x01;//脈沖負邊沿觸發x0dx0awhile(1);x0dx0ax0dx0a}x0dx0a/*********************紅外中斷**************************/x0dx0avoid IR_time() interrupt 0 x0dx0a{x0dx0auchar i,j,TimeNum=0;//TimeNum用來計IR高電平次數 從而判斷是0還是1x0dx0aEX0 = 0; //關閉中斷x0dx0adelayms(5);x0dx0aif(1 == IR)x0dx0a{x0dx0aEX0 = 1;x0dx0areturn;x0dx0a}x0dx0awhile(!IR) //跳過9ms前導低電平x0dx0adelayms(1);x0dx0afor(i=0;i<4;i++)x0dx0a{x0dx0afor(j=0;j<8;j++)x0dx0a{x0dx0awhile(IR) //跳過4.5ms的前導高電平x0dx0adelayms(1);x0dx0awhile(!IR) //跳過0.56ms的低電平x0dx0adelayms(1);x0dx0ax0dx0awhile(IR) x0dx0a{x0dx0aTimeNum++; //計時高電平時間從而判斷讀取的是0還是1x0dx0adelayms(1);x0dx0a}x0dx0aif(TimeNum>=30)//按鍵按下時間過長 跳過x0dx0a{x0dx0aEX0 = 1;x0dx0areturn;x0dx0a}x0dx0aIRCOM[i] = IRCOM[i]>>1;x0dx0aif(TimeNum >= 8) //8*0.14ms 這時讀取的是1;x0dx0a{x0dx0aIRCOM[i] = IRCOM[i]|0x80;x0dx0a}x0dx0aTimeNum = 0;x0dx0a}x0dx0a}x0dx0aif(IRCOM[2]!=~IRCOM[3])//判斷八位數據和八位數據反碼是否相等x0dx0a{x0dx0aEX0 = 1;x0dx0areturn;x0dx0a}x0dx0aIRCOM[4] = IRCOM[2]&0x0f;//取低四位x0dx0aIRCOM[5] = IRCOM[2]>>4; //IRCOM[5]取IRCOM[2]高四位x0dx0aif(IRCOM[4] > 9) //轉換成字元x0dx0a{x0dx0aIRCOM[4] = IRCOM[4] + 0x37;x0dx0a}x0dx0aelsex0dx0aIRCOM[4] = IRCOM[4] + 0x30;x0dx0aif(IRCOM[5] > 9)x0dx0a{x0dx0aIRCOM[5] = IRCOM[5] + 0x37;x0dx0a}x0dx0aelsex0dx0aIRCOM[5] = IRCOM[5] + 0x30;x0dx0adelay(5);x0dx0awrite_com(0x80 + 0x40 + 5);x0dx0awrite_date(IRCOM[5]);x0dx0awrite_date(IRCOM[4]);x0dx0aEX0 = 1; //重新開啟外部中斷x0dx0a}

③ 求51單片機紅外遙控程序

sbitIR_OUT=P3^2;
unsignedcharSigInfo[4];//存儲紅外按鍵編碼,SigInfo[2]為按鍵值

voidCmd_Require(void);

voidINT_Ext0()interrupt1//外部中斷0
{
u8i,j;
u16time=8000;

EA=0;

for(i=0;i<10;i++){
delay0_7ms();
if(IR_OUT){
EA=1;
return;
}
}

while(!IR_OUT);

delay2_5ms();
if(!IR_OUT){
EA=1;
return;
}

while(IR_OUT&&time){
time--;
}
time=8000;

for(i=0;i<4;i++){
for(j=0;j<8;j++){
SigInfo[i]>>=1;
while(!IR_OUT);

delay0_7ms();

if(IR_OUT){
SigInfo[i]|=0x80;
while(IR_OUT&&time){
time--;
}
time=8000;
}
}
}

Cmd_Require();
EA=1;
}

voidCmd_Require(void)
{
switch(SigInfo[2]){
case0x0c:
//此處代碼隨意
break;
case0x18:
//...
break;
//...
default:
break;
}
}

延時沒寫,因單片機而異的,要精確點才能解碼。

④ 單片機紅外遙控程序中m/8是什麼意思

單片機紅外遙控程序中m/8是指:起始位後面的4個位元組代碼在數組變數中的索引號,其帆肢值是0~3共4個數。
m的有效值是0~31,表示接收到32bit的信號,每8bit為一個位元組,所以m/8的結果是0~3的數。當m等於0~7的態悶世時候,m/8的結果是0;依此類推,罩螞當m等於8~15的時候,m/8的結果是1;當m等於32時清零,完成4個位元組的代碼接收。

⑤ 單片機紅外編碼

C51程序代碼:
#include <AT89X51.h>
static bit OP; //紅外發射管的亮滅
static unsigned int count; //延時計數器
static unsigned int endcount; //終止延時計數
static unsigned char flag; //紅外發送標志
char iraddr1; //十六位地址的第一個位元組
char iraddr2; //十六位地址的第二個位元組
void SendIRdata(char p_irdata);
void delay();
void main(void)
{
count = 0;
flag = 0;
OP = 0;
P3_4 = 0;
EA = 1; //允許CPU中斷
TMOD = 0x11; //設定時器0和1為16位模式1
ET0 = 1; //定時器0中斷允許

TH0 = 0xFF;
TL0 = 0xE6; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1;//開始計數
iraddr1=3;
iraddr2=252;

do{
delay();
SendIRdata(12);
}while(1);
}
//定時器0中斷處理
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE6; //設定時值為38K 也就是每隔26us中斷一次
count++;
if (flag==1)
{
OP=~OP;
}
else
{
OP = 0;
}
P3_4 = OP;
}

void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;
//發送9ms的起始碼
endcount=223;
flag=1;
count=0;
do{}while(count<endcount);
//發送4.5ms的結果碼
endcount=117
flag=0;
count=0;
do{}while(count<endcount);
//發送十六位地址的前八位
irdata=iraddr1;
for(i=0;i<8;i++)
{
//先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
//停止發送紅外信號(即編碼中的高電平)
if(irdata-(irdata/2)*2) //判斷二進制數個位為1還是0
{
endcount=41; //1為寬的高電平
}
else
{
endcount=15; //0為窄的高電平
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//發送十六位地址的後八位
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//發送八位數據
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//發送八位數據的反碼
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
}
void delay()
{
int i,j;
for(i=0;i<400;i++)
{
for(j=0;j<100;j++)
{
}
}
}

⑥ 基於51單片機紅外遙控代碼(C語言)

以下文件是51單片機實現遙控解碼,通過數碼管顯示鍵碼的程序,P0口驅動數碼管段選,p2.6和p2.7為數碼管位選,接收頭連到P3.2口。此程序以通過驗證,可以直接編譯使用,另外還有一個繼電器和蜂鳴器的控制,不用可以屏蔽掉。

;********************************************************************************
;* 描述: *
;* 遙控鍵值讀取器 *
;* 數碼管顯示, P0口為數碼管的數據口 *
;* *
;********************************************************************************
;遙控鍵值解碼-數碼管顯示 *
;********************************************************************************/

#include <reg51.h>
#include <intrins.h>

void IR_SHOW();
void delay(unsigned char x);//x*0.14MS
void delay1(unsigned char ms);
void beep();

sbit IRIN = P3^2;
sbit BEEP = P3^7;
sbit RELAY= P1^3;
sbit GEWEI= P2^7;
sbit SHIWEI= P2^6;

unsigned char IRCOM[8];
unsigned char code table[16] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
main()
{
IE = 0x81; //允許總中斷中斷,使能 INT0 外部中斷
TCON = 0x1; //觸發方式為脈沖負邊沿觸發
delay(1);

IRIN=1;
BEEP=1;
RELAY=1;
for(;;)
{
IR_SHOW();
}

} //end main

void IR_IN() interrupt 0 using 0
{
unsigned char i,j,k,N=0;
EA = 0;
I1:
for (i=0;i<4;i++)
{
if (IRIN==0) break;
if (i==3) {EA =1;return;}
}
delay(20);
if (IRIN==1) goto I1; //確認IR信號出現
while (!IRIN) //等 IR 變為高電平
{delay(1);}

for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN) //等 IR 變為低電平
{delay(1);}
while (!IRIN) //等 IR 變為高電平
{delay(1);}
while (IRIN) //計算IR高電平時長
{
delay(1);
N++;
if (N>=30) {EA=1;return;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}//end for k
}//end for j

if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
IRCOM[5]=IRCOM[2] & 0x0F;
IRCOM[6]=IRCOM[2] & 0xF0;
IRCOM[6]=IRCOM[6] >> 4;
beep();
EA = 1;

}

void IR_SHOW()
{
P0 = table[IRCOM[5]];
GEWEI = 0;
SHIWEI = 1;
delay1(4);
P0 = table[IRCOM[6]];
SHIWEI = 0;
GEWEI = 1;
delay1(4);
}

void beep()
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(5);
BEEP=!BEEP;
}
BEEP=1;
}

void delay(unsigned char x)//x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}

void delay1(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i<120; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

⑦ 我用單片機編程,怎樣知道一個紅外遙控器的每個按鍵的代碼,或者怎樣操作

單片機UART接個紅外接收。另外還要做個遙控器,也用單片機UART接個紅外發射。用遙控器的單片機做按鍵編碼,發射不同的數據到串口,例如0x01是開,0xfe是關。

然後接收的單片機做UART數據解碼,接收到0X01就做開操作,0XFE做關操作。

⑧ 這是一段51單片機的紅外遙控代碼,主要就是用了遙控器上的三個鍵。看不懂呀,求大神幫助注釋或解釋下

這就是一個紅外解碼程序,按標准來做就行了。普及一下紅外解碼知識:
採用脈寬調制的串列碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制
的"0";以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的"1,;上述"0"和
"1"組成的32位二進制碼經38kHz的載頻進行二次調制以提高發射效率,;達到降低電源功耗的
目的。然後再通過紅外發射二極體產生紅外線向空間發射,;遙控編碼是連續的32位二進制碼
組,其中前16位為用戶識別碼,能區別不同的電器設備,;防止不同機種遙控碼互相干擾。該
晶元的用戶識別碼固定為十六進制01H;後16位為8位操作碼(功能碼)及其反碼。
當一個鍵按下超過36ms,振盪器使晶元激活,將發射一組108ms的編碼脈沖,這108ms發射代碼
由一個起始碼(9ms),一個結果碼(4.5ms),低8位地址碼(9ms~18ms),高8位地址碼
(9ms~18ms),8位數據碼(9ms~18ms)和這8位數據的反碼(9ms~18ms)組成。如果鍵按下超
過108ms仍未松開,接下來發射的代碼(連發代碼)將僅由起始碼(9ms)和結束碼(2.5ms)
組成。
解碼的關鍵是如何識別"0"和"1",接收端而言,"0"是0.56ms的高+0.56ms的低。"1"是1.68ms
的高+0.56ms的低。所以可以根據高電平的寬度區別"0"和"1"。當高電平出現時開始延時,
0.56ms以後,若讀到的電平為低,說明該位為"0",反之則為"1",為了可靠起見,延時必須
比0.56ms長些,但又不能超過1.12ms,否則如果該位為"0",讀到的已是下一位的高電平,因此
取(1.12ms+0.56ms)/2=0.84ms最為可靠,一般取0.84ms左右均可。

⑨ 單片機編程(紅外線遙控器)

這段程序的意思是將鍵值換算成ASCII碼字元表示;
0x30 表示ASCII碼的『0』,ASCII碼表裡面字元0的編號就是0x30;
0x37 的意思是當鍵值大於9時,鍵值用十六進制字元表示,0x37 實際上是『A』-10,『A』=0x41,『A』- 10 =0x37;比如鍵值是10,那麼輸出就是ASCII字元『A』;

⑩ 誰有51單片機紅外遙控亮滅LED代碼就只要一個鍵控制點亮,另一個鍵控制滅就行

答:編程思路兄穗 紅外遙控羨如卜解橡逗碼。

上面是 "0" / "1" 的表示方法

用中斷 測出 低脈沖的持續就可以知道 0 1 了, 最後通過鍵數據碼 來定義 單片機要干什麼事

閱讀全文

與單片機紅外遙控代碼相關的資料

熱點內容
鴻蒙加密等級 瀏覽:802
cocos2dluapdf 瀏覽:491
假的加密鎖靠譜嗎 瀏覽:176
經營聖手伺服器怎麼調 瀏覽:749
arduino手機編程 瀏覽:481
西醫pdf下載 瀏覽:29
後浪電影學院pdf 瀏覽:813
程序員怎麼做到不被人嫉妒 瀏覽:669
cmd新建文件夾md命令 瀏覽:570
php數組中的數值排序 瀏覽:832
安卓手機怎麼避免小孩內購 瀏覽:171
聯想伺服器出現黃色嘆號怎麼辦 瀏覽:991
約翰編譯器製作教程 瀏覽:130
大地pdf 瀏覽:109
pdfplus 瀏覽:577
匯編O命令 瀏覽:970
plt轉pdf 瀏覽:366
魔獸60宏命令大全 瀏覽:480
php志願者網站源碼 瀏覽:875
貿易pdf 瀏覽:498