?? saa3010.h
字號(hào):
/********************************************************************************************
* 功 能:紅外解碼。
* 硬件條件:1.CPU型號(hào):AT89C8051
* 2.晶振:12.0000MHz
* 3.一體化紅外接收頭接P3.3
* 4.遙控器,型號(hào)為SAA-3010T。
*
* 下面是通過本程序解碼SAA-3010T電視遙控器的鍵值表
* **********************************************************
* *[靜音]7f2/ff2 [開/關(guān)」7f9/ff9
* *[1]7fe/ffe [2]7fd/ffd [3]7fc [4]7fb
* *[5]ffa [6]7f9 [7]ff8 [8]7f7
* *[9]7f6/ff6 [0]7ff/fff [單/雙]ff5 [搜索]7e1
* *[頻道+]7df [頻道-]7de [微調(diào)+]7d4 [微調(diào)-]7d3
* *[音量VOL+]7ef [存儲(chǔ)STORE]fdb [顯示]ff0
* *[音量VOL- ]fee [設(shè)定]ff1 [定時(shí)]7d9
* *[亮度+]7ed [彩色+]feb [對(duì)比度+]fe3 [視頻]7c7
* *[亮度-]7ec [彩色-]fea [對(duì)比度-]fe2 [轉(zhuǎn)換]7c0
*********************************************************************************/
#ifndef __SAA3010__H__INCLUDED__
#define __SAA3010__H__INCLUDED__
//==============================================================================
#include <AT89X52.h>
#include "define.h"
// 定義紅外接收的接口(根據(jù)實(shí)際的硬件接線進(jìn)行修改)
//==============================================================================
sbit SAA3010_RECV = P3^3; // INT1 紅外接收的接口
void SAA3010Init();
//==============================================================================
//
// 狀態(tài)機(jī)的含義:
//
// 狀態(tài)S0: 初始狀態(tài)
// 狀態(tài)S1: 1,1 狀態(tài),在兩個(gè)bit中間觸發(fā)中斷
// 狀態(tài)S2: 0 狀態(tài)
//
// S1->S1: 1個(gè)周期
// S1->S2: 1.5個(gè)周期
// S2->S2: 1個(gè)周期或2個(gè)周期
// S2->S1: 1.5個(gè)周期
//
//==============================================================================
//==============================================================================
// 時(shí)間常數(shù)(使用晶震頻率為12MHz,周期為1.688ms)
//==============================================================================
#define CYCLE_1_0 0x698 // 1688us
#define CYCLE_1_5 0x9E4 // 2532
#define CYCLE_2_0 0xD30 // 3376us
//#define CYCLE_5_0 0x20f8 //8440us
//#define TH_CYCLE_5_0 ( CYCLE_5_0 >> 8 )
#define TH_CYCLE_1_0 ( CYCLE_1_0 >> 8 )
#define TH_CYCLE_1_5 ( CYCLE_1_5 >> 8 )
#define TH_CYCLE_2_0 ( CYCLE_2_0 >> 8 )
bit ykok=0;
// 用于解碼的變量
unsigned int SAA3010RecvCode = 0; // 保存解碼數(shù)值(1個(gè)控制位 5個(gè)地址位 6個(gè)命令位)
unsigned char SAA3010BitCount = 0; // 記錄已經(jīng)解碼的位數(shù)
unsigned char SAA3010State = 0; // 初始狀態(tài)
// 初始化中斷及定時(shí)器
void SAA3010Init()
{
// 允許中斷
EA = 1;
// 定時(shí)器1
TMOD = 0x10; // T1工作于方式1,即16位定時(shí)器
ET1 = 1; // 關(guān)定時(shí)器0中斷允許
TR1 = 1; // 關(guān)閉定時(shí)器0
TH1 = 0;
TL1 = 0;
// 外部中斷源INT0
EX1 = 1; // 允許外部中斷源INT1
PX1 = 1; // 外部中斷源為高優(yōu)先級(jí)
IT1 = 1; // 邊緣觸發(fā)
// 初始化變量
SAA3010BitCount = 0;
SAA3010RecvCode = 0;
SAA3010State = 0;
}
// 定時(shí)器T0的中斷處理函數(shù)
void SAA3010Timer1(void) interrupt 3 using 3
{
// 出現(xiàn)了超時(shí)
if( SAA3010BitCount == 13 )
{
if( SAA3010State == 1 || // 1,1
SAA3010State == 2 ) // 0,1 //初始化狀態(tài)為11或者01
{
SAA3010BitCount ++;
SAA3010RecvCode = SAA3010RecvCode << 1;
SAA3010RecvCode = SAA3010RecvCode + 1;//解碼最后一位補(bǔ)1
SAA3010RecvCode=SAA3010RecvCode&0x0fff;
}
ykok=1; //遙控?cái)?shù)據(jù)有效
}
// 檢查是否有合理數(shù)據(jù)
else if( SAA3010BitCount == 14 )
{
// 停止中斷0
EX1 = 0;
// 處理遙控命令
// SAA3010ProcessCommand((~SAA3010RecvCode) & 0x0FFF );
SAA3010RecvCode=SAA3010RecvCode&0x0fff;
ykok=1; //遙控?cái)?shù)據(jù)有效
}
else EX1 = 1;
// 重新初始化初始化
SAA3010BitCount = 0;
SAA3010State = 0;
// 啟用中斷
}
// 外部中斷1的處理函數(shù)
void SAA3010Int1(void) interrupt 2 using 2
{
// 保存計(jì)數(shù)器的高位,作為判斷周期長短的依據(jù)
unsigned char HighTick = TH1;
// 重置計(jì)數(shù)器
TH1=0;TL1=0;TR1=1;ET1=1;
// 狀態(tài)轉(zhuǎn)移圖
switch( SAA3010State )
{
case 0: // 第一個(gè)起始位
SAA3010State = 2;
SAA3010BitCount = 1;
SAA3010RecvCode = 0;
break;
case 1: // 狀態(tài)1
if( HighTick == TH_CYCLE_1_0 ) // S1->S1
{
SAA3010State = 1;
SAA3010BitCount++;
SAA3010RecvCode = SAA3010RecvCode << 1;
SAA3010RecvCode = SAA3010RecvCode + 1;
}
else if( HighTick == TH_CYCLE_1_5 ) // S1->S2 ( 1,1,0 )
{
SAA3010State = 2;
SAA3010BitCount = SAA3010BitCount+2;
SAA3010RecvCode = SAA3010RecvCode << 1;
SAA3010RecvCode = SAA3010RecvCode + 1;
SAA3010RecvCode = SAA3010RecvCode << 1;
}
else // 錯(cuò)誤狀態(tài)
{
SAA3010BitCount = 0;
SAA3010State = 0;
}
break;
case 2: // 狀態(tài)2
if( HighTick == TH_CYCLE_1_0 ) // S2->S2
{
SAA3010State = 2;
SAA3010BitCount++;
SAA3010RecvCode = SAA3010RecvCode << 1;
}
else if( HighTick == TH_CYCLE_1_5 ) // S2->S1
{
SAA3010State = 1;
SAA3010BitCount++;
SAA3010RecvCode = SAA3010RecvCode << 1;
SAA3010RecvCode = SAA3010RecvCode + 1;
}
else if( HighTick == TH_CYCLE_2_0 ) // S2->S2
{
// 0->1->0
SAA3010State = 2;
SAA3010BitCount = SAA3010BitCount+2;
SAA3010RecvCode = SAA3010RecvCode << 1;
SAA3010RecvCode = SAA3010RecvCode + 1;
SAA3010RecvCode = SAA3010RecvCode << 1;
}
// else if( HighTick >TH_CYCLE_5_0 ){EX1=1;}
else // 錯(cuò)誤狀態(tài)
{
SAA3010BitCount = 0;
SAA3010State = 0;
}
break;
}
}
unsigned char hget_Key()
{
if(SAA3010RecvCode==0x07fe||SAA3010RecvCode==0x0ffe)
{
return (1);
}
if(SAA3010RecvCode==0x07fd||SAA3010RecvCode==0x0ffd)
{
return (2);
}
if(SAA3010RecvCode==0x07fc)
{
return (3);
}
if(SAA3010RecvCode==0x07fb)
{
return (4);
}
if(SAA3010RecvCode==0x0ffa)
{
return (5);
}
if(SAA3010RecvCode==0x07f9)
{ return (6);
}
if(SAA3010RecvCode==0x0ff8)
{return (7);
}
if(SAA3010RecvCode==0x07f7)
{ return (8);
}
if(SAA3010RecvCode==0x07f6||SAA3010RecvCode==0x0ff6)
{ return (9);
}
if(SAA3010RecvCode==0x07ff||SAA3010RecvCode==0x0fff)
{ return (0);
}
if(SAA3010RecvCode==0x07f2||SAA3010RecvCode==0x0ff2) //靜音 date and time
{
return (10);
}
if(SAA3010RecvCode==0x07ec) //亮度- close
{ return (11);
}
if(SAA3010RecvCode==0x0fea) //彩色- wind
{ return (12);
}
if(SAA3010RecvCode==0x0fe2) //對(duì)比度- default
{ return (13);
}
if(SAA3010RecvCode==0x07c0) //轉(zhuǎn)換 enter
{ return (14);
}
//b=1;
}
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -