欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
基于stc8a8k64s12芯片一位定時(shí)器移植的NEC協(xié)議的通用紅外外解碼程序
[打印本頁]
作者:
牛在飛
時(shí)間:
2019-6-19 16:37
標(biāo)題:
基于stc8a8k64s12芯片一位定時(shí)器移植的NEC協(xié)議的通用紅外外解碼程序
51單片機(jī)移植的NEC協(xié)議的通用紅外外解碼程序
搞了幾天的關(guān)于NEC協(xié)議的紅外位置遙控器解碼程序,發(fā)現(xiàn)好多網(wǎng)上帖子給出的參考代碼移植代碼解碼程序尤為困難,特此在參考了STC15w4k系列參考范例后,在其基礎(chǔ)上增加了數(shù)字按鍵解碼到數(shù)碼管顯示,所有鍵位解碼到8位LED顯示代碼,特別說明移植相當(dāng)方便!!!只是其晶振頻率要求22.1148mhz,其他晶振頻率范圍需要修改相關(guān)寄存器值,會(huì)比較麻煩,解碼成功案列遙控器型號(hào)為car MP3,同時(shí)適用該協(xié)義下所有遙控器,并且支持解碼數(shù)據(jù)串口發(fā)送到電腦端顯示,由于芯片和遙控器型號(hào)都是資源比較少的,特此分享好東西,希望大家積極指
有效程序在測(cè)試一中.7z
(34.2 KB, 下載次數(shù): 17)
2019-6-19 16:37 上傳
點(diǎn)擊文件名下載附件
附上源程序
下載積分: 黑幣 -5
正批評(píng),共同討論學(xué)習(xí)。
串口接收成功:
串口顯示.PNG
(476.03 KB, 下載次數(shù): 41)
下載附件
串口接收成功
2019-6-19 16:34 上傳
單片機(jī)源程序如下:
////////////////////////////////////////////////////////////
// 紅外接收數(shù)據(jù),查詢方式,并通過串口發(fā)送輸出
// 晶振:22.1184MHz ,波特率:9600
////////////////////////////////////////////////////////////
#include <STC8.H>
#define dataport P1
typedef unsigned char uchar;
typedef unsigned char uint;
sbit LADUAN=P3^5;
sbit LAWEI=P3^6;
#define LED P0
sbit Ir_Pin = P2^7; // 紅外接收頭信號(hào)輸出腳
uchar code lhc_duan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char Ir_Buf[4]; // 用于保存解碼結(jié)果(Ir_Buf[0]--用戶碼L,Ir_Buf[3] --鍵反碼)
// 獲取低電平時(shí)間 (其實(shí)是16位計(jì)數(shù)器的計(jì)數(shù)值,STC15系列定時(shí)器默認(rèn)為16位自動(dòng)重裝方式)
unsigned int Ir_Get_Low()
{
TL0 = 0; // 清空16位計(jì)數(shù)器0
TH0 = 0; // 清空16位計(jì)數(shù)器0
TR0 = 1; // 計(jì)數(shù)器0開始運(yùn)行
while (!Ir_Pin && (TH0<0x80)); // 信號(hào)引腳變成高或低電平時(shí)間>17ms退出(只要>12ms即可)
// 0x8000=32768, 32768*0.54253uS=17777.62 uS
TR0 = 0; // 這里 ! 優(yōu)先級(jí)大于&&
return (TH0 * 256 + TL0); // 返回16位計(jì)數(shù)器的計(jì)數(shù)值。
}
// 獲取高電平時(shí)間(其實(shí)是16位計(jì)數(shù)器的計(jì)數(shù)值,STC15系列定時(shí)器默認(rèn)為16位自動(dòng)重裝方式)
unsigned int Ir_Get_High()
{
TL0 = 0; // 清空16位計(jì)數(shù)器0
TH0 = 0; // 清空16位計(jì)數(shù)器0
TR0 = 1;
while (Ir_Pin && (TH0<0x40)); // 信號(hào)引腳變成低電平或高電平時(shí)間>17ms退出
TR0 = 0;
return (TH0 * 256 + TL0);
}
void UART_init(void) // 9600@22.1184MHz
{
//下面代碼設(shè)置定時(shí)器1
TMOD = 0x20; // 0010 0000 定時(shí)器1工作于方式2(8位自動(dòng)重裝方式)
TH1 = 0xFA; // 波特率:57600 /22.1184MHZ
TL1 = 0xFA; // 波特率:57600 /22.1184MHZ
TR1 = 1;
//下面代碼設(shè)置定串口
AUXR = 0x00; // 很關(guān)鍵,使用定時(shí)器1作為波特率發(fā)生器,S1ST2=0
SCON = 0x50; // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允許接收)
}
// UART發(fā)送一字節(jié)
void UART_Send_Byte(unsigned char dat)
{
SBUF = dat;
while (TI == 0);
TI = 0; // 此句可以不要,不影響后面數(shù)據(jù)的發(fā)送,只供代碼查詢數(shù)據(jù)是否發(fā)送完成
}
void IR_work() //紅外解碼程序
{
switch(Ir_Buf[2])
{
case 0x0c:dataport=lhc_duan[1];LADUAN=1;LADUAN=0;LED=~Ir_Buf[2];break;
case 0x18:dataport=lhc_duan[2];LADUAN=1;LADUAN=0;LED=~Ir_Buf[2];break;
case 0x5e:dataport=lhc_duan[3];LADUAN=1;LADUAN=0;LED=~Ir_Buf[2];break;
case 0x08:dataport=lhc_duan[4];LADUAN=1;LADUAN=0;LED=~Ir_Buf[2];break;
case 0x1c:dataport=lhc_duan[5];LADUAN=1;LADUAN=0;LED=~Ir_Buf[2];break;
case 0x5a:dataport=lhc_duan[6];LADUAN=1;LADUAN=0;LED=~Ir_Buf[2];break;
case 0x42:dataport=lhc_duan[7];LADUAN=1;LADUAN=0;LED=~Ir_Buf[2];break;
case 0x52:dataport=lhc_duan[8];LADUAN=1;LADUAN=0;LED=~Ir_Buf[2];break;
case 0x4a:dataport=lhc_duan[9];LADUAN=1;LADUAN=0;LED=~Ir_Buf[2];break;
default:dataport=lhc_duan[0];LADUAN=1;LADUAN=0;LED=~Ir_Buf[2];break;
}
}
void main()
{
unsigned int time;
unsigned char i,j;
LED=Ir_Pin;
UART_init();
UART_Send_Byte(0X55); // 測(cè)試串口工作是否正常
dataport=0xfe;//取位碼 第一位數(shù)碼管選通,即二進(jìn)制1111 1110
LAWEI=1;
LAWEI=0;
dataport=lhc_duan[0];
LADUAN=1;
LADUAN=0;
while (1)
{
start:
///////////// 接收同步信號(hào) ///////////
while (Ir_Pin); // 等待低電平出現(xiàn)
time = Ir_Get_Low(); // 低電平區(qū)間16位計(jì)數(shù)器的計(jì)數(shù)值
if ((time < 15667) || (time > 17510)) goto start;
// 引導(dǎo)脈沖低電平8500~9500us,T=12/22.1184=0.54253uS
// 8500/0.54253uS=15667.3 9500/0.54253uS=17510.5
time = Ir_Get_High();
if ((time < 7372) || (time > 9216)) goto start; // 引導(dǎo)脈沖高電平4000-5000us
// 4000/0.54253uS=7372.8 5000/0.54253uS=9216
////////// 接收后續(xù)的4 字節(jié)數(shù)據(jù) ////////
for (i=0; i<4; i++) // 4個(gè)字節(jié)
{
for (j=0; j<8; j++) // 每個(gè)字節(jié)8位
{
time = Ir_Get_Low(); // 接收每位560us 低電平
if ((time < 626) || (time > 1438)) goto start; // 340-780us
// 340/0.54253uS=626.7 780/0.54253uS=1437.7
time = Ir_Get_High(); // 接收每位560us或1690us高電平時(shí)間
if ((time>626) && (time<1438)) // 時(shí)間范圍為340-780us(中心值560us),
{
Ir_Buf[i] >>= 1; // 因低位在先,所以數(shù)據(jù)右移,移入的最高位為0
}
else if ((time>2728) && (time<3502))
{ // 時(shí)間判定范圍為1480~1900us(中心值1690us)
// 1480/0.54253uS=2727.9 1900/0.54253uS=3502.1
Ir_Buf[i] >>= 1; // 因低位在先,所以數(shù)據(jù)右移,移入的最高位為0
Ir_Buf[i] |= 0x80; // 最高位置1
}
else // 不在上述范圍內(nèi)則說明為誤碼,直接退出
{
goto start;
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1