當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] /*************功能說明**************紅外接收程序。適用于市場上用量最大的HT6121/6122及其兼容IC的編碼。對(duì)于用戶碼與User_code定義不同的遙控器,程序會(huì)將用戶碼一起從串口輸出。使用模擬串口發(fā)送監(jiān)

/*************功能說明**************

紅外接收程序。適用于市場上用量最大的HT6121/6122及其兼容IC的編碼。

對(duì)于用戶碼與User_code定義不同的遙控器,程序會(huì)將用戶碼一起從串口輸出。

使用模擬串口發(fā)送監(jiān)控顯示編碼,顯示內(nèi)容為ASCII碼和中文。

本接收程序基于狀態(tài)機(jī)的方式,占用CPU的時(shí)間非常少。

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


/*************用戶系統(tǒng)配置**************/

#defineMAIN_Fosc12000000L//定義主時(shí)鐘,模擬串口和紅外接收會(huì)自動(dòng)適應(yīng)。5~36MHz

#defineD_TIMER0125//選擇定時(shí)器時(shí)間,us,紅外接收要求在60us~250us之間

#defineUser_code0xFD02//定義紅外接收用戶碼


/*************以下宏定義用戶請(qǐng)勿修改**************/
#include"reg51.H"
#defineucharunsignedchar
#defineuintunsignedint

#definefreq_base(MAIN_Fosc/1200)
#defineTimer0_Reload(65536-(D_TIMER0*freq_base/10000))




/*************本地常量聲明**************/



/*************本地變量聲明**************/
sbitP_TXD1=P3^1;//定義模擬串口發(fā)送腳,打印信息用
sbitP_IR_RX=P0^1;//定義紅外接收輸入端口

bitP_IR_RX_temp;//Lastsample
bitB_IR_Sync;//已收到同步標(biāo)志
ucharIR_SampleCnt;//采樣計(jì)數(shù)
ucharIR_BitCnt;//編碼位數(shù)
ucharIR_UserH;//用戶碼(地址)高字節(jié)
ucharIR_UserL;//用戶碼(地址)低字節(jié)
ucharIR_data;//數(shù)據(jù)原碼
ucharIR_DataShit;//數(shù)據(jù)反碼

bitB_IrUserErr;//Usercodeerrorflag
bitB_IR_Press;//Keypressflag,includerepeatkey.
ucharIR_code;//IRcode紅外鍵碼


/*************本地函數(shù)聲明**************/
voidTx1Send(uchardat);
ucharHEX2ASCII(uchardat);
voidInitTimer(void);
voidPrintString(unsignedcharcode*puts);



/*************外部函數(shù)和變量聲明*****************/



/*********************主函數(shù)*************************/
voidmain(void)
{
InitTimer();//初始化Timer

PrintString("******STC系列MCU紅外接收程序2010-12-10******rn");//上電后串口發(fā)送一條提示信息

while(1)
{
if(B_IR_Press)//有IR鍵按下
{
PrintString("紅外碼:0x");//提示紅外鍵碼
Tx1Send(HEX2ASCII(IR_code>>4));//鍵碼高半字節(jié)
Tx1Send(HEX2ASCII(IR_code));//鍵碼低半字節(jié)
if(B_IrUserErr)//用戶碼錯(cuò)誤,則發(fā)送用戶碼
{
Tx1Send(’’);//發(fā)空格
Tx1Send(’’);//發(fā)空格
PrintString("用戶碼:0x");//提示用戶碼
Tx1Send(HEX2ASCII(IR_UserH>>4));//用戶碼高字節(jié)的高半字節(jié)
Tx1Send(HEX2ASCII(IR_UserH));//用戶碼高字節(jié)的低半字節(jié)
Tx1Send(HEX2ASCII(IR_UserL>>4));//用戶碼低字節(jié)的高半字節(jié)
Tx1Send(HEX2ASCII(IR_UserL));//用戶碼低字節(jié)的低半字節(jié)
}
Tx1Send(0x0d);//發(fā)回車
Tx1Send(0x0a);//發(fā)回車
B_IR_Press=0;//清除IR鍵按下標(biāo)志
}
}
}


/*********************十六進(jìn)制轉(zhuǎn)ASCII函數(shù)*************************/
ucharHEX2ASCII(uchardat)
{
dat&=0x0f;
if(dat<=9)return(dat+’0’);//數(shù)字0~9
return(dat-10+’A’);//字母A~F
}




//*******************************************************************
//***********************IRRemoteModule**************************

//***********************IRRemoteModule**************************
//thisprogrammeisusedforReceiveIRRemote(HT6121).

//dataformat:Synchro,AddressH,AddressL,data,/data,(total32bit).

//sendaframe(85ms),pause23ms,sendsynchroofanotherframe,pause94ms

