《單片機技術(shù)》課件項目十一 紅外遙控器設(shè)計_第1頁
《單片機技術(shù)》課件項目十一 紅外遙控器設(shè)計_第2頁
《單片機技術(shù)》課件項目十一 紅外遙控器設(shè)計_第3頁
《單片機技術(shù)》課件項目十一 紅外遙控器設(shè)計_第4頁
《單片機技術(shù)》課件項目十一 紅外遙控器設(shè)計_第5頁
已閱讀5頁,還剩97頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

一、學(xué)習(xí)目標1.了解紅外線工作原理。2.掌握SONYSIRC協(xié)議。3.掌握NEC紅外遙控協(xié)議。4.掌握遙控器開發(fā)調(diào)試方法。二、學(xué)習(xí)任務(wù)

隨著信息產(chǎn)業(yè)的高速發(fā)展,傳統(tǒng)的遙控技術(shù)已經(jīng)不能滿足人民日益增長的物質(zhì)文化的需要。采用超聲波、電磁波作為傳輸媒介的傳統(tǒng)無線遙控裝置具有易受干擾、攜帶的信息量少等缺點。作為一種簡便的無線通信技術(shù),紅外遙控通信在電子設(shè)備中具有廣泛的應(yīng)用價值,它具有無須專門申請?zhí)囟l率的使用執(zhí)照;具有移動通信設(shè)備所必需的體積小、功率低的特點;傳輸速率適合于家庭和辦公室使用的網(wǎng)絡(luò);信號無干擾,傳輸準確度高;成本低廉。本項目任務(wù)分解為具體2個學(xué)習(xí)任務(wù):任務(wù)一SONYSIRC遙控器設(shè)計;任務(wù)二NEC遙控器設(shè)計。三、任務(wù)分解任務(wù)一SONYSIRC遙控器設(shè)計【任務(wù)描述】使用SONYSIRC協(xié)議,實現(xiàn)單片機按鍵發(fā)信息給紅外頭,然后接收顯示出來。AT89C2051單片機負責(zé)發(fā)送紅外,AT89C51單片機負責(zé)接收紅外并顯示出來。AT89C2051單片機P1口接8個按鍵,按下的鍵值通過單片機發(fā)給紅外發(fā)射頭,AT89C51將接收到的紅外編碼用數(shù)碼管顯示出來。【任務(wù)分析】熟悉紅外線工作基本原理,紅外遙控器的硬件構(gòu)成以及學(xué)習(xí)單片機驅(qū)動紅外頭的方法?!鞠嚓P(guān)知識】1.紅外線通信基礎(chǔ)紅外線的特點人的眼睛能看到的可見光,若按波長排列,依次(從長到短)為紅、橙、黃、綠、青、藍、紫,紅光的波長范圍為0.62μm~0.7μm,比紅光波長還長的光叫紅外線。紅外線遙控器就是利用波長0.76μm~1.5μm之間的近紅外線來傳送控制信號的。一、紅外線通信概述2.紅外遙控器的協(xié)議鑒于家用電器的品種多樣化和用戶的使用特點,生產(chǎn)廠家對紅外遙控器進行了嚴格的規(guī)范編碼,這些編碼各不相同,從而形成不同的編碼方式,統(tǒng)一稱為紅外遙控器編碼傳輸協(xié)議。了解這些編碼協(xié)議的原理,不僅對學(xué)習(xí)和應(yīng)用紅外遙控器是必備的知識,同時也對學(xué)習(xí)射頻(一般大于300MHz)無線遙控器的工作原理有很大的幫助。到目前為止,常見的紅外遙控協(xié)議已多達幾十種,如:RC5、SIRCS、Sony、RECS80、Denon、NEC、Motorola、Japanese、SAMSWNG和Daewoo等。我國家用電器的紅外遙控器的生產(chǎn)廠家,其編碼方式多數(shù)是按上述的各種協(xié)議進行編碼的,而用得較多的有NEC協(xié)議。3.紅外遙控器的結(jié)構(gòu)特征紅外LED(發(fā)光二極管),其外形和普通發(fā)光二極管LED相似,如圖所示,紅外線就是通過紅外發(fā)光二極管發(fā)射出去。管壓降約1.4v,工作電流一般小于20mA。為了適應(yīng)不同的工作電壓,回路中常常串有限流電阻。紅外發(fā)光二極管工作時通常會以特定的頻率(如:40kHz)閃爍,需要發(fā)送的信息就是通過這個特定頻率的載波發(fā)送出去。紅外線接收頭的種類很多,引腳定義也不相同,一般都有三個引腳,如圖所示,包括供電腳,接地和信號輸出腳。根據(jù)發(fā)射端調(diào)制載波的不同應(yīng)選用相應(yīng)解調(diào)頻率的接收頭。二、SONYSIRC協(xié)議詳細介紹SIRC協(xié)議有三個版本,分別為12位、15位及20位版本。這里重點接收一下12位的版本。12位編碼中的高5位為地址編碼,低7位為命令編碼,所使用的載波頻率為40Khz

