導航:首頁 > 操作系統 > 單片機遙控器設計

單片機遙控器設計

發布時間:2023-03-25 08:50:14

① 用51單片機製作學習型紅外遙控器的原理

以下是程序,調試成功,LCD1602顯示

//本解碼程序適用於NEC的upd6121及其兼容晶元的解碼,支持大多數遙控器實驗板採用11.0592MHZ晶振

#include<reg52.h>//包含單片機寄存器的頭文件

#include<intrins.h>//包含_nop_()函數定義的頭文件

sbitIR=P3^2;//將IR位定義為P3.2引腳

sbitRS=P2^0;//寄存器選擇位,將RS位定義為P2.0引腳

sbitRW=P2^1;//讀寫選擇位,將RW位定義為P2.1引腳

sbitE=P2^2;//使能信號位,將E位定義為P2.2引腳

sbitBF=P0^7;//忙碌標志位,,將BF位定義為P0.7引腳

sbitBEEP=P3^6;//蜂鳴器控制埠P36

unsignedcharflag;

unsignedcharcodestring[]={"1602IR-CODETEST"};

unsignedchara[4];//儲存用戶碼、用戶反碼與鍵數據碼、鍵數據反碼

unsignedintLowTime,HighTime;//儲存高、低電平的寬度

/*****************************************************

函數功能:延時1ms

***************************************************/

voiddelay1ms()

{

unsignedchari,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++)

;

}

/*****************************************************

函數功能:延時若干毫秒

入口參數:n

***************************************************/

voiddelay(unsignedcharn)

{

unsignedchari;

for(i=0;i<n;i++)

delay1ms();

}

/*********************************************************/

voidbeep()//蜂鳴器響一聲函數

{

unsignedchari;

for(i=0;i<100;i++)

{

delay1ms();

BEEP=!BEEP;//BEEP取反

}

BEEP=1;//關閉蜂鳴器

delay(250);//延時

}

/*****************************************************

函數功能:判斷液晶模塊的忙碌狀態

返回值:result。result=1,忙碌;result=0,不忙

***************************************************/

unsignedcharBusyTest(void)

{

bitresult;

RS=0;//根據規定,RS為低電平,RW為高電平時,可以讀狀態

RW=1;

E=1;//E=1,才允許讀寫

_nop_();//空操作

_nop_();

_nop_();

_nop_();//空操作四個機器周期,給硬體反應時間

result=BF;//將忙碌標志電平賦給result

E=0;

returnresult;

}

/*****************************************************

函數功能:將模式設置指令或顯示地址寫入液晶模塊

入口參數:dictate

***************************************************/

voidWriteInstruction(unsignedchardictate)

{

while(BusyTest()==1);//如果忙就等待

RS=0;//根據規定,RS和R/W同時為低電平時,可以寫入指令

RW=0;

E=0;//E置低電平(根據表8-6,寫指令時,E為高脈沖,

//就是讓E從0到1發生正跳變,所以應先置"0"

_nop_();

_nop_();//空操作兩個機器周期,給硬體反應時間

P0=dictate;//將數據送入P0口,即寫入指令或地址

_nop_();

_nop_();

_nop_();

_nop_();//空操作四個機器周期,給硬體反應時間

E=1;//E置高電平

_nop_();

_nop_();

_nop_();

_nop_();//空操作四個機器周期,給硬體反應時間

E=0;//當E由高電平跳變成低電平時,液晶模塊開始執行命令

}

/*****************************************************

函數功能:指定字元顯示的實際地址

入口參數:x

***************************************************/

voidWriteAddress(unsignedcharx)

{

WriteInstruction(x|0x80);//顯示位置的確定方法規定為"80H+地址碼x"

}

/*****************************************************

函數功能:將數據(字元的標准ASCII碼)寫入液晶模塊

入口參數:y(為字元常量)

***************************************************/

voidWriteData(unsignedchary)

{

while(BusyTest()==1);

RS=1;//RS為高電平,RW為低電平時,可以寫入數據

RW=0;

E=0;//E置低電平(根據表8-6,寫指令時,E為高脈沖,

//就是讓E從0到1發生正跳變,所以應先置"0"

P0=y;//將數據送入P0口,即將數據寫入液晶模塊

_nop_();

_nop_();

_nop_();

_nop_();//空操作四個機器周期,給硬體反應時間

E=1;//E置高電平

_nop_();

_nop_();

_nop_();

_nop_();//空操作四個機器周期,給硬體反應時間

E=0;//當E由高電平跳變成低電平時,液晶模塊開始執行命令

}

/*****************************************************

函數功能:對LCD的顯示模式進行初始化設置

***************************************************/

voidLcdInitiate(void)

{

delay(15);//延時15ms,首次寫指令時應給LCD一段較長的反應時間

WriteInstruction(0x38);//顯示模式設置:16×2顯示,5×7點陣,8位數據介面

delay(5);//延時5ms

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x0C);//顯示模式設置:顯示開,有游標,游標閃爍

delay(5);

WriteInstruction(0x06);//顯示模式設置:游標右移,字元不移

delay(5);

WriteInstruction(0x01);//清屏幕指令,將以前的顯示內容清除

delay(5);

}

/************************************************************

函數功能:對4個位元組的用戶碼和鍵數據碼進行解碼

說明:解碼正確,返回1,否則返回0

出口參數:dat

*************************************************************/

bitDeCode(void)

{

unsignedchari,j;

unsignedchartemp;//儲存解碼出的數據

for(i=0;i<4;i++)//連續讀取4個用戶碼和鍵數據碼

{

for(j=0;j<8;j++)//每個碼有8位數字

{

temp=temp>>1;//temp中的各數據位右移一位,因為先讀出的是高位數據

TH0=0;//定時器清0

TL0=0;//定時器清0

TR0=1;//開啟定時器T0

while(IR==0)//如果是低電平就等待

;//低電平計時

TR0=0;//關閉定時器T0

LowTime=TH0*256+TL0;//保存低電平寬度

TH0=0;//定時器清0

TL0=0;//定時器清0

TR0=1;//開啟定時器T0

while(IR==1)//如果是高電平就等待

;

TR0=0;//關閉定時器T0

HighTime=TH0*256+TL0;//保存高電平寬度

if((LowTime<370)||(LowTime>640))

return0;//如果低電平長度不在合理范圍,則認為出錯,停止解碼

if((HighTime>420)&&(HighTime<620))//如果高電平時間在560微秒左右,即計數560/1.085=516次

temp=temp&0x7f;//(520-100=420,520+100=620),則該位是0

if((HighTime>1300)&&(HighTime<1800))//如果高電平時間在1680微秒左右,即計數1680/1.085=1548次

temp=temp|0x80;//(1550-250=1300,1550+250=1800),則該位是1

}

a[i]=temp;//將解碼出的位元組值儲存在a[i]

}

if(a[2]=~a[3])//驗證鍵數據碼和其反碼是否相等,一般情況下不必驗證用戶碼

return1;//解碼正確,返回1

}

/*------------------二進制碼轉換為壓縮型BCD碼,並顯示---------------*/

voidtwo_2_bcd(unsignedchardate)

{

unsignedchartemp;

temp=date;

date&=0xf0;

date>>=4;//右移四位得到高四位碼

date&=0x0f;//與0x0f想與確保高四位為0

if(date<=0x09)

{

WriteData(0x30+date);//lcd顯示鍵值高四位

}

else

{

date=date-0x09;

WriteData(0x40+date);

}

date=temp;

date&=0x0f;

if(date<=0x09)

{

WriteData(0x30+date);//lcd顯示低四位值

}

else

{

date=date-0x09;

WriteData(0x40+date);

}

WriteData(0x48);//顯示字元'H'

}

/************************************************************

函數功能:1602LCD顯示

*************************************************************/

voidDisp(void)

{

WriteAddress(0x40);//設置顯示位置為第一行的第1個字

two_2_bcd(a[0]);

WriteData(0x20);

two_2_bcd(a[1]);

WriteData(0x20);

two_2_bcd(a[2]);

WriteData(0x20);

two_2_bcd(a[3]);

}