//datarate:108ms/Frame


//Synchro:low=9ms,high=4.5/2.25ms,low=0.5626ms
//Bit0:high=0.5626ms,low=0.5626ms
//Bit1:high=1.6879ms,low=0.5626ms
//framesPACe=23msor96ms

/********************紅外采樣時(shí)間宏定義,用戶不要隨意修改*******************/

#if((D_TIMER0<=250)&&(D_TIMER0>=60))
#defineD_IR_sampleD_TIMER0//定義采樣時(shí)間,在60us~250us之間
#endif

#defineD_IR_SYNC_MAX(15000/D_IR_sample)//SYNCmaxtime
#defineD_IR_SYNC_MIN(9700/D_IR_sample)//SYNCmintime
#defineD_IR_SYNC_DIVIDE(12375/D_IR_sample)//decidedata0or1
#defineD_IR_DATA_MAX(3000/D_IR_sample)//datamaxtime
#defineD_IR_DATA_MIN(600/D_IR_sample)//datamintime
#defineD_IR_DATA_DIVIDE(1687/D_IR_sample)//decidedata0or1
#defineD_IR_BIT_NUMBER32//bitnumber

//*******************************************************************************************
//****************************IRRECEIVEMODULE********************************************

voidIR_RX_HT6121(void)
{
ucharSampleTime;

IR_SampleCnt++;//Sample+1

F0=P_IR_RX_temp;//SaveLastsamplestatus
P_IR_RX_temp=P_IR_RX;//Readcurrentstatus
if(F0&&!P_IR_RX_temp)//Lastsampleishigh,andcurrentsampleislow,soisfalledge
{
SampleTime=IR_SampleCnt;//getthesampletime
IR_SampleCnt=0;//Clearthesamplecounter

if(SampleTime>D_IR_SYNC_MAX)B_IR_Sync=0;//largetheMaximSYNCtime,thenerror
elseif(SampleTime>=D_IR_SYNC_MIN)//SYNC
{
if(SampleTime>=D_IR_SYNC_DIVIDE)
{
B_IR_Sync=1;//hasreceivedSYNC
IR_BitCnt=D_IR_BIT_NUMBER;//Loadbitnumber
}
}
elseif(B_IR_Sync)//hasreceivedSYNC
{
if(SampleTime>D_IR_DATA_MAX)B_IR_Sync=0;//datasamlpetimetolarge
else
{
IR_DataShit>>=1;//datashiftright1bit
if(SampleTime>=D_IR_DATA_DIVIDE)IR_DataShit|=0x80;//devidedata0or1
if(--IR_BitCnt==0)//bitnumberisover?
{
B_IR_Sync=0;//ClearSYNC
if(~IR_DataShit==IR_data)//判斷數(shù)據(jù)正反碼
{
if((IR_UserH==(User_code/256))&&
IR_UserL==(User_code%256))
B_IrUserErr=0;//Usercodeisrighe
elseB_IrUserErr=1;//usercodeiswrong

IR_code=IR_data;
B_IR_Press=1;//數(shù)據(jù)有效
}
}
elseif((IR_BitCnt&7)==0)//onebytereceive
{
IR_UserL=IR_UserH;//SavetheUsercodehighbyte
IR_UserH=IR_data;//SavetheUsercodelowbyte
IR_data=IR_DataShit;//SavetheIRdatabyte
}
}
}
}
}


/****************Timer初始化函數(shù)******************************/
voidInitTimer(void)
{
TMOD=0;//forSTC15Fxxx系列Timer0as16bitreloadtimer.
TH0=Timer0_Reload/256;
TL0=Timer0_Reload%256;
ET0=1;
TR0=1;

EA=1;
}


/**********************Timer0中斷函數(shù)************************/
voidtimer0(void)interrupt1
{
IR_RX_HT6121();
}


/**********************模擬串口相關(guān)函數(shù)************************/

voidBitTime(void)//位時(shí)間函數(shù)
{
uinti;
i=((MAIN_Fosc/100)*104)/140000-1;//根據(jù)主時(shí)鐘來計(jì)算位時(shí)間
while(--i);
}

//模擬串口發(fā)送
voidTx1Send(uchardat)//9600,N,8,1發(fā)送一個(gè)字節(jié)
{
uchari;
EA=0;
P_TXD1=0;
BitTime();
for(i=0;i<8;i++)
{
if(dat&1)P_TXD1=1;
elseP_TXD1=0;
dat>>=1;
BitTime();
}
P_TXD1=1;
EA=1;
BitTime();
BitTime();
}

voidPrintString(unsignedcharcode*puts)//發(fā)送一串字符串
{
for(;*puts!=0;puts++)Tx1Send(*puts);//遇到停止符0結(jié)束
}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