|
注冊登錄后可以在線提問,行業(yè)從業(yè)者將幫助您解答!
您需要 登錄 才可以下載或查看,沒有賬號?請用中文注冊用戶!
×
//============================================================================
//======翼芯科技 紅外遙控解碼 數(shù)碼管顯示鍵值==指撥開關(guān)SW2的1位撥向下==========
//============================================================================
// 此源碼版權(quán)屬 翼芯科技 全權(quán)享有,如欲引用,敬請署名并告知
// 嚴(yán)禁隨意用于商業(yè)目的,違者必究,后果自負(fù)
// 公司網(wǎng)站 http://www.mcu-led.com
// 公司論壇 http://www.cpu-led.com
// 淘寶店: http://cpu-led.taobao.com/ 和 http://mcu-led.taobao.com/
// 產(chǎn)品咨詢 QQ :1322130074 電話:13715619122
//程序說明:本程序用于實現(xiàn)紅外遙控解碼 數(shù)碼管顯示鍵值.IC插到U9位置.指撥開關(guān)SW2的1位撥向下.
//文件名稱:main.C
//日期: 2011/01/23
//版本: 1.0
//C編譯器: keil 8.05
//=============================================================================
#include <STC12C5AXX.H>
#define uchar unsigned char
#define uint unsigned int
#define BIT_32 32
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
sbit LED4 = P0^3;
sbit IRIN = P3^7;
sbit CLK = P2^3; //74HC595時鐘輸出
sbit DAT = P2^1; //74HC594數(shù)據(jù)輸出
sbit RCLK = P2^2; //數(shù)據(jù)鎖存
sbit EN = P2^7; //74HC595使能口
bit SYNOK,ADDROK,FLAGERR,LOK,FLAG_1MS;
unsigned long int BYTE1;
uchar LCOUNT,HCOUNT,HLCOUNT,BITCOUNT,CODE_NUM;
uchar T_CNT3;
uchar T_CNT4;
uchar DIS_CNT1,DIS_CNT2;
uchar code DSY_CODE[]= //數(shù)據(jù)管共陰的顯示值0-F
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
};
/******************************************************************
- 功能描述:74HC595輸出函數(shù)
- 隸屬模塊:無
- 函數(shù)屬性:無
- 參數(shù)說明:無
- 返回說明:無
- 注:.....
******************************************************************/
void sendbyte(uchar BYTE)
{
uchar num,i; //定義局部變量
num=BYTE;
for(i=0;i<8;i++) //移8次
{
CLK=0; //CLK置1
DAT=num&0x80; //數(shù)據(jù)左移
num=num<<1;
CLK=1;
}
RCLK=0; //數(shù)據(jù)鎖存
RCLK=1;
}
/******************************************************************
- 功能描述:定時器0中斷
- 隸屬模塊:無
- 函數(shù)屬性:無
- 參數(shù)說明:無
- 返回說明:無
- 注:.....
******************************************************************/
void TIME0_INT() interrupt 1
{
TH0 = (65535-200)/256;
TL0 = (65535-200)%256;
sendbyte(0xFF);
if(FLAG_1MS)
{
P0=(DSY_CODE[DIS_CNT1]);
sendbyte(0XFD);
FLAG_1MS=0;
}
else
{
P0=(DSY_CODE[DIS_CNT2]);
sendbyte(0xFE);
FLAG_1MS=1;
}
//=====================檢測高電平====================================================
if(IRIN==0)
{
LCOUNT++; //高電平計數(shù)器++
if(LOK==1) //第一個高電平
{
LOK=0;
if(SYNOK==1) //同步碼 Ok
{
HLCOUNT=LCOUNT+HCOUNT; //檢測高低計數(shù)值判定
if((3<HLCOUNT)&&(HLCOUNT<40)); //高低電平小于2560,大于1152,ok; 18
else
{
FLAGERR=1; //錯誤退出
return;
}
if(12<HCOUNT)
BYTE1=(BYTE1>>1)|0x80000000; //為1
else
BYTE1=(BYTE1>>1)|0x00000000; //為0
LCOUNT=0;
HCOUNT=0;
BITCOUNT--;
if(BITCOUNT==0) //解出了一次碼
{
SYNOK=0; //同步清零
BITCOUNT=BIT_32; //碼的位數(shù)
ADDROK=1; //解碼成功標(biāo)識
}
}
else
{
if((10<HCOUNT)&(HCOUNT<60)) //低電平大于6.4ms,小于12.8ms,同步碼電平ok; 80-100,OK
{
SYNOK=1;
LCOUNT=0;
HCOUNT=0;
}
else
{
FLAGERR=1;
}
}
}//end LOK
}//END IRIN==0;
else //檢測高電平的寬度==低電平計數(shù)
{
HCOUNT++;
if(LOK==1)
return;
if(SYNOK)
{
if((1<LCOUNT)&(LCOUNT<25)) //低電平大于256us,小于2048,高電平ok;
{
LOK=1;
}
else
{
FLAGERR=1;
}
}
else
{
if((60<LCOUNT)&(LCOUNT<120)) //低電平大于6MS,小于9MS, 同步低電平ok;
{
LOK=1;
}
else
{
FLAGERR=1;
}
} //END ELSE
} //EDN ELSE
}
/******************************************************************
- 功能描述:主函數(shù)
- 隸屬模塊:無
- 函數(shù)屬性:無
- 參數(shù)說明:無
- 返回說明:無
- 注:.....
******************************************************************/
void main()
{
TMOD = 0x01; //定時器0工作在16位的定時模式.
TH0 = (65535-200)/256; //定時器0高位設(shè)定
TL0 = (65535-200)%256; //定時器0低位設(shè)定
IE = 0x82; //開總中斷和定時器0中斷
TR0 = 1; //開定時器0
//M1:M0 0:0為標(biāo)準(zhǔn)51;0:1輸出;1:0輸入;1:1開漏輸出
P0M1=0X00; //P0口設(shè)為推挽輸出
P0M0=0XFF;
P3M1=0X80; //P3.7為輸入
P3M0=0X00;
EN=0;
P0=0;
while(1)
{
if(FLAGERR==1) //解碼失敗,初始化參數(shù)
{
LCOUNT=0;
HCOUNT=0;
LOK=0;
FLAGERR=0;
SYNOK=0;
BITCOUNT=BIT_32;
}
if(ADDROK==1)
{
ADDROK=0;
CODE_NUM=(BYTE1>>24);
DIS_CNT2=CODE_NUM&0X0F;
DIS_CNT1=CODE_NUM>>4;
}//EDN ADDROK
}//END WHILE
|
|