/************************************************************

函數功能:主函數

*************************************************************/

voidmain()

{

unsignedchari;

LcdInitiate();//調用LCD初始化函數

delay(10);

WriteInstruction(0x01);//清顯示:清屏幕指令

WriteAddress(0x00);//設置顯示位置為第一行的第1個字

i=0;

while(string[i]!='')//''是數組結束標志

{//顯示字元WWW.RICHMCU.COM

WriteData(string[i]);

i++;

}

EA=1;//開啟總中斷

EX0=1;//開外中斷0

ET0=1;//定時器T0中斷允許

IT0=1;//外中斷的下降沿觸發

TMOD=0x01;//使用定時器T0的模式1

TR0=0;//定時器T0關閉

while(1);//等待紅外信號產生的中斷

}

/************************************************************

函數功能:紅外線觸發的外中斷處理函數

*************************************************************/

voidInt0(void)interrupt0

{

EX0=0;//關閉外中斷0,不再接收二次紅外信號的中斷,只解碼當前紅外信號

TH0=0;//定時器T0的高8位清0

TL0=0;//定時器T0的低8位清0

TR0=1;//開啟定時器T0

while(IR==0);//如果是低電平就等待,給引導碼低電平計時

TR0=0;//關閉定時器T0

LowTime=TH0*256+TL0;//保存低電平時間

TH0=0;//定時器T0的高8位清0

TL0=0;//定時器T0的低8位清0

TR0=1;//開啟定時器T0

while(IR==1);//如果是高電平就等待,給引導碼高電平計時

TR0=0;//關閉定時器T0

HighTime=TH0*256+TL0;//保存引導碼的高電平長度

if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))

{

//如果是引導碼,就開始解碼,否則放棄,引導碼的低電平計時

//次數=9000us/1.085=8294,判斷區間:8300-500=7800,8300+500=8800.

if(DeCode()==1)//執行遙控解碼功能

{

Disp();//調用1602LCD顯示函數

beep();//蜂鳴器響一聲提示解碼成功

}

}

EX0=1;//開啟外中斷EX0

}

② 我想要用單片機來實現控制遙控車,思路是這樣:我已經買了一個遙控玩具汽車,有一個遙控器可以控制..

想法不錯,但是你得先去了解中國遙控器是怎樣工作的;
就是說是另做一個遙控器更合理,還是只能在此遙控器上進行改進;
至於是否需要單片機,那是後話;

③ 基於stc單片機無線遙控器硬體設計

控制端:單片機+無線模塊+按鍵,被控制端:單片機+無線模塊+控制執行器件。

④ 求一個單片機紅外遙控器控制設計的源程序

程序太長,須仔細研究。

#definemain_GLOBALS

#include<reg51.h>
#include"main.h"
#include"SAA3010.h"

unsignedcharcounter;
unsignedchartemp;

sbitP2_0=0xA0;
sbitP2_1=0xA1;
sbitP2_2=0xA2;
sbitP2_3=0xA3;

voiddecode_init(void)
{
load_code_detected=0;
repeat_code_detected=0;
decode_error=0;
temp1=0;
temp2=0;
temp3=0;
temp4=0;
TH1=0;
TL1=0;
TR1=0;
}