.其中地址編碼(例如TV、VCR)與命令編碼(例如+頻道、—音量等)是預(yù)定義的。SIRC協(xié)議使用脈寬調(diào)制(PulseWidthModulation),由圖可知,邏輯“1”、“0”分別用1.2ms和600us的載波脈沖寬度表示,如圖11-6所示,載波脈沖之間用600us的固定空閑周期分隔。SRIC紅外數(shù)據(jù)信號格式如圖所示,在發(fā)送12位編碼時,SIRC協(xié)議以24ms的脈沖寬度信號作為起始信號,隨后是600us的標準空閑間隔周期,接下來再發(fā)送7位命令與5位地址,且都是從低位開始發(fā)送。發(fā)送的是命令碼19(0010011)和地址碼1(00001)。接下來發(fā)信息碼,1.2ms載波脈沖寬度表示邏輯“1”,0.6ms載波脈沖寬度表示邏輯“0”,載波脈沖之間用0.6ms的固定空閑周期進行分隔?!救蝿?wù)實施】SRIC發(fā)送與接收電路對應(yīng)的發(fā)射程序如下:

//-----------------------------------------------------------------//名稱:紅外遙控仿真發(fā)射器//-----------------------------------------------------------------//說明:本例運行時,按鍵鍵值以40KHz紅外線載波發(fā)射出去,所模擬的載波// 數(shù)據(jù)格式符合索尼紅外遙控編碼格式(SIRC). ////-----------------------------------------------------------------#defineINT8Uunsignedchar#defineINT16Uunsignedint#defineINT32Uunsignedlong#include<reg51.h>#include<intrins.h>#include<stdio.h>sbitIRLED=P3^2; //紅外發(fā)射管定義sbitBEEP=P3^7; //蜂鳴器定義#defineKEY_INP1 //按鍵輸入端口定義#definedelay12us() {_nop_();_nop_();_nop_();_nop_();} //-----------------------------------------------------------------//延時函數(shù)(us)//-----------------------------------------------------------------voiddelay_us(INT8Ux){while(--x);}voiddelay600us(void)//誤差0us{unsignedchara,b;for(b=119;b>0;b--)for(a=1;a>0;a--);}//按鍵用延時程序

voidDelay10ms(unsignedintc)//誤差0usC=1就為10ms{unsignedchara,b;for(;c>0;c--){for(b=38;b>0;b--){for(a=130;a>0;a--);}}}//按鍵掃描程序unsignedcharKey_Scan()//掃描鍵盤{unsignedcharkeyValue=0,i;//保存鍵值

//--檢測按鍵1--//if(KEY_IN!=0xFF)//檢測按鍵K1是否按下

