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

單片機紅外遙控電機

發布時間:2022-07-13 05:51:26

㈠ 求基於51單片機的 紅外遙控電機正反轉程序 要求:P3.2接紅外接收頭 控制兩個電機正反

這是一個紅外解碼程序,解碼後加上switch(IRcord[2])語句,根據解碼值不同,執行不同的電機動作
//使用12M晶振 適用於TC9012晶元,其他晶元請自行更改解碼時序
//夏注:0.56ms脈沖加0.56ms空白為0 ,0.56ms脈沖加3*0.56ms=1.68ms空白為1
//即周期為1.125ms和2.25ms
//無校驗用戶碼及其反碼是否一致
//「1」和「0」的區分取決於脈沖之間的時間,稱之為脈沖位置調制方式(PPM)
//發射端輸出高電平時按圖5的載波波形發送, 頻率:38KHz;周期26.3us 占空比:1/3。
/*.編碼方式 TC9012的一幀數據中含有32位碼,包含兩次8位用戶碼,
8 位數據碼和8 位數據碼的反碼及 最後位的同步位。引導碼由4.5ms的載波和4.5ms的載波關斷波形所構成,以作為用戶碼、
數據碼以及他們的反碼的先導。同步位(SY)是標志最後一位編碼是「0」或「1」的標識位,它只有0.56ms的有載波信號構成。*/
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
////////////////////////////////////////////////
sbit IR=P3^2;//紅外介面標志
//unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
////////////////////////////////////////////
unsigned char irtime;//紅外用全局變數
bit irpro_ok,irok;
unsigned char IRcord[4]; //一次發射有4個編碼值,還是5個 應該是4個,但編號為0-3
unsigned char irdata[33];//一次發射其有33 位
//////////////////////////////////////////////
void Delay(unsigned char mS);
void Ir_work(void);
void Ircordpro(void);
//////////////////////////////////////////////////////////////////
void tim0_isr (void) interrupt 1 using 1
//定時器0中斷服務函數.一次中斷約256us(12M)
//11.0592 時為278us
{
irtime++;
}
///////////////////////////////////////////////////////////////////////
void ex0_isr (void) interrupt 0 using 0//外部中斷0服務函數
//有脈沖時輸出為0,下降沿觸發
{
static unsigned char i;
static bit startflag;
if(startflag)
{

// if(irtime<42&&irtime>=33)//引導碼 TC9012的頭碼9ms,取8.45-10.75ms
if(irtime<39&&irtime>=30)//11.0592M引導碼 TC9012的頭碼9ms,取8.45-10.75ms
i=0;

irdata[i]=irtime;//一次存儲32位電平寬度
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}

else
{irtime=0;startflag=1;}
}
////////////////////////////////////////////////////////////////////
void TIM0init(void)//定時器0初始化
{
TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值,約256US
TH0=0x00;//reload value
TL0=0x00;//initial value
ET0=1;//開中斷
TR0=1;
}
///////////////////////////////////////////////////////////////////
void EX0init(void)
{
IT0 = 1; // Configure interrupt 0 for falling edge(下降沿) on /INT0 (P3.2)
EX0 = 1; // Enable EX0 Interrupt
EA = 1;
}
/****************************************************************/
/******************************************************************/
void Ir_work(void)//紅外鍵值散轉程序
{
//Q=1;
switch(IRcord[2])
{
case 0x8:P0|=0XF0;P0&=0X9F;break;//先關閉第一個電機,再使其正轉,第二個電機狀態不變
case 0x28:P0|=0XF0;P0&=0X6F;break;;//先關閉第一個電機,再使其反轉,第二個電機狀態不變
case 0x22:P0|=0X0F;P0&=0XF9;break;
case 0x50:P0|=0X0F;P0&=0XF6;break;
}
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, 1.792mS
if(cord>6)//大於某值為1,11.0592M
{
value=value|0x80;
}
else
{
value=value;
}
if(j<8)
{
value=value>>1;
}
k++;
}
IRcord[i]=value;
value=0;
} irpro_ok=1;//處理完畢標志位置1

}

/////////////////////////////////////////////////////////////////
void main(void)
{
EX0init(); // Enable Global Interrupt Flag
TIM0init();//初始化定時器0

while(1)//主循環
{
if(irok) //收到9ms引導碼
{
Ircordpro();//碼值處理
irok=0;
}
if(irpro_ok)//step press key
{
Ir_work();//碼值識別散轉
}
}
}

㈡ 51單片機怎麼用紅外遙控小車

檢查看電機是否影響了紅外接收的供電

㈢ 紅外遙控器控制單片機

這個問題你還是自己解決比較好,不要忘了你買單片機學習板的目的是學習,學習單片機是要多實踐的,先試著自己寫,實在寫不出來的時候在發出來問下
這里給你點建議:
電機硬體驅動做成H型橋接電路比較簡單。
遙控器如果不是自帶的,請選用彩電的或是DVD、機頂盒的,不要選用空調的做解碼,空調的編碼是隨模式的變化而變化的。

㈣ 單片機紅外遙控控制步進電機快慢 正反轉

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

#define uchar unsigned char
#define uint unsigned int

sbit IRIN = P3^3; //紅外接收器數據線
sbit BEEP=P0^5;

sbit ml1=P1^2;
sbit ml2=P1^3;
sbit mle=P1^4;

sbit mr1=P1^5;
sbit mr2=P1^6;
sbit mre=P1^7;

void delay(uchar x); //x*0.14MS

uchar IRCOM[7];
uchar count,cml,cmr,t108;

sbit LWE=P3^7;
uchar code LED7Code[]={ 0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
0x77, // A
0x7C, // B
0x39, // C
0x5E, // D
0x79, // E
0x71 // F
};
void LED(uchar w,uchar s)
{
LWE=0;
P2=w;
P0=LED7Code[s];
LWE=1;
delay(5);
LWE=0;
delay(5);
}

void change()
{

switch(IRCOM[2])
{
/*
case 0x45:ml1=0;ml2=1;cml=100;break;
case 0x44:ml1=0;ml2=1;cml=60;break;
case 0x07:ml1=0;ml2=1;cml=30;break;
case 0x16:ml1=0;ml2=0;cml=0;break;
case 0x0c:ml1=1;ml2=0;cml=30;break;
case 0x08:ml1=1;ml2=0;cml=60;break;
case 0x42:ml1=1;ml2=0;cml=100;break;

case 0x47:mr1=0;mr2=1;cmr=100;break;
case 0x43:mr1=0;mr2=1;cmr=60;break;
case 0x09:mr1=0;mr2=1;cmr=30;break;
case 0x0d:mr1=0;mr2=0;cmr=0;break;
case 0x5e:mr1=1;mr2=0;cmr=30;break;
case 0x5a:mr1=1;mr2=0;cmr=60;break;
case 0x4a:mr1=1;mr2=0;cmr=100;break;
*/

case 0x0c:ml1=0;ml2=1;cml=10;
mr1=0;mr2=1;cmr=100;break;
case 0x18:ml1=0;ml2=1;cml=100;
mr1=0;mr2=1;cmr=100;break;
case 0x5e:ml1=0;ml2=1;cml=100;
mr1=0;mr2=1;cmr=10;break;
case 0x08:ml1=1;ml2=0;cml=90;
mr1=0;mr2=1;cmr=90;break;
case 0x5a:ml1=0;ml2=1;cml=90;
mr1=1;mr2=0;cmr=90;break;
case 0x42:ml1=1;ml2=0;cml=10;
mr1=1;mr2=0;cmr=100;break;
case 0x52:ml1=1;ml2=0;cml=100;
mr1=1;mr2=0;cmr=100;break;
case 0x4a:ml1=1;ml2=0;cml=100;
mr1=1;mr2=0;cmr=10;break;
default:break;
}

return;
}

main()
{

IE = 0x86;
TCON = 0x10;

TMOD = 0x02;
TH0 = 0x00;
TL0 = 0x38;

TR0 = 1;

IRIN=1;
BEEP=1;
count=0;
cml=0;
cmr=0;
mr1=0;
mr2=0;
ml1=0;
ml2=0;

t108=0;
delay(100);

while(1)
{

/*
for(t108=0;t108<10;t108++)
{LED(0,IRCOM[0]>>4);
LED(1,IRCOM[0]&0x0F);

LED(2,IRCOM[1]>>4);
LED(3,IRCOM[1]&0x0F);

LED(4,IRCOM[2]>>4);
LED(5,IRCOM[2]&0x0F);

LED(6,IRCOM[3]>>4);
LED(7,IRCOM[3]&0x0F);
}
*/

for(t108=0;t108<250;t108++)delay(4);

cml=0;
cmr=0;
mr1=0;
mr2=0;
ml1=0;
ml2=0;
BEEP=1;
}

}

void IR_IN() interrupt 2 using 0
{
unsigned char j,k,N=0;
delay(35);
if (IRIN==1)return;
while (!IRIN) {delay(1);}

BEEP=0;
N=0;
while (IRIN)
{delay(1);N++;
if(N>50)return;
}

if(N<20){
//2.25ms
t108=0;
while (!IRIN);
IRCOM[0]++;
return;
}

for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN)
{delay(1);}
while (!IRIN)
{delay(1);}
while (IRIN)
{delay(1);
N++;
if (N>=30){return;}
}

IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}
}

if (IRCOM[2]!=~IRCOM[3]){return;}
t108=0;
change();
}

void delay(unsigned char x) //x*0.14MS
{
unsigned char a,b;
while(x--)
{
for(b=3;b>0;b--)
for(a=19;a>0;a--);
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x38;
TL0 = 0x38;
count+=1;
if(count==100)
{count=0;
mle=1;
mre=1;
}

if(count==cml)mle=0;
if(count==cmr)mre=0;
}

我以前寫的一個紅外遙控小車的代碼,PWM調速,PWM是用定時器產生的。

㈤ 單片機如何實現紅外遙控

以下文件是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_();
}
}
}

㈥ 單片機紅外線控制步進電機的方法

不知道你要怎麼控制,估計只是做實驗吧,你可以對紅外遙控器的信號進行解碼,每個按鈕的編碼都不同的,然後你自己去定義哪個按鍵是啟動,哪個按鍵是加速、哪個按鍵是減速,哪個按鍵是停止,等等等等.....

㈦ 單片機的紅外遙控的原理

1、發送端由單片機和紅外發光二極體組成。
單片機控制紅外發光二極體發射38KHz左右的紅外光,這個紅外光就可能起到傳遞信號的作用。你可以在你的程序中規定發射紅外線時表示二進制的一個位『1』無紅外線時表示二進制的『0』。這樣你就可以發出一系列由『1』和『0』所級成的信號。
2、接收端是由紅外接收二極體和單片機組成。
前面我們讓發射端發出信號,現在接收頭就開始收信號。

㈧ STC89C52單片機紅外遙控電機問題

  1. 電機要看你是步進電機還是減速電機,正常減速電機用的多,我就和你說明下減速電機的用法,也稍稍提及下步進電機:

    減速電機:兩個口,一個口接高電平,另一個口接低電平,就可以轉了,要控制方向兩個顛倒即可(所以正常這兩個接單片機的IO口即可,還可以實現調速,下面說明),如果兩個口都接低電平或高電平則不轉(減速比大的減速電機可以實現偽自鎖)

    步進電機:我拿步進電機28BYJ-48 為例子,他有4個信號線,這幾個信號線要給一定的脈沖才會轉,給相反的脈沖順序就反轉,轉過的角度是一組脈沖的360/64(1:64減速比),如果想進一步知道請追問。

  2. 無論減速電機還是步進電機控制方向就利用PWM來進行調速,PWM的實現可以利用軟體的延時函數如1ms的高電平,2ms的低電平來實現,也可以利用定時器精準實現,還可以利用單片機的特定模塊FTM模塊等來實現,根據具體問題是否需要高進度和單片機的實際情況決定。

    PS:要代碼請再追問

㈨ 基於51單片機的紅外遙控直流電機,電機轉起來就停不住了咋回事

電池或搖控器壞了

㈩ 關於51單片機紅外遙控器控制電機的轉速問題

現在解決了嗎,我現在也遇到差不多的問題,風速小的時候控制一切正常,風速大的時候紅外遙控就不起作用了,怎麼解決啊

閱讀全文

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

熱點內容
戰地聯盟3解壓密碼 瀏覽:803
s型命令 瀏覽:23
php年薪5年 瀏覽:67
如何上網上設個人加密賬戶 瀏覽:44
linux打開ssh服務 瀏覽:78
微信位置可以加密嗎 瀏覽:470
演算法蠻力法 瀏覽:438
隨機排練命令 瀏覽:147
python多進程並發 瀏覽:41
安卓軟體安裝如何躲避安全檢測 瀏覽:647
奇幻潮翡翠台源碼百度雲盤 瀏覽:187
什麼軟體可以免費pdf轉word 瀏覽:15
php正則表達式大全 瀏覽:394
androidntp時間 瀏覽:299
輪機長命令簿英文 瀏覽:148
oppo鈴聲設置被加密怎麼處理 瀏覽:548
粵苗app圖形驗證碼怎麼填 瀏覽:899
管家婆架設雲伺服器 瀏覽:254
php的登錄界面代碼 瀏覽:997
php開發客戶端 瀏覽:998