|
#include <STC15F104E.H> typedef unsigned int u16; typedef unsigned char u8;//無符號數(shù)據(jù)類型 u16 time ; //時間變量 sbit led=P3^5; static u8 u; //static靜態(tài)變量下次函數(shù)調(diào)用時,這個值保持不變。 u8 IRcord[3]; //用來存放用戶碼、用戶反碼、數(shù)據(jù)碼、數(shù)據(jù)反碼 u8 position[25]; //用來存放一幀數(shù)據(jù)+頭碼共25位 bit in_ok; //接收完成標(biāo)志 bit dispose_ok ; //解碼完成標(biāo)志 void shu_ju_chu_li()//數(shù)據(jù)處理函數(shù) { u8 y,j,k=1; //局部變量 (K=1就是去掉引導(dǎo)位頭碼0位) u8 cord,value; //局部變量 for(y=0;y<3;y++)//處理3個字節(jié) { for(j=1;j<=8;j++) //處理1個字節(jié)8位 { cord= position[k]; //把儲存的數(shù)按位排列(K-第幾位) value=value>>1; // 低位右移 if(cord>=4) // 0.256MS*4=1M大于1Ms判斷為1 { value=value|0x80; //(value|0x80按位或,首位是最低位放最高位等下個數(shù)過來再右移) } u++; // 右移一次加一位 } position[y]= value; // 把按位排列好的數(shù)放在4組數(shù)里(y 是第幾組) value=0; //清0以便接收下次數(shù)據(jù) } dispose_ok=1; //處理完畢標(biāo)志位置1 } void InitTimer0(void) //定時器0初始化 { TMOD = 0x02; //設(shè)置定時器0,工作方式2,8位自動重載 TH0 = 0x0; TL0 = 0x0;//最大溢出值256us EA = 1; // 打開總中斷 ET0 = 1;// 定時器0允許位 TR0 = 1;// 計時 } void Timer0Interrupt(void) interrupt 1 //定時中斷函數(shù) { time++; } void Int0Init()//外部中斷初始化 { IT0=1; //外部中斷0允許位 EX0=1; //允許外部中斷0申請 EA=1; //打開總中斷 } void Int0()interrupt 0 //外部中斷0函數(shù) { u8 irin; if(irin) // //如果接收到信號 { if(time>=46&&time<78)// u=0; position[u]=time;//把接收的數(shù)據(jù)時間保存在irdata[u] time=0; //變量清0 u++; // 保存1位 if(u==25) //一幀數(shù)據(jù)+頭碼共33位 { in_ok=1; //一幀數(shù)據(jù)接收完成 u=0; //變量清0 } } else { time=0; //變量清0 irin=1; //初始化接收腳 } } void main () { Int0Init(); //調(diào)用外部中斷函數(shù) InitTimer0(); //調(diào)用定時中斷函數(shù) while(1) { if(in_ok) //如果收完成標(biāo)志為1 { shu_ju_chu_li(); //調(diào)用紅處理函數(shù) in_ok=0; //標(biāo)志清0 } if(dispose_ok ) //遙控成功接收 { if (~position[2]==0x8d) //取反IRcord[2]第組數(shù)據(jù),=? { position[2]=0; //清0以便接收下次數(shù)據(jù) led=~led; } } } } |
|