voidmain(void)
{
EX0=1;
IT0=1;
TMOD=0x11;
ET0=1;
TH0=128;
TL0=0;
TR0=1;
P0=0;


TH1=0;
TL1=0;
decode_init();
EA=1;
counter=0;
data_available=0;
while(1)
{
if(data_available==1)
{

if(key_code==01)//display"1"
{
P2_0=0;//選中四個數碼管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0xf9;
}

if(key_code==0x02)//display"2"
{
P2_0=0;//選中四個數碼管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0xa4;
}

if(key_code==0x03)//display"3"
{
P2_0=0;//選中四個數碼管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0xb0;
}

if(key_code==0x04)//display"4"
{
P2_0=0;//選中四個數碼管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0x99;
}

if(key_code==0x05)//display"5"
{
P2_0=0;//選中四個數碼管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0x92;
}

if(key_code==0x06)//display"6"
{
P2_0=0;//選中四個數碼管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0x82;
}

if(key_code==0x07)//display"7"
{
P2_0=0;//選中四個數碼管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0xf8;
}

if(key_code==0x08)//display"8"
{
P2_0=0;//選中四個數碼管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0x80;
}

if(key_code==0x09)//display"9"
{
P2_0=0;//選中四個數碼管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0x90;
}

if(key_code==0x00)//display"0"
{
P2_0=0;//選中四個數碼管
P2_1=0;
P2_2=0;
P2_3=0;
P0=0xc0;
}
data_available=0;
}
}
}
//**********************************************************************************************************************
voidkey_isr(void)interrupt0
{
EX0=0;//立即關閉外部中斷,轉為查詢方式解碼
led=0;//開LED表示收到紅外信號

temp=SAA3010_decode();//解碼
if(temp==1)gotokey_isr_exit;
counter=0;
key_isr_exit:
decode_init();
led=1;
EX0=1;
}

voidTimer0_isr(void)interrupt1
{
counter++;
if(counter>3)
{
if(led==0)led=1;
counter=0;
}
ET0=1;
}

#defineSAA3010_GLOBALS
#include<reg51.h>
#include"SAA3010.h"
#include"main.h"


//===========================================================================================================
//該函數的作用是每調用一次就在temp1-4組成的32bit長度的最低位上移入
//一個0或者1,數據由bitdata確定
voidSAA3010_cycle_data(unsignedcharbitdata)
{
temp4=temp4<<1;
if((temp3&0x80)==1)temp4=temp4|0x01;
elsetemp4=temp4&0xfe;

temp3=temp3<<1;
if((temp2&0x80)==1)temp3=temp3|0x01;
elsetemp3=temp3&0xfe;

temp2=temp2<<1;
if((temp1&0x80)==1)temp2=temp2|0x01;
elsetemp2=temp2&0xfe;

temp1=temp1<<1;
if(bitdata==1)temp1=temp1|0x01;
elsetemp1=temp1&0xfe;
}

//===========================================================================================================
//解碼出錯返回1,對則返回0
unsignedcharSAA3010_decode(void)
{
//-----------------------------------------------------------------------------------------------------------
unsignedcharcount=0;

TR1=1;//啟動計時
while(1)
{
while(ir_receive==0);//等待電平變高,不需要超時監測
TR1=0;//高電平(對發射電路而言)測試結束
high_level_time=TH1*256+TL1;//記錄高電平的數據
//-----------------------------------------------------------------------------------------------------------
TH1=0; TL1=0;TR1=1;//啟動對低電平的測試
//-----------------------------------------------------------------------------------------------------------
//處理低電平
if((high_level_time<750)||(high_level_time>1800))return1;//不是合格的電平
if((high_level_time>750)&&(high_level_time<1000)){SAA3010_cycle_data(0);count+=1;}//移入一個0
if((high_level_time>1500)&&(high_level_time<1800)){SAA3010_cycle_data(0);SAA3010_cycle_data(0);count+=2;}//移入兩個0

while(ir_receive==1)//等待電平變低
{
if(TH1>0x08)break;//高電平超時,正常情況下是測試結束,異常時則是出錯
}

TR1=0;//低電平(對發射電路而言)測試結束
if(TH1>0x08){break;}
low_level_time=TH1*256+TL1;//保存低電平的數據

TH1=0; TL1=0; TR1=1; //為增加計時的准確性,數據的處理都是在計時過程里
//-----------------------------------------------------------------------------------------------------------
//處理高電平
if((low_level_time<750)||(low_level_time>1800))return1;//不是合格的電平
if((low_level_time>750)&&(low_level_time<1000)){SAA3010_cycle_data(1);count+=1;}//移入一個0
if((low_level_time>1500)&&(low_level_time<1800)){SAA3010_cycle_data(1);SAA3010_cycle_data(1);count+=2;}//移入兩個0
}

if(count==26){SAA3010_cycle_data(1);count++;}
if(count!=27)return1;
led=0;

//提取按健信息
key_code=0;
if((temp1>>1)&0x01)key_code=key_code|0x01;
elsekey_code=key_code&0xfe;
if((temp1>>3)&0x01)key_code=key_code|0x02;
elsekey_code=key_code&0xfd;
if((temp1>>5)&0x01)key_code=key_code|0x04;
elsekey_code=key_code&0xfb;
if((temp1>>7)&0x01)key_code=key_code|0x08;
elsekey_code=key_code&0xf7;
if((temp2>>1)&0x01)key_code=key_code|0x10;
elsekey_code=key_code&0xef;
if((temp2>>3)&0x01)key_code=key_code|0x20;
elsekey_code=key_code&0xdf;

//提取系統信息
sys_code=0;
if((temp2>>5)&0x01)sys_code=sys_code|0x01;
elsesys_code=sys_code&0xfe;
if((temp2>>7)&0x01)sys_code=sys_code|0x02;
elsesys_code=sys_code&0xfd;

if((temp3>>1)&0x01)sys_code=sys_code|0x04;
elsesys_code=sys_code&0xfb;
if((temp3>>3)&0x01)sys_code=sys_code|0x08;
elsesys_code=sys_code&0xf7;
if((temp3>>5)&0x01)sys_code=sys_code|0x10;
elsesys_code=sys_code&0xef;
if((temp3>>7)&0x01)sys_code=sys_code|0x20;
elsesys_code=sys_code&0xdf;

data_available=1;
return0;
}
//===========================================================================================================

