?? ir_shu_ma_guan.c
字號:
/****************************************
程序功能:紅外一體化接收遙控器的編碼并解碼,
LED數碼管顯示遙控器按下的數字,并且如果
紅外解碼成功的話, 蜂鳴器發出"滴滴"的聲音
表示解碼成功
****************************************/
#include <reg52.h>
#include <stdio.h>
sbit sound=P3^3; //蜂鳴器
sbit IR=P3^2; //P3.2為紅外一體化接收
unsigned char dm,i,j,k;
unsigned char aa[2]; //定義2個數組,用來存儲代碼,8位的數據碼和8位的數據反碼
unsigned long bb; //定義bb用來存放用戶識別碼,這里采用的是26位的用戶識別
//0.9ms
void delay0_9ms(void)
{
unsigned char j,k;
for(j=18;j>0;j--)
for(k=20;k>0;k--) ;
}
//1ms
void delay1ms(void)
{
unsigned char i,j;
for(i=2;i>0;i--)
for(j=230;j>0;j--) ;
}
//4.5ms
void delay4_5ms(void)
{
unsigned char i,j;
for(i=10;i>0;i--)
for(j=225;j>0;j--) ;
}
//100ms
void delay100ms(void)
{
unsigned char i,j,k;
for(i=200;i>0;i--)
for(j=20;j>0;j--)
for(k=10;k>0;k--) ;
}
LED_display(unsigned char date)
{
switch(date)
{
case 0x11: {P1=0x00;P2=0xf9;break;} //顯示1
case 0x12: {P1=0x00;P2=0xa4;break;} //顯示2
case 0x13: {P1=0x00;P2=0xb0;break;} //顯示3
case 0x14: {P1=0x00;P2=0x99;break;} //顯示4
case 0x15: {P1=0x00;P2=0x92;break;} //顯示5
case 0x16: {P1=0x00;P2=0x82;break;} //顯示6
case 0x17: {P1=0x00;P2=0xf8;break;} //顯示7
case 0x18: {P1=0x00;P2=0x80;break;} //顯示8
case 0x19: {P1=0x00;P2=0x90;break;} //顯示9
case 0x10: {P1=0x00;P2=0xc0;break;} //顯示0
default: {P1=0x00;P2=0xb6;} //顯示錯誤
}
}
void main()
{
IT0=1; //外部中斷0觸發方式控制位,下降沿觸發
EX0=1; //外部中斷0(INT0)中斷允許位
EA=1; //總中斷
dm=0;
P2=0xc0;
P1=0x00;
while(1);
}
void t0(void) interrupt 0 using 2//外部中斷0的函數
{
EA=0; //暫時關閉CPU的所有中斷請求
for(k=0;k<10;k++) //重復10次,目的是檢測在9毫秒內如果出現高電平就退出解碼程序
{ //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
delay0_9ms(); //延時0.9毫秒
if (IR==1) {k=10;break;} //延時0.9毫秒后判斷P3.2腳是否出現高電平如果有就退出解碼程序
else if(k==9) //重復10次?
{ //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
while(IR==0); //等待高電平避開9毫秒低電平引導脈沖
delay4_5ms(); //延時4.5毫秒避開4.5毫秒的結果碼
/********************************************
//26位的用戶碼,前13位數據碼,后13位數據反碼
*********************************************/
for(j=1;j<=26;j++)//每組數據為26位
{
while(IR==0); //
delay0_9ms();
if(IR==1)
{
delay1ms();
dm=dm|0x2000000; //因為是26位,一個"1",后面25個"0",轉化二進制即為"1000000"
if(j<26) dm=dm>>1; //數據"1",右移一個"1",一共25次
}
else if(j<26) dm=dm>>1; //數據"0",一共25次
}
bb=dm;
dm=0;
/***************************************************
//16位的用戶碼,前8位數據碼,后8位數據反碼
****************************************************/
for(i=0;i<2;i++)
{
for(j=1;j<=8;j++)//每組數據為8位
{
while(IR==0); //
delay0_9ms();
if(IR==1)
{
delay1ms();
dm=dm|0x80;
if(j<8) dm=dm>>1; //數據"1",右移一個"1",一共7次
}
else if(j<8) dm=dm>>1; //數據"0",一共7次
}
aa[i]=dm;
dm=0;
}
/***************************************************
//顯示部分
****************************************************/
if(aa[0]==~aa[1]) //驗證成功
{
sound=0;
delay100ms();
LED_display(aa[0]);
sound=1;
}
} //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
} //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
EA=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -