當前位置:編程學習大全網 - 源碼下載 - 我無線電不懂,紅外寫過51單片機的收發程序,可我不會制作遙控器···我怎麽不能追問啊

我無線電不懂,紅外寫過51單片機的收發程序,可我不會制作遙控器···我怎麽不能追問啊

壹、 基本原理

1.1 紅外編碼原理

常用的紅外線信號傳輸協議有 ITT 協議、 NEC 協議、 Nokia NRC 協議、 Sharp 協議、 Philips RC-5 協議、Philips RC-6協議,Philips RECS-80協議,以及 Sony SIRC 協議等。

1)協議組成 :壹般由引導碼 ,用戶碼,數據碼,重復碼或數據碼的反碼和結束碼構成。

2)載波:常用的有33K,36K,36.6K,38K,40K,56K,無載波

3)占空比:常用的有1/3,1/2,不常用1/4

4)調制方式:脈寬調制,相位調制,脈沖位置調制

1.2 紅外解碼原理

本次作業選用的是NEC協議編碼的,由38K載波調制的紅外編碼。基於51單片機的編碼環境,編程語言為C51。 原理框圖如下:

1.3 NEC編碼方式

引導碼,16bit用戶碼(地址碼),8bit命令碼(數據碼)及其反碼。

1) 引導碼由壹個9ms的載波波形和4.5ms的關斷時間構成

2

2) 地址碼***16bit,低8位在前,高8位在後。

3) 8bit命令碼及其反碼

二、 解碼環境

2.1 硬件環境

1、 SST89E58RD單片機開發板

2、 HX1838型紅外接收頭

1) HX1838型紅外接收頭外形尺寸及引腳排列:

3

2) 應用電路圖

3、 電阻、電容等元件

2.2 軟件環境

1) Keil u vision2

Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發系統,與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。

2) C51

C51是為51系列單片機設計的壹種C語言

結構化語言,代碼緊湊——效率可與匯編語言媲美

接近真實語言,程序可讀性強——易於調試、維護

庫函數豐富,編程工作量小——產品開發周期短

機器級控制能力,功能很強——適合於嵌入式系統開發

4

與匯編指令無關,易於掌握——在單片機基礎上上手快

三、 解碼實現

3.1 程序結構框圖

定時器20us發

壹次中斷

是否有信號

(低電平)

YES NO

判斷是否為引導

低電平時間高

於600us

判斷命令碼為0

或1

儲存命令碼

解析命令碼

在數碼管顯示

YES

NO

3.2 程序源代碼

//NEC 編碼紅外遙控器解碼程序

5

// // 2011-3-26 #include<stdio.h> #include<intrins.h> #include<reg51.h> #define TIMERH 0xed //宏定義定時器高位為237 #define TIMERL 0xed //宏定義定時器低位為237 unsigned char code seg_code[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數碼管段碼 unsigned char bcode[32]=0; //定義儲存二進制命令碼數組 unsigned int count,dcode;//定義變量 // 關鍵變量說明 //en: 接受命令碼使能控制 //flag: 接收完畢符號位 unsigned int i,j,en,k,m,flag; //解碼數值和數碼管顯示段碼轉換 char code_chg(unsigned char ch) { switch(ch) { case 14:return 0; case 16:return 1; case 17:return 2; case 18:return 3; case 20:return 4; case 21:return 5; case 22:return 6; case 24:return 7; case 25:return 8; case 26:return 9; default :return 0; } } // 顯示數字斷碼 void WriteSegData(unsigned char seg) { if(seg>16) seg = 16;

6

seg = seg_code[seg]; P0 = seg; _nop_(); _nop_(); P2 &= 0x1f; _nop_(); _nop_(); P2 |= 0xe0; } // 顯示數字位碼 void WriteCsData(unsigned char cs) { cs &= 0x0f; P0 = ~cs; _nop_(); _nop_(); P2 &= 0x3f; _nop_(); _nop_(); P2 |= 0xe0; } //初始化定時器 void InitTimer() { TMOD=0x20; //定時器1,工作方式2 TH1=TIMERH; //定時器高位初始化 TL1=TIMERL; //定時器低位初始化 EA=1; //允許中斷 ET1=1; //定時器1開中斷 // for(m=0;m<32;m++)//初始化存儲二進制命令碼數組 { bcode[m]=0; } } //定時器中斷函數 void timer() interrupt 3 { if((P1&0x80)==0x00) //判斷是否為低電位 { P1=P1&0xfe; //點亮二極管e5

7

if(count<100&&en==1)//判斷是否為引導碼 { count++; } else if(count>=100) //若是引導碼則忽略 { en=0; count=0; } } //命令碼高電位開始判斷前壹低電位持續時間 //若在600——800us之間,則為0 //若在1600——1900us之間,則為1 //此處定義時間段是為了抗幹擾 else if(((P1&0x80)==0x80)&&en==1) { P1=P1|0x01; //若為高電位,熄滅LED燈e5 if(i<31) { if(count>30&&count<40) //若在600——800us之間,則為0 { bcode[i]=0; //儲存二進制命令碼 i++; //儲存該位編碼後,初始化 en=0; count=0; } else if(count>80&&count<95) //若在1600——1900us之間,則為1 { bcode[i]=1; i++; en=0; count=0; } } } else if(((P1&0x80)==0x80)&&en==0) //命令碼之前初始化 { en=1; count=0; } else if(i==31) //接收完畢 { flag=1;

8

  • 上一篇:玩VR遊戲用什麽手機好?
  • 下一篇:來源公司排名
  • copyright 2024編程學習大全網