?? wang(c).c
字號:
#include <at89x51.h>
void delay0() //精確延時898微妙
{int i,j;
for(i=0;i<9;i++)
for(j=0;j<11;j++)
{;}
}
void delay1() //精確延時4822微妙
{int i,j;
for(i=0;i<45;i++)
for(j=0;j<12;j++)
{;}
}
void delay2() //精確延時970微妙
{int i,j;
for(i=0;i<9;i++)
for(j=0;j<12;j++)
{;}
}
void interrupt0() interrupt 0 using 2
{ int i,j;bit flag;unsigned char data1=0x00,data2=0x00;//存放數據碼
unsigned int code1=0x00,code2=0x00; //存放系統碼
EA=0 ; //暫時關閉CPU的所有中斷請求
for(i=0;i<9;i++)
{delay0(); //;調用882微秒延時子程序
if(P3_2==1) //;延時882微秒后判斷P3.2腳是否出現高電平如果有就退出解碼程序
goto exit;}
//重復10次,目的是檢測在8820微秒內如果出現高電平就退出解碼程序
//;以上完成對遙控信號的9000微秒的初始低電平信號的識別。
while(!P3_2);//毫秒低電平引導脈沖
delay1();//4.74毫秒避開4.5毫秒的結果碼
for(j=0;j<26;j++)//;忽略前26位系統識別碼
{while(!P3_2);//等待地址碼第一位的高電平信號
delay0();//高電平開始后用882微秒的時間尺去判斷信號此時的高低電平狀態
flag=P3_2;//將P3.2引腳此時的電平狀態0或1存入C中
if(flag==1)
delay2();//檢測到高電平1的話延時1毫秒等待脈沖高電平結束
if(j<=12)
{code1=code1>>1;
if(flag)
code1=code1+0x1000;}
else
{code2=code2>>1;
if(flag)
code2=code2+0x1000;}
}
if((code1!=0x0119)||(code2!=0x1ee6))//識別系統碼
goto exit;
for(j=0;j<2;j++)
for(i=0;i<8;i++)
{while(!P3_2);
delay0();
flag=P3_2;
if(flag==1)
delay2();//檢測到高電平1的話延時1毫秒等待脈沖高電平結束
if(j==0)
{data1=data1>>1;
if(flag)
data1=data1+0x80;}
else
{data2=data2>>1;
if(flag)
data2=data2+0x80;}
}
if((data1^data2)!=0xff)
goto exit;
P2=data1;//;將按鍵的鍵值通過P1口的8個LED顯示出來!
P1_0=1;//;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功
delay1();
delay1();
delay1();
P1_0=0;//;蜂鳴器停止
exit: EA =1;//允許中斷
}
void main()
{ EA=1 ;//打開CPU總中斷請求
IT0=1 ;//設定INT0的觸發方式為脈沖負邊沿觸發
EX0=1 ;//打開INT0中斷請求
// ;以下對單片機的所有引腳進行初始化,全部設置成高電平
P1=0xfe;
P2=0xff;
while(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -