當前位置:編程學習大全網 - 編程語言 - 求51單片機紅外搖控接收c程序,並在數碼管上顯示鍵值出來?

求51單片機紅外搖控接收c程序,並在數碼管上顯示鍵值出來?

#include<reg51.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

#define Nop() {_nop_(); _nop_(); _nop_(); _nop_(); _nop_();}

volatile ulong IRcode=0x00000000; //32位的鍵代碼

volatile ulong Irdcode=0x00000000;

volatile uint customcode=0x0000; //16位用戶碼

volatile uint time_us=0x0000; //兩個下降沿之間的時間

volatile uchar timeH,timeL; //保存TH1 TL的值

uchar Lcustomcode; //低8用戶碼

uchar Hcustomcode; //高8

uchar datacode; //8位鍵數據碼

uchar mycode;

uchar Rdatacode; //8位鍵數據反碼

uchar uc1ms;

uchar uc10ms;

uchar uc3ms;

uchar ucDispTime;

uchar ucDispOrder;

uchar ucDispCon;

uchar ucSpeakerTime;

unsigned char code LedData[16] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

unsigned char code LedCon[2] = {0x8f,0x4f};

unsigned char ucDispData[2]; // 存放顯示數據

sbit led1 = P3^7;

sbit led2 = P3^6;

sbit power=P1^0; //電源開關

sbit BEEP= P2^1;

bit NewIRcode=0; //指示當處理完了32位碼後,就有了新的遙控碼

bit DataRight=0; //為1時讀取數據正確

bit bSampleOk;

bit bSampling;

bit b10msInt;

bit b1msInt;

bit bKeySound;

bit b1msMain;

bit IR_E; //表示有新的遙控鍵控下就更新掃描數據

bit b3msint;

void SendDataToDispDevice();

void Ir_process();

void display();

void beeping();

/****** 晶振為12 MHZ*******/

/**定時器1,12 MHZ最大定時為65.53ms***/

//------------------------------------------------------------------------------

void init()

{

IP=0x09; //定時器1,外部中斷0優先級高

TMOD=0x11; //定時器0,工作方式1 ; 定時器1,工作方式1

TCON=0x01; //外中斷0下降沿觸發,(包括TR1=0,TR0=0)

TH0=0xff; //初始化定時器0,定時0.2ms

TL0=0x47;

TH1=0x00; //初始化定時器1

TL1=0x00;

EA=1; //開全中斷

ET0=1; //開放T0中斷

ET1=1; //開放T1中斷

EX0=1; //開放INT0

TR1=0;

TR0=1;

}

//--------------------------------------

void TimeProg(void)

{

b1msMain = b1msInt;

b1msMain=0;

b10msInt = 0;

if(b1msInt == 1)

{

b1msMain=1;

if(++uc10ms == 10)

{

uc10ms = 0;

b10msInt = 1;

if(bKeySound==1)

{ beeping();

bKeySound=0;

}

}

}

}//void TimeProg(void)

//-------------------------------------interrupt0-------------------------------------

void IR_ISR() interrupt 0 using 1 //遙控器中斷處理函數

{

static uchar cn;

TR1=0;

timeH=TH1;

timeL=TL1;

TH1=0;

TL1=0;

TR1=1; //開定時器中斷1

time_us=(unsigned int)timeH;

time_us=time_us<<8;

time_us=time_us|timeL;

if(time_us>12200&&time_us<13000) {cn=1;IRcode=0;} //遇到引導碼,就把cn清0,IRcode清0

//引導碼的時間長度為9ms+4.5ms

if(cn<34)

{

if(time_us>950&&time_us<1120) //0

{

IRcode=IRcode|0x00000000;

if(cn<33) IRcode=IRcode>>1;

}

else if(time_us>1920&&time_us<2120) //1t > 1950 && t < 2150

{

IRcode=IRcode|0x80000000;

if(cn<33) IRcode=IRcode>>1;

}

//else if(time_us>10000&&time_us<11000) {Irdcode=IRcode;cn=34; } //遇到重復碼

//cn用於記錄接收到的數據位

}

cn++;

if(cn==34)

{ NewIRcode=1;

TR1=0;

Irdcode= IRcode; cn=0;

} //讀完32位碼,則有新碼產生

}

//--------------------------------------timer_ISR------------------------------

void Timer0_ISR() interrupt 1 using 2 //定時器0中斷函數

{

TR0=0;

TH0=0xff; //初始化定時器0,定時0.2ms 晶振為11.0592 MHZ

TL0=0x47;

TR0=1;

if(++uc1ms == 5)

{

uc1ms = 0;

b1msInt=1;

if(++uc3ms==8)

{

uc3ms=0;

b3msint=1;

SendDataToDispDevice(); //n* ms送壹次顯示

}

}

}//void Timer0IntProg() interrupt 1 using 1

void Timer1_ISR() interrupt 3 using 3 //定時器1中斷函數

{

TR1=0;

TH1=0x00; //初始化定時器1

TL1=0x00;

TR1=1;

}

//--------------------SendDataToDispDevice----------

void SendDataToDispDevice()

{

unsigned char n;

//watchdog();

if(++ucDispOrder >= 2) ucDispOrder = 0; // 下壹顯示巡回

// 下面為發送控制數據 位控

if(ucDispOrder==0)

{led1=0;

led2=1;

Nop();

Nop();

}

if(b3msint==1)

{if(ucDispOrder==1)

{led2=0;

led1=1;

Nop();

Nop();

}

}

// 下面為發送顯示數據

n = LedData[ucDispData[ucDispOrder]];

P0=n;

} //void SendDataToDispDevice()

//------------------------------------main()----------------------------------------------

void main()

{

init();

beeping();

while(1)

{

TimeProg();

Ir_process();

display();

}

}

void Ir_process()

{

if(NewIRcode==1) //如果有新的遙控碼就讀

{

NewIRcode=0; //讀完之後清零,表示新碼已讀

customcode=(Irdcode>>16); //取紅外碼中的按碼鍵

//取低8位用戶碼

Lcustomcode=customcode>>8;//取低8位按碼鍵

datacode=(unsigned char)(customcode&0x00ff); //取高8位按碼鍵

Rdatacode=Lcustomcode; //取低8位按碼鍵的反碼

if(~Rdatacode!=datacode)

{ DataRight=0;

Irdcode=0;

datacode=Rdatacode=0;

} //校驗用戶碼,反碼

else

{ DataRight=1;

IR_E=1;

mycode=datacode;}

if(DataRight==1) { bKeySound = 1;DataRight=0; }

}

}

void display()

{

/* unsigned char a[2];

a[0] = mycode & 0x0f;

mycode = mycode >> 4;

a[1] = mycode & 0x0f;

ET0 = 0;

ucDispData[0] = a[0];

ucDispData[1] = a[1];

ET0 = 1;*/

if(IR_E==1)

{

ET0 = 0;

ucDispData[0] = mycode & 0x0f;

mycode = mycode >> 4;

ucDispData[1] = mycode & 0x0f;

IR_E=0;

ET0 = 1;

}

}

/**********************************************************/

void delay(unsigned char x) //x*0.14MS

{

unsigned char a;

while(x--)

{

for (a = 0; a<13; a++) {;}

}

}

/**********************************************************/

void beeping()

{

unsigned char i;

for (i=0;i<100;i++)

{

delay(4);

BEEP=!BEEP; //BEEP取反

}

BEEP=1;

//關閉蜂鳴器

}

  • 上一篇:機械類考研具體有哪些專業分別要考什麽科目
  • 下一篇:魔獸世界裏的bug是怎麽發現的啊?
  • copyright 2024編程學習大全網