當前位置:首頁 » 編程語言 » 紅外遙控c語言

紅外遙控c語言

發布時間: 2022-04-23 00:41:44

① 如何用c語言編程使紅外線遙控其它元件

這不可以吧,怎麼可能,用C語言去編寫

② 高分請教高人,紅外遙控解碼程序C語言,要求每一行都解釋為什麼什麼作用。非常感謝!!先給100分,好再加

#include <reg52.h> //特殊寄存器頭文件

#define c(x) (x*110592/120000) //是晶振值,為計數器計一下所需要的微秒數,120000為12M,110592為11.0592M

sbit Ir_Pin=P3^3; //位聲明,把P3.3/外部中斷1的狀態讀到Ir_Pin中

unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共陽極數碼顯示碼0-F.
unsigned char code Led_Sel[]={0xe,0xd,0xb,0x7}; //位選編碼

unsigned char Led_Buf[4]; //顯示緩沖區
char Led_Index; //位選信號定義

unsigned char Ir_Buf[4]; //用於保存解碼結果

//==============================================================
//數碼管掃描
timer0() interrupt 1 using 1 //定時器中斷零程序
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256; //定時器0設定約1000us中斷一次,用於數碼管掃描
P0=0xff; //數碼管初始顯示零
P2=Led_Sel[Led_Index]; //位選
P0=Led_Tab[Led_Buf[Led_Index]]; //段選

if(++Led_Index>3) Led_Index=0; //四個掃描完了,到第一個數碼管
}
//==============================================================
unsigned int Ir_Get_Low() //脈沖為低電平的時間
{
TL1=0;
TH1=0; //為定時器1賦初值
TR1=1; //開啟定時器1
while(!Ir_Pin && (TH1&0x80)==0); //判斷,如果P3.3口為低電平則執行TR1=0
TR1=0; //關閉定時器1
return TH1*256+TL1; //返回TH1*256+TL1的值
}
//=============================================================
unsigned int Ir_Get_High() //脈沖高電平時間
{
TL1=0;
TH1=0; //為定時器1賦初值
TR1=1; //開啟定時器1
while(Ir_Pin && (TH1&0x80)==0); //判斷,如果P3.3口為低電平則執行TR1=0
TR1=0; //關閉定時器1
return TH1*256+TL1; //返回TH1*256+TL1的值
}
//==============================================================
main()
{
unsigned int temp;
char i,j;
Led_Index=1;

TMOD=0x11;
TL0=(65536-1000)%256;
TH0=(65536-1000)/256; //定時器0設定約1000us中斷一次,用於數碼管掃描
EA=1; //開總中斷
ET0=1; //定時計數器0的開放控制位
TR0=1; //定時器0的運行控制位

Led_Buf[0]=0;
Led_Buf[1]=0;
Led_Buf[2]=0;
Led_Buf[3]=0; //顯示區設成0

do{
restart:
while(Ir_Pin); //判斷P3.3口
temp=Ir_Get_Low(); //取脈沖為低電平的時間
if(temp<c(8500) || temp>c(9500)) continue; //引導脈沖低電平9000
temp=Ir_Get_High(); //取脈沖高電平時間
if(temp<c(4000) || temp>c(5000)) continue; //引導脈沖高電平4500
for(i=0;i<4;i++) //4個位元組
for(j=0;j<8;j++) //每個位元組8位
{
temp=Ir_Get_Low();
if(temp<c(200) || temp>c(800)) goto restart; //根據編碼格式,低電平小於0.2ms大於0.8ms視為無效電平,重新檢測
temp=Ir_Get_High();
if(temp<c(200) || temp>c(2000)) goto restart; //根據編碼格式,低電平小於0.2ms大於2ms視為無效電平,重新檢測
Ir_Buf[i]>>=1; //把Ir_Buf[i]右移一位,然後賦值給Ir_Buf[i]
if(temp>c(1120)) Ir_Buf[i]|=0x80; //根據編碼格式,如果電平大於1.12ms,則把0x80賦值給Ir_Buf[i]
}
Led_Buf[0]=Ir_Buf[2]&0xf;
Led_Buf[1]=(Ir_Buf[2]/16)&0xf;
Led_Buf[2]=Ir_Buf[3]&0xf;
Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //顯示結果
}while(1);
}

③ 急需基於51單片機的紅外遙控開關的設計原理圖和程序(c語言版)

/*------------------------------------------------*/
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義

sbit IR=P3^2; //紅外介面標志

#define DataPort P0 //定義數據埠 程序中遇到DataPort 則用P0 替換
sbit DUAN=P2^6;//定義鎖存使能埠 段鎖存
sbit WEI=P2^7;// 位鎖存
/*------------------------------------------------
全局變數聲明
------------------------------------------------*/
unsigned char code dofly_DuanMa[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 顯示段碼值0~F
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼
unsigned char TempData[8]; //存儲顯示值的全局變數
unsigned char irtime;//紅外用全局變數

bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];

/*------------------------------------------------
函數聲明
------------------------------------------------*/