⑤ 關於單片機設計萬能電視遙控器對碼 萬能遙控器的對碼是怎麼對的,輸入電視型號編碼之後怎麼實現控制

萬能電視遙控器,其實是一個 在裡面搜集了 他列出的所有 電視遙控器的 編碼,在使用時 按腔猜照編碼 的排列 一個一個 的與 所使用的 電視機 比對其中的 一個特徵碼(如音量+),如果電視機 有反應後 確定使用這一組 編碼。
所謂 代碼表(比如TCL 001)就是一組 各個鍵 編碼數據,如果你搜集電視型號 越多 那麼你的代碼表 的數據越多。
或者 你可以 在市場上 買一個萬能電視遙控器,把所有電視機的 遙控編碼 讀出來,加以利用
當然 你自己團圓裂 做的成本 肯定 比買 要貴,因為人家已塌閉經是大批量的生產。

⑥ 求幫忙做畢業設計,題目《基於單片機的電器遙控器設計》,我已經寫了一些 但是有些地方不會弄,求高手幫忙

紅外的遙控可以嗎?

⑦ 基於單片機的紅外遙控收發系統的設計與實現

紅外遙控一般採用38KHz載波

⑧ 基於單片機的空調遙控器設計。。。。用什麼型號的單片機好呢。。

Proteus 我不會,所以哪個可以在Proteus 上模擬我不清楚
但是遙控器確實很簡單,特別是空調的遙控器.
硬體上大概7,8個按鍵,一個晶振,一個單片機,一個紅外發射管,一個電池盒(4節電池的那種),一個三端穩壓器,加上幾個電阻電容就行了.
通信協議到網上查,你要控制哪個牌子的空調,就查他的遙控器通信協議.
單片機隨便選,最簡單最原始的89S2051就足夠了,你要是想功能再多點選89S51,要是想速度再快點可以選C8051F340,這三種都是51內核的單片機,很容易上手.
做遙控器的難點不是實現功能,而是控制功耗.待機時間不能太短.

⑨ 基於單片機遙控器

既然知道航模遙控器,思路也很對,那不就夠了嗎?還要什麼意模埋塵見?

還是說,你壓根液指只是知道有航模遙控器這么個東西,沒有實際接觸過?就旦禪算正規的航模遙控器沒接觸過,玩具的總該見過吧?

閱讀全文

與單片機遙控器設計相關的資料

熱點內容
鴻蒙加密等級 瀏覽: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 瀏覽:499