{Delay10ms(1);//消除抖動

if(KEY_IN!=0xFF)//再次檢測按鍵是否按下

{keyValue=KEY_IN;i=0;while((i<50)&&(KEY_IN!=0xFF))//檢測按鍵是否松開

{Delay10ms(1);i++;}}}returnkeyValue;//將讀取到鍵值的值返回}//輸出提示音//-----------------------------------------------------------------voidSounder(){ INT8Ui;for(i=0;i<200;i++){BEEP=~BEEP;delay_us(240);}}//-----------------------------------------------------------------//發(fā)送N倍的600us載波(1/40K/2約等于12us)//-----------------------------------------------------------------voidEmit_IR_Carrier_Nx600us(INT8UN){INT16Ui;for(i=0;i<N*50;i++){delay12us();IRLED=~IRLED;}}//-----------------------------------------------------------------//發(fā)送12位數(shù)據(jù)//-----------------------------------------------------------------voidEmit_D12(INT16UD12){INT16Ui;Emit_IR_Carrier_Nx600us(4);//輸出2.4ms起始信號IRLED=0;delay600us();//起始信號其后的600us低電平//for(i=0x01;i<=0x0800;i<<=1)for(i=0x01;i<=0x1000;i<<=1){if(D12&i)Emit_IR_Carrier_Nx600us(2);//輸出1.2ms載波elseEmit_IR_Carrier_Nx600us(1);//輸出0.6ms載波IRLED=0;delay600us();//其后的600us低電平

}}//-----------------------------------------------------------------//主程序//-----------------------------------------------------------------voidmain(){unsignedcharkeyNum;IRLED=0;while(1){ keyNum=Key_Scan();//掃描鍵盤

switch(keyNum){case(0xFE)://返回按鍵K1的數(shù)據(jù)

Emit_D12(0x509);//信息碼+地址位一共十二位,發(fā)送編碼509 Sounder();break;case(0xFD)://返回按鍵K2的數(shù)據(jù)Emit_D12(0x334); Sounder();break;case(0xFB)://返回按鍵K3的數(shù)據(jù)

Emit_D12(0x556); Sounder();break;case(0xF7)://返回按鍵K4的數(shù)據(jù)

Emit_D12(0x778); Sounder();break;case(0xEF)://返回按鍵K5的數(shù)據(jù)

Emit_D12(0x9AA); Sounder();break;

case(0xDF)://返回按鍵K6的數(shù)據(jù)

Emit_D12(0xFCC); Sounder();break;case(0xBF)://返回按鍵K7的數(shù)據(jù)Emit_D12(0xDEE); Sounder();break;case(0x7F)://返回按鍵K8的數(shù)據(jù)

Emit_D12(0xAAC); Sounder();break;default: break;}

}}紅外解碼程序://-----------------------------------------------------------------//名稱:紅外遙控器接收程序//-----------------------------------------------------------------//說明:程序運行時,根據(jù)SONY紅外協(xié)議接收數(shù)據(jù)并解碼,然后將12位編碼// 以16進制數(shù)顯示數(shù)碼管上.////-----------------------------------------------------------------#include<reg51.h>#include<string.h>#include<intrins.h>#include<stdio.h>#defineINT8Uunsignedchar#defineINT16UunsignedintINT8Udisp[4];INT8Uirtime;INT8Ustartflag;//開始標志位INT8Uirdata[17]={0};//接收到的脈沖寬度時間,定義16位最高位就顯示不對INT8Ubitnum;//第幾位數(shù)據(jù)INT8Uirreceok;//接收OKINT8Uirprosok;//接收OKINT8Uircode[2];//接收字節(jié)解碼INT8Ucount,irtime1,irtime2;sbitRead_IR=P3^2; //讀取紅外輸入信號unsignedcharcodesmg[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelay(unsignedinta){while(a--);

}voidtimer0init(void){TMOD=0x02;TH0=0X00;TL0=0x00;ET0=1;EA=1;TR0=1;}voidint0init(void){EA=1;EX0=1;IT0=1; //下降沿觸發(fā)}//紅外數(shù)據(jù)處理函數(shù)voidirpros(void){INT8Uk,i,j;INT8Uvalue=0;k=1;for(j=0;j<2;j++){ for(i=0;i<8;i++){ value=value>>1; if(irdata[k]>10)//最開始是6 { value=value|0x80; } k++; } ircode[j]=value;}irprosok=1;}//timer0中斷服務(wù)函數(shù)

voidtimer0()interrupt1{ irtime++;//最大值為255}//-----------------------------------------------------------------//INT0中斷函數(shù)//-----------------------------------------------------------------voidIR_INT_ISR()interrupt0{count++; if(startflag)//開始接收

{ if(count==2)//檢測開始信號, { bitnum=0; }

irdata[bitnum]=irtime; irtime=0; bitnum++; if(bitnum==13)//12比特數(shù)據(jù)接收完畢

{irreceok=1; bitnum=0; count=0; }}else{ startflag=1; irtime=0; }}//轉(zhuǎn)為數(shù)碼管顯示voidirwork(void){

disp[0]=ircode[1]/16;disp[1]=ircode[1]%16;disp[2]=ircode[0]/16;

disp[3]=ircode[0]%16;}voiddisplay(void){INT8Ui;for(i=0;i<4;i++){P2=smg[disp[i]];P1=i;delay(200);P2=0x00;//清消隱

P1=0xff;}}//-----------------------------------------------------------------//主程序//-----------------------------------------------------------------voidmain(){unsignedchari;timer0init();int0init();