void Ir_work(void);
void Ircordpro(void);
/*------------------------------------------------
顯示函數,用於動態掃描數碼管
輸入參數 FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數碼管開始顯示
如輸入0表示從第一個顯示。
Num表示需要顯示的位數,如需要顯示99兩位數值則該值輸入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;

DataPort=0; //清空數據,防止有交替重影
DUAN=1; //段鎖存
DUAN=0;

DataPort=dofly_WeiMa[i+FirstBit]; //取位碼
WEI=1; //位鎖存
WEI=0;

DataPort=TempData[i]; //取顯示數據,段碼
DUAN=1; //段鎖存
DUAN=0;

i++;
if(i==Num)
i=0;

}
/*------------------------------------------------
定時器0中斷處理
------------------------------------------------*/

void tim0_isr (void) interrupt 1 using 1
{
irtime++; //用於計數2個下降沿之間的時間
}
/*------------------------------------------------
定時器中斷子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{

TH1=(65536-2000)/256; //重新賦值 2ms
TL1=(65536-2000)%256;

Display(0,8); // 調用數碼管掃描

}
/*------------------------------------------------
外部中斷0中斷處理
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中斷0服務函數
{
static unsigned char i; //接收紅外信號處理
static bit startflag; //是否開始處理標志位

if(startflag)
{
if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms+4.5ms
i=0;
irdata[i]=irtime;//存儲每個電平的持續時間,用於以後判斷是0還是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}

}

/*------------------------------------------------
定時器0初始化
------------------------------------------------*/
void TIM0init(void)//定時器0初始化
{

TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
TH0=0x00; //重載值
TL0=0x00; //初始化值
ET0=1; //開中斷
TR0=1;
}
/*------------------------------------------------
定時器初始化子程序
------------------------------------------------*/
void Init_Timer1(void)
{
TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
//TH1=0x00; //給定初值
//TL1=0x00;
EA=1; //總中斷打開
ET1=1; //定時器中斷打開
TR1=1; //定時器開關打開
}
/*------------------------------------------------
外部中斷0初始化
------------------------------------------------*/
void EX0init(void)
{
IT0 = 1; //指定外部中斷0下降沿觸發,INT0 (P3.2)
EX0 = 1; //使能外部中斷
EA = 1; //開總中斷
}
/*------------------------------------------------
鍵值處理
------------------------------------------------*/

void Ir_work(void)//紅外鍵值散轉程序
{

TempData[0]=dofly_DuanMa[IRcord[0]/16];
TempData[1]=dofly_DuanMa[IRcord[0]%16];
TempData[2]=dofly_DuanMa[IRcord[1]/16];
TempData[3]=dofly_DuanMa[IRcord[1]%16];
TempData[4]=dofly_DuanMa[IRcord[2]/16];
TempData[5]=dofly_DuanMa[IRcord[2]%16];
TempData[6]=dofly_DuanMa[IRcord[3]/16];
TempData[7]=dofly_DuanMa[IRcord[3]%16];
//Display(0,8); // 調用數碼管掃描
irpro_ok=0;//處理完成標志

}
/*------------------------------------------------
紅外碼值處理
------------------------------------------------*/
void Ircordpro(void)//紅外碼值處理函數
{
unsigned char i, j, k;
unsigned char cord,value;

k=1;
for(i=0;i<4;i++) //處理4個位元組
{
for(j=1;j<=8;j++) //處理1個位元組8位
{
cord=irdata[k];
if(cord>7)//大於某值為1,這個和晶振有絕對關系,這里使用12M計算,此值可以有一定誤差
value|=0x80;
if(j<8)
{
value>>=1;
}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//處理完畢標志位置1
}

/*------------------------------------------------
主函數
------------------------------------------------*/
void main(void)
{
EX0init(); //初始化外部中斷
TIM0init();//初始化定時器
Init_Timer1();

while(1)//主循環
{
if(irok) //如果接收好了進行紅外處理
{
Ircordpro();
irok=0;
}

if(irpro_ok) //如果處理好後進行工作處理,如按對應的按鍵後顯示對應的數字等
{
Ir_work();
}
}
}

51P3^2是外部中斷,紅外接收管接這個引腳就能接收到數據然後顯示在數碼管上

④ 單片機c語言編寫紅外遙控控制小車,按下數字2,小車啟動前進,怎麼寫

紅外遙控小車,關鍵是小車上要有一個紅外接收頭,接收紅外遙控器發送的紅外信號。按下數字2,是單片機板上的按鍵吧,這首先必須要對所用按鍵編碼,小車接收後再解碼,這樣小車才能識別按鍵。至於小車啟動,就發送數字2的編碼即可。下圖是紅外接收頭。

⑤ 紅外遙控器同一個鍵控制一個I/O口,第一次開,第二次關,比如P0^1開啟關閉C語言代碼高手請進。

第一,收到你要的按鍵後,是取反某個位,而不是賦值。如P10=~P10;(建議取個名字)
第二,為了避免一次按鍵,多次觸發,對按鍵值操作後,需要進行清除處理;(即賦值成無效的按鍵值),如 IrValue[2]=0xff;(如果沒有按鍵是 0xff的話)
第三,最正確的做法是,收到遙控後,額外提供一個標志位(如 IR_UpdateFlag),程序識別標志位後,進行按鍵選擇,處理完按鍵後,清除標志位。這樣可以避免程序重復、多餘執行按鍵選擇(雖然是無效的按鍵,但那也是選擇),可以提高系統執行效率!

⑥ 基於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_();
}
}
}

⑦ HT6221紅外遙控C語言

你看看這個文檔http://file.yizimg.com/4677/2009081602263659.pdf或者http://www.51c51.com/mada/ht6221.pdf,裡面有詳細的晶元介紹,解碼程序,不過都是匯編語言的。

⑧ 單片機C語言,紅外線遙控器,長按按鍵一直按下程序該怎樣區分呢

每種協議都是不一樣的,比如是日立的協議吧,就是通常說的一種,長按時發的第一個32位是對應的地址碼,命令碼及其反碼,但是按鍵一直按下時,則每隔固定時間發送的是重復碼,這個重復是固定一組編碼,與你按鍵對應的的地址和命令沒有任何關系,也就是說任何長按的重復碼都是一樣的;
而連續按則不同,按鍵松開後再按,則再次發送對應地址碼,命令碼及其反碼,不發送重復碼。
程序可以根據具體的編碼時序分支處理,若是連續按,則跳入一個分支,否則跳入長按處理,長按裡面判斷很簡單,則將上一次的結果重復一次即可。

⑨ 紅外線遙控器解碼C語言程序代碼 SM0038接受頭

//////////////////////////////////////
//晶振頻率為6MHz 一個機器周期2us //
//實現按鍵地址碼、指令碼的數碼管顯示//
//2010-06-01 //
//////////////////////////////////////
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit la=P2^6;
sbit wela=P2^7;
bit overflag,dataover;//開始接收數據,數據處理完畢

uchar timedata;//定時器0溢出次數
uchar chubus[33];//33Byte數據 timedata組成的數組
uchar jieguos[4];//地址碼,地址反碼,數據碼,數據反碼;

void initial()//初始化
{
IT0=1;EX0=1;//負邊沿觸發

TMOD=0x01;ET0=1;TR0=1;//模式1,十六位定時器
TH0=0xff;TL0=0x06;//0.5ms溢出

EA=1; //開總中斷
}

void time0() interrupt 1//定時器0中斷
{TH0=0xff;TL0=0x06;
timedata++;
}

void ex0() interrupt 0//外部中斷0,接收數據
{
static bit startflag;//開始接收
static uchar i;

if(startflag)
{
if(timedata<32&&timedata>=16) i=0;
chubus[i]=timedata;
timedata=0;
i++;
if(i==33){overflag=1;i=0;}

}
else
{
startflag=1;
timedata=0;
}
}

void chulidata()
{
uchar chubu;//初步數據
uchar jieguo;//結果數據
uchar x,y,z=1;
for(x=0;x<4;x++)//處理四組數據
{
for(y=1;y<=8;y++)//處理一組數據8Byte
{
chubu=chubus[z];
jieguo=jieguo>>1;
if(chubu>3) jieguo=jieguo|0x80;//大於1.5mS為1
z++;
}
jieguos[x]=jieguo;
jieguo=0;
}
dataover=1;

}

void delay(uint z)
{
uint x ,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void display()
{
uchar gao,gao1;
uchar di,di1;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
gao1=table[jieguos[0]/16];
di1=table[jieguos[0]%16];
gao=table[jieguos[2]/16];
di=table[jieguos[2]%16];

la=1;
P0=gao1;
la=0;
P0=0xff;
wela=1;
P0=0x7e;
wela=0;
delay(2);

la=1;
P0=di1;
la=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(2);//地址碼

la=1;
P0=gao;
la=0;
P0=0xff;
wela=1;
P0=0x77;
wela=0;
delay(2);

la=1;
P0=di;
la=0;
P0=0xff;
wela=1;
P0=0x6f;
wela=0;
delay(2);//指令碼

}

void main()
{
initial();//初始化
while(1)
{

if(overflag)//數據接收完畢
{
chulidata();//處理數據,完成標志dataover
overflag=0;
}
if(dataover)
{
display();//數碼管顯示
}
}
}

熱點內容
鍵盤按f9鍵不可以編譯怎麼調 發布:2025-07-18 00:11:34 瀏覽:311
安卓手機的廣告如何刪除 發布:2025-07-18 00:10:50 瀏覽:105
linux安裝composer 發布:2025-07-18 00:04:52 瀏覽:241
地址存儲器的容量 發布:2025-07-17 23:42:56 瀏覽:167
win7電腦用戶名和密碼在哪裡查詢 發布:2025-07-17 23:39:44 瀏覽:476
安卓手機顏色怎麼變色 發布:2025-07-17 23:26:43 瀏覽:375
java離線安裝 發布:2025-07-17 23:23:31 瀏覽:377
位置伺服器地址是什麼 發布:2025-07-17 23:18:00 瀏覽:841
phpif一行 發布:2025-07-17 23:12:27 瀏覽:730
安裝腳本精靈 發布:2025-07-17 23:11:35 瀏覽:127