一、項目介紹
遙控器是現代生活中必不可少的電子產品之一,目前市面上的遙控器種類繁多,應用范圍廣泛。而 NEC 紅外遙控器協議則是目前應用最為廣泛的一種協議之一,幾乎所有的電視、空調等家用電器都支持該協議。
本項目是基于 51 單片機設計支持 NEC 協議的紅外遙控器,實現接收解碼和發送功能。用戶通過按下相應按鍵進行信號的發射,紅外發射二極管向外發射紅外信號,被控制設備通過紅外接收頭接收到這個信號,然后解碼執行相應的操作。
二、硬件設計
本項目所需的硬件器件主要包括:
(1)5STC89C52單片機
(2)紅外發射管
(3)紅外接收頭
(4)OLED顯示屏
(5)按鍵開關
三、軟件設計
本項目的程序代碼采用 C 語言編寫,主要分為三個部分:初始化部分、接收解碼部分和發送數據部分。
(1)初始化部分
初始化函數主要完成各個端口的初始化和定時器的配置,以及紅外接收頭和紅外發射管的引腳的配置。
(2)接收解碼部分
接收解碼函數主要采用計數器方式對紅外遙控器發送的信號進行捕獲,并將捕獲到的信號轉換成 NEC 碼。然后根據 NEC 碼的規定,解碼出用戶所輸入的指令,最終實現控制設備的功能。
(3)發送數據部分
發送數據函數主要將單片機中存放的指令碼進行編碼,并通過紅外發射管發送給被控制的設備。在該函數中,需要通過計時器的方式來調節發送信號的時間和頻率,以保證信號能夠正確傳輸。
四、代碼實現
4.1 NEC協議解碼代碼
下面是基于 51 單片機實現 NEC 協議解碼的代碼:
#define IRIN P1_0 //紅外接收管
unsigned char code Remote6[] = {0x06, 0x09, 0x08, 0x0a, 0x0c, 0x0d, 0x0f};
//遙控器按鍵對應的命令碼
?
unsigned char read_IR() //讀取紅外信號
{
int k = 0;
unsigned char data = 0;
?
while (IRIN) //等待低電平出現
{
k++;
?
if (k > 1000)
return 0; //超時返回
}
?
k = 0;
?
while (!IRIN) //等待高電平出現
{
k++;
?
if (k > 1000)
return 0; //超時返回
}
?
k = 0;
?
while (IRIN) //等待低電平出現
{
k++;
?
if (k > 1000)
return 0; //超時返回
}
?
for (int i = 0; i < 8; i++) //解碼 8 個 bit
{
k = 0;
?
while (!IRIN) //等待高電平出現
{
k++;
?
if (k > 1000)
return 0; //超時返回
}
?
delay_us(650);
?
if (IRIN) //判斷 bit 的值
data |= (1 < < i);
?
k = 0;
?
while (IRIN) //等待低電平出現
{
k++;
?
if (k > 1000)
return 0; //超時返回
}
}
?
return data; //返回解碼結果
}
?
unsigned char decode_IR(unsigned char code_val) //NEC 碼轉換為命令碼
{
for (int i = 0; i < 7; i++)
{
if (Remote6[i] == code_val)
return (i + 1);
}
?
return 0;
}
?
void main()
{
unsigned char data = 0;
unsigned char code_val = 0;
?
while (1)
{
data = read_IR(); //讀取紅外信號
?
if (data == 0) //判斷是否讀取成功
continue;
?
code_val = decode_IR(data); //將 NEC 碼轉換為命令碼
?
switch (code_val) //根據命令碼控制設備
{
case 1: //控制設備執行命令 1
break;
case 2: //控制設備執行命令 2
break;
case