delay(10); while(1){ if(irreceok){ irpros(); irreceok=0; }

if(irprosok){ irwork(); irprosok=0; } display(); }}【進階提高】將接收端收到的解碼字符用液晶LCD1602顯示。接收端程序修改為://-----------------------------------------------------------------//名稱:紅外遙控器接收程序//-----------------------------------------------------------------//說明:程序運行時,根據(jù)SONY紅外協(xié)議接收數(shù)據(jù)并解碼,然后將12位編碼// 以16進制數(shù)顯示液晶上.////-----------------------------------------------------------------#include<reg51.h>#include<string.h>#include<intrins.h>#include<stdio.h>#defineINT8Uunsignedchar#defineINT16UunsignedintINT8Udisp[4];INT8Uirtime;INT8Ustartflag;//開始標志位INT8Uirdata[17]={0};//接收到的脈沖寬度時間,定義16位最高位就顯示不對INT8Ubitnum;//第幾位數(shù)據(jù)INT8Uirreceok;//接收OKINT8Uirprosok;//接收OKINT8Uircode[2];//接收字節(jié)解碼INT8Ucount;sbitRead_IR=P3^2; //讀取紅外輸入信號externdelay_ms(INT16Ux);externvoidInitialize_LCD();externvoidWrite_LCD_Command(INT8Ucmd);externvoidWrite_LCD_Data(INT8Udat);externvoidlcd_pos(INT8Upos);externvoidLCD_ShowString(INT8U,INT8U,INT8U*);unsignedcharcodedis1[]={"---->code:"};voiddelay(unsignedinta){while(a--);

}voidtimer0init(void){TMOD=0x02;TH0=0X00;TL0=0x00;ET0=1;EA=1;TR0=1;}voidint0init(void){EA=1;EX0=1;IT0=1; //下降沿觸發(fā)}//紅外數(shù)據(jù)處理函數(shù)voidirpros(void){INT8Uk,i,j;INT8Uvalue=0;k=1;for(j=0;j<2;j++){

for(i=0;i<8;i++) { value=value>>1; if(irdata[k]>10)//最開始是6 { value=value|0x80; } k++; } ircode[j]=value;}irprosok=1;}//timer0中斷服務(wù)函數(shù)

voidtimer0()interrupt1{ irtime++;//最大值為255}//-----------------------------------------------------------------//INT0中斷函數(shù)//-----------------------------------------------------------------voidIR_INT_ISR()interrupt0{count++; if(startflag)//開始接收

{ if(count==2)//檢測開始信號, { bitnum=0; }irdata[bitnum]=irtime; irtime=0; bitnum++; if(bitnum==13)//12比特數(shù)據(jù)接收完畢

{ irreceok=1; bitnum=0; count=0; }}else{ startflag=1; irtime=0; }}//轉(zhuǎn)為液晶1602可以顯示的字符voidirwork(void){INT8Ui;

disp[0]=ircode[1]/16;disp[1]=ircode[1]%16;disp[2]=ircode[0]/16;

disp[3]=ircode[0]%16;for(i=0;i<4;i++){if(disp[i]>=10)switch(disp[i]){case10:disp[i]='A'; break; case11:disp[i]='B'; break; case12:disp[i]='C'; break; case13:disp[i]='D'; break; case14:disp[i]='E'; break; case15:disp[i]='F'; break;}else{ disp[i]=disp[i]+'0';}}}//-----------------------------------------------------------------//主程序//-----------------------------------------------------------------voidmain(){unsignedchari;timer0init();int0init();Initialize_LCD();delay(10); while(1){ if(irreceok){ irpros(); irreceok=0; }

if(irprosok){ irwork(); irprosok=0; }

lcd_pos(0x01);//設(shè)置顯示位置在第一行

i=0;while(dis1[i]!='\0'){Write_LCD_Data(dis1[i]);//顯示字符i++;}//第2行顯示開始

lcd_pos(0x42);//設(shè)置顯示位置在第2行

i=0; while(disp[i]!='\0'){Write_LCD_Data(disp[i]);//顯示字符i++;} }}液晶顯示子程序,名字命名為LCD1602.C,也加入到工程中://-----------------------------------------------------------------//液晶控制與顯示程序//-----------------------------------------------------------------#include<reg51.h>#include<intrins.h>#defineINT8Uunsignedchar#defineINT16UunsignedintsbitRS=P2^0; //寄存器選擇線sbitRW=P2^1; //讀/寫控制線sbitEN=P2^2; //使能控制線//sbitBF=P0^7; //LCD忙標記//-----------------------------------------------------------------//延時//-----------------------------------------------------------------voiddelay_ms(INT16Ums){ INT8Ui;while(ms--)for(i=0;i<120;i++);}//-----------------------------------------------------------------//忙檢查//-----------------------------------------------------------------bitLCD_Busy_Wait(){bitresult;RS=0;RW=1;EN=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);EN=0;returnresult;}//-----------------------------------------------------------------//寫LCD命令//-----------------------------------------------------------------voidWrite_LCD_Command(INT8Ucmd){while(LCD_Busy_Wait());//判斷LCD是否忙碌RS=0;RW=0;EN=0;_nop_();_nop_();P0=cmd;_nop_();_nop_();_nop_();_nop_();EN=1;_nop_();_nop_();_nop_();_nop_();EN=0;}//-----------------------------------------------------------------//發(fā)送數(shù)據(jù)//-----------------------------------------------------------------voidWrite_LCD_Data(INT8Udat){while(LCD_Busy_Wait());//判斷LCD是否忙碌RS=1;RW=0;EN=0;P0=dat;_nop_();_nop_();_nop_();_nop_();EN=1;_nop_();_nop_();_nop_();_nop_();EN=0;}//-----------------------------------------------------------------//LCD初始化//-----------------------------------------------------------------voidInitialize_LCD(){ Write_LCD_Command(0x38);delay_ms(10);Write_LCD_Command(0x0c);delay_ms(10);Write_LCD_Command(0x06);delay_ms(10);Write_LCD_Command(0x01);delay_ms(10);}voidlcd_pos(unsignedcharpos)//寫入顯示控制位置命令{Write_LCD_Command(pos|0x80);}//-----------------------------------------------------------------任務(wù)二NEC遙控器設(shè)計【任務(wù)描述】使用NEC紅外協(xié)議,完成對紅外信號的發(fā)送和接收。AT89C2051單片機P1口接8個按鍵,按下的鍵值通過單片機發(fā)給紅外發(fā)射頭,AT89C51將接收到的紅外編碼用數(shù)碼管顯示出來?!救蝿?wù)分析】需要熟悉NEC紅外協(xié)議,在此基礎(chǔ)上,理解紅外信號的發(fā)送以及接收?!鞠嚓P(guān)知識】下面就NEC紅外協(xié)議作一簡要介紹:NEC協(xié)議載波:38khz,其邏輯1與邏輯0的表示如圖邏輯1為2.25ms,脈沖時間560us;邏輯0為1.12ms,脈沖時間560us。所以我們根據(jù)脈沖時間長短來解碼。推薦載波占空比為1/3至1/4。NEC協(xié)議格式如圖【任務(wù)實施】紅外發(fā)送程序://// 發(fā)射引腳(接PNP三極管b極)// PNP三極管e極接2Ω電阻,c極接紅外發(fā)射管

#include<REG51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineSBM0x80//識別碼#definem9(65536-9000) //約9mS#definem4_5(65536-4500) //約4.5mS#definem1_6(65536-1630) //約1.65mS#definem_65(65536-580) //約0.65mS#definem_56(65536-560) //約0.56mS#definem40(65536-40000)//約40mS#definem56(65536-56000)//56mS#definem2_25(65536-2250)//約2.25mS#defineKEY_INP1sbitIR=P3^2; //定義發(fā)射引腳(接PNP三極管基極)sbitBEEP=P3^7; //發(fā)射指示燈ucharKEY(void);voidSanZhuan(void);voidZZ(ucharx);voidZ0(uchartemp);voidTT0(bitBT,uintx);voidYS(uchartime);voiddelay_us(ucharx){while(--x);}//按鍵用延時程序voidDelay10ms(unsignedintc)//誤差0usC=1就為10ms{unsignedchara,b;for(;c>0;c--){for(b=38;b>0;b--){for(a=130;a>0;a--);}}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù)功能:主函數(shù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidmain(void){TMOD=0x01;//T016位工作方式

IR=1; //發(fā)射端口常態(tài)為高電平

while(1){SanZhuan();}}/***************************************************************鍵盤掃描***************************************************************/ucharKEY(void){unsignedcharkeyValue=0,i;//保存鍵值

//--檢測按鍵1--//if(KEY_IN!=0xFF)//檢測按鍵K1是否按下

{Delay10ms(1);//消除抖動

if(KEY_IN!=0xFF)//再次檢測按鍵是否按下

{keyValue=KEY_IN;i=0;while((i<50)&&(KEY_IN!=0xFF))//檢測按鍵是否松開

{

Delay10ms(1);i++;}}}returnkeyValue;//將讀取到鍵值的值返回}/***************************************************************函數(shù)功能:散轉(zhuǎn)程序入口參數(shù):v***************************************************************///輸出提示音//-----------------------------------------------------------------voidSounder(){ uchari;for(i=0;i<200;i++){BEEP=~BEEP;delay_us(240);}}//-----------------------------------------------------------------voidSanZhuan(void){ucharv;v=KEY();

switch(v){case0xFE:ZZ(0x01);v=0;Sounder();break;case0xFD:ZZ(0x02);v=0;Sounder();break;case0xFB:ZZ(0x03);v=0;Sounder();break;case0xF7:ZZ(0x04);v=0;Sounder();break;case0xEF:ZZ(0x05);v=0;Sounder();break;case0xDF:ZZ(0x06);v=0;Sounder();break;case0xBF:ZZ(0x07);v=0;Sounder();break;case0x7F:ZZ(0x08);v=0;Sounder();break;default:v=0;}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù)功能:發(fā)送主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidZZ(ucharx){TT0(1,m9); //高電平9mSTT0(0,m4_5); //低電平4.5mS/*┈發(fā)送4幀數(shù)據(jù)┈*/Z0(SBM); //用戶識別碼

Z0(~SBM);//用戶識別碼的反碼

Z0(x);//發(fā)送的是按鍵號作為信息碼

Z0(~x);//發(fā)送的是按鍵號作為信息碼反碼/*┈┈結(jié)束碼┈┈*/TT0(1,m_56); ///*┈┈重復(fù)碼┈┈*/while(KEY()){TT0(1,m9);TT0(0,m2_25);TT0(1,m_56);TT0(0,m40); TT0(0,m56);

}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù)功能:單幀發(fā)送程序入口參數(shù):1幀數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidZ0(uchartemp){ucharv;for(v=0;v<8;v++)//循環(huán)8次移位

{ TT0(1,m_56); //高電平0.56mS if(temp&0x01)TT0(0,m1_6);//發(fā)送最低位

elseTT0(0,m_56); temp>>=1;//右移一位

}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù)功能:38KHz脈沖發(fā)射+延時程序入口參數(shù):(是否發(fā)射脈沖,延時約x(uS))┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidTT0(bitBT,uintx){TH0=x>>8; //輸入T0初始值

TL0=x;TF0=0; //清0TR0=1; //啟動定時器0if(BT==0)while(!TF0); //BT=0時不發(fā)射38KHz脈沖只延時;BT=1發(fā)射38KHz脈沖且延時;

elsewhile(1) //38KHz脈沖,占空比5:26{ IR=0; if(TF0)break;if(TF0)break; IR=1; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; }TR0=0; //關(guān)閉定時器0TF0=0; //標志位溢出則清0IR=1; //脈沖停止后,發(fā)射端口常態(tài)為高電平}/***************************************************************函數(shù)功能:按鍵消抖延時程序入口參數(shù):1ms×time(晶振=12MHz)***************************************************************/voidYS(uchartime){uchari,j; for(i=0;i<time;i++)for(j=0;j<247;j++)_nop_();}紅外接收電路:接收代碼:

//-----------------------------------------------------------------//名稱:紅外遙控器接收程序//-----------------------------------------------------------------//說明:程序運行時,根據(jù)NEC紅外協(xié)議接收數(shù)據(jù)并解碼,然后將12位編碼// 以16進制數(shù)顯示數(shù)碼管上.////-----------------------------------------------------------------#include<reg51.h>#include<string.h>#include<intrins.h>#include<stdio.h>#defineINT8Uunsignedchar#defineINT16UunsignedintINT8Udisp[8];INT8Uirtime;INT8Ustartflag;//開始標志位INT8Ubitnum;//第幾位數(shù)據(jù)INT8Uirreceok;//接收OKINT8Uirprosok;//接收OKINT16Uircode[4]={1,2,3,4};//接收字節(jié)解碼INT8Ucount,irtime1,irtime2;INT8Uvalue;INT16Ucnt,i,j;sbitRead_IR=P3^2; //讀取紅外輸入信號unsignedcharcodesmg[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelay(unsignedinta){while(a--);

}voidint0init(void){EA=1;EX0=1;IT0=1; //下降沿觸發(fā)}//-----------------------------------------------------------------//INT0中斷函數(shù)//-----------------------------------------------------------------voidIR_INT_ISR()interrupt0{ EX0=0;cnt=0;

while(!Read_IR)cnt++;//記錄引導(dǎo)碼時間if(cnt<1000){EX0=1;return;}//9ms的計數(shù)值(12MHz:1000<cnt<1500)

cnt=0; while(Read_IR)if(cnt++>400){EX0=1;return;}//防卡死,超時保護(12MHz:>300)

if(cnt<200){EX0=1;return;}//(12MHz不分頻:<260)

for(j=0;j<4;j++) { for(i=0;i<8;i++)//讀取32位位碼

{ cnt=0; while(!Read_IR); while(Read_IR)if(cnt++>200){EX0=1;return;}//超時保護(12MHz:>=200)value>>=1; if(cnt>60)value|=0x80;//0和1的計數(shù)界線(12MHz:<109)

} ircode[j]=value; } irprosok=1; EX0=1;}//轉(zhuǎn)為數(shù)碼管顯示voidirwork(void){

disp[0]=ircode[0]/16;disp[1]=ircode[0]%16;disp[2]=ircode[1]/16;disp[3]=ircode[1]%16;disp[4]=ircode[2]/16;disp[5]=ircode[2]%16;

disp[6]=ircode[3]/16;disp[7]=ircode[3]%16;}voiddisplay(void){INT8Ui;for(i=0;i<8;i++){P0=smg[disp[i]];P1=i;delay(200);P0=0x00;//清消隱

P1=0xff;}}//-----------------------------------------------------------------//主程序//-----------------------------------------------------------------voidmain(){unsignedchari;

