① 關於單片機紅外遙控代碼部分的幾個問題: 1.Ircordpro函數中if(cord>7)是干什麼用的
判斷長短脈寬啊,寬脈沖才是邏輯1。
看程序之前先看紅外協議的波形圖,光看程序的話當然難以理解的。
② 51單片機紅外遙控程序是什麼
#include
③ 求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 了, 最後通過鍵數據碼 來定義 單片機要干什麼事