欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
關于51單片機NEC紅外解碼錯誤的問題
[打印本頁]
作者:
taowenyin
時間:
2019-5-27 22:59
標題:
關于51單片機NEC紅外解碼錯誤的問題
各位大佬,最近在做一個NEC格式的紅外遙控器的接收項目,但是始終沒能正確解析,請大佬們指正代碼的問題,萬分感謝。我的晶振是18.432MHz,定時器是200us,目前的結果是每次獲取都是一堆7F,不知道問題出在哪里。
另外,想再問下各位大佬,紅外遙控器有去抖的說法嘛?
1、單片機頭文件的相關定義
#define FOSC 18432000L
#define T0US (65536 - (FOSC / 12 / 1000000 * 200)) //200us timer calculation method in 12T mode
// 紅外的時間
extern BYTE Ir_Time;
// 收到紅外信號
extern BYTE Ir_Start;
// 收到紅外信號頭
extern BYTE Ir_Header;
// 紅外數據
extern BYTE Ir_Data[33];
// 紅外碼
extern BYTE Ir_Code[4];
// 數據索引
extern BYTE Data_Index;
// 有新編碼
extern BYTE New_Code;
// 紅外初始化
extern void IrInit(void);
// 紅外編碼解析
extern void IrDecode(void);
復制代碼
2、紅外初始化
void IrInit(void) //100微秒@18.432MHz
{
// 打開紅外接收中斷
IT1 = 1; // 外部中斷1下降沿觸發
EX1 = 1; // 打開外部中斷1
//200us @18.432MHz
TMOD |= 0x01; //set timer0 as mode1 (16-bit)
TL0 = T0US; //initial timer0 low byte
TH0 = T0US >> 8; //initial timer0 high byte
ET0 = 1; //enable timer0 interrupt
}
復制代碼
3、紅外編碼解析
// 紅外編碼的解析
void IrDecode(void)
{
BYTE i = 0, j = 0, time = 0, ir_tmp_code = 0;
for(i = 0; i < 4; i++) // 處理開頭的兩個字節
{
for(j = 0; j < 8; j++)
{
time = Ir_Data[i * 8 + j + 1];
if(time > 5) // 大于1.125ms表示1,否則就為0
{
ir_tmp_code |= 0x80;
}
ir_tmp_code = ir_tmp_code >> 1;
}
Ir_Code[i] = ir_tmp_code;
ir_tmp_code = 0;
}
}
復制代碼
4、中斷處理
// 遙控器接收中斷,外部中斷1
void Ir_Isr(void) interrupt 2 using 2
{
TR0 = 1; // 啟動定時器0
if(Ir_Start) // 判斷是否遙控器接收已經啟動
{
if(Ir_Time >= 40 && Ir_Time < 75) // 引導碼大于4.5ms小于90
{
Ir_Data[Data_Index++] = Ir_Time; // 保存時間
Ir_Time = 0; // 重置時間
Ir_Header = 1;
}
else
{
if(Ir_Header)
{
Ir_Data[Data_Index++] = Ir_Time;
if(Data_Index == 34) // 保存了4個字節的信息
{
New_Code = 1; // 數據填滿
TR0 = 0; // 暫停定時器0
Ir_Start = 0; // 重置遙控器接收啟動位
Data_Index = 0; // 重置數據索引
Ir_Header = 0;
}
Ir_Time = 0; // 重置脈寬時間
}
}
}
else
{
// 接收遙控器發送啟動
Ir_Start = 1;
// 定時器歸位
Ir_Time = 0;
}
}
復制代碼
5、定時器處理
// 遙控器接收定時器
void Ir_Timer_Isr(void) interrupt 1 using 1
{
TL0 = T0US; //initial timer0 low byte
TH0 = T0US >> 8; //initial timer0 high byte
if(count >= 5000)
{
LED = !LED;
count = 0;
}
count++;
Ir_Time++; // 紅外時間以200us累加
}
復制代碼
作者:
小貓要吃魚
時間:
2019-5-28 09:50
你好!你使用的單片機具體型號是什么?
做過幾款紅外解碼學習型遙控器(帶發射)和記錄脈寬的全能學習型遙控器(帶發射);
都是用的STC單片機,分別是 89C52RC、15F2K60S2 和 12C5A60S2 這三款,使用
效果不錯,解碼型的NEC編碼的都可解碼和發射;記錄脈寬的全能型的,基本通吃
所有遙控器(空調測試通過:美的、奧克斯、格力),實現比較完美的脈寬記錄和
紅外發射控制。
作者:
yinqing452
時間:
2019-8-30 20:36
小貓要吃魚 發表于 2019-5-28 09:50
你好!你使用的單片機具體型號是什么?
做過幾款紅外解碼學習型遙控器(帶發射)和記錄脈寬的全能學習型遙 ...
可以幫忙一下紅外發射程序嗎?
作者:
angmall
時間:
2019-8-31 14:23
紅外發射程序
/*-----------------------------------------------
名稱:紅外發射原理
內容:通過紅外發射接收閃爍LED,同普通LED顯示程序相同。
間歇發送38K調制波形。發射J34(IR2)端子接P3.3,J27(任意端子)接P3.2,
P1.3接任意LED,正常情況LED閃爍,拔掉發射或者接收信號線,led熄滅。
------------------------------------------------*/
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include<INTRINS.H>
sbit LED=P3^3; //紅外發射
sbit LED1=P1^3;
sbit IR=P3^2; //紅外一體化接收
bit Flag;
void Init_Timer0(void)
{
TMOD |= 0x01;
TH0=0xf0; //定時器值初始化
TL0=0x00;
EA=1; //打開中斷
ET0=1;
TR0=1;
}
/*-----------------------------------------------
定時器初始化
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
TH0=0x0f; //重新賦值
TL0=0x00;
Flag=!Flag;
}
/*-----------------------------------------------
主函數
------------------------------------------------*/
main()
{
//unsigned int j;
Init_Timer0(); //定時器初始化
while(1)
{
LED1=IR; //讀取一體化接收頭數值
while(Flag) //循環取反頻率大約38K
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
LED=!LED; //發射管輸出
}
}
}
復制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1