int0init();

delay(10); while(1){

if(irprosok){ irwork(); irprosok=0; } display(); }}【進階提高】將本任務(wù)中接收到的數(shù)據(jù)用LCD1602顯示。接收部分代碼變更為:

//-----------------------------------------------------------------//名稱:紅外遙控器接收程序//-----------------------------------------------------------------//說明:程序運行時,根據(jù)NEC紅外協(xié)議接收數(shù)據(jù)并解碼,然后將12位編碼// 以16進制數(shù)顯示液晶上.////-----------------------------------------------------------------#include<reg51.h>#include<string.h>#include<intrins.h>#include<stdio.h>#defineINT8Uunsignedchar#defineINT16UunsignedintINT8Udisp[8];INT8Uirtime;INT8Ustartflag;//開始標志位INT8Ubitnum;//第幾位數(shù)據(jù)INT8Uirreceok;//接收OKINT8Uirprosok;//接收OKINT16Uircode[4]={1,2,3,4};//接收字節(jié)解碼INT8Ucount,irtime1,irtime2;INT8Uvalue;INT16Ucnt,i,j;sbitRead_IR=P3^2; //讀取紅外輸入信號externdelay_ms(INT16Ux);externvoidInitialize_LCD();externvoidWrite_LCD_Command(INT8Ucmd);externvoidWrite_LCD_Data(INT8Udat);externvoidlcd_pos(INT8Upos);externvoidLCD_ShowString(INT8U,INT8U,INT8U*);unsignedcharcodedis1[]={"---->code:"};voiddelay(unsignedinta){while(a--);

}voidint0init(void){EA=1;EX0=1;IT0=1; //下降沿觸發(fā)}//-----------------------------------------------------------------//INT0中斷函數(shù)//-----------------------------------------------------------------voidIR_INT_ISR()interrupt0{ EX0=0;cnt=0;

while(!Read_IR)cnt++;//記錄引導(dǎo)碼時間

if(cnt<1000){EX0=1;return;}//9ms的計數(shù)值(12MHz:1000<cnt<1500)

cnt=0; while(Read_IR)if(cnt++>400){EX0=1;return;}//防卡死,超時保護(12MHz:>300)

if(cnt<200){EX0=1;return;}//(12MHz不分頻:<260)

for(j=0;j<4;j++) { for(i=0;i<8;i++)//讀取32位位碼

{cnt=0; while(!Read_IR); while(Read_IR)if(cnt++>200){EX0=1;return;}//超時保護(12MHz:>=200)

value>>=1; if(cnt>60)value|=0x80;//0和1的計數(shù)界線(12MHz:<109)

} ircode[j]=value; } irprosok=1; EX0=1;}//轉(zhuǎn)為數(shù)碼管顯示voidirwork(void){INT8Ui;

disp[0]=ircode[0]/16;disp[1]=ircode[0]%16;disp[2]=ircode[1]/16;disp[3]=ircode[1]%16;disp[4]=ircode[2]/16;disp[5]=ircode[2]%16;

disp[6]=ircode[3]/16;disp[7]=ircode[3]%16;for(i=0;i<8;i++){ if(disp[i]>=10)switch(disp[i]){ case10:disp[i]='A'; break; case11:disp[i]='B'; break; case12:disp[i]='C'; break; case13:disp[i]='D'; break; case14:disp[i]='E'; break; case15:disp[i]='F'; break;}else{ disp[i]=disp[i]+'0';}}}//-----------------------------------------------------------------//主程序//-----------------------------------------------------------------voidmain(){unsignedchari;

int0init(); Initialize_LCD();delay(10); while(1){

if(irprosok){ irwor

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論