當前位置:編程學習大全網 - 編程語言 - 求紅外接收頭的單片機程序

求紅外接收頭的單片機程序

我給妳貼個現成的,開發板上的例子,版權註釋部分本站過濾問題弄不上

慧凈電子:1天入門、8天學會、28天精通PIC單片機與C語言視頻教程配套程序源碼

#include<pic.h>

__CONFIG(0xFF32);

//芯片配置字,看門狗關,上電延時開,掉電檢測關,低壓編程關,加密,4M晶體HS振蕩

#define uchar unsigned char

#define uint unsigned int

#define bitset(var,bitno)((var)|=1<<(bitno))

#define bitclr(var,bitno)((var)&=~(1<<(bitno)))

//下面這段程序用的是結構體的位域,方便進行位操作

//看不懂的可要補壹補C語言了

union {

struct

{

unsigned b0: 1;

unsigned b1: 1;

unsigned b2: 1;

unsigned b3: 1;

unsigned b4: 1;

unsigned b5: 1;

unsigned b6: 1;

unsigned b7: 1;

}

oneBit;

unsigned char allBits;

} myFlag;

#define CNT2_1 myFlag.oneBit.b1

#define CNT2_2 myFlag.oneBit.b2

#define CNT2_3 myFlag.oneBit.b3

#define CNT2 myFlag .allBits

static bit FLAGS ;

static bit Bitin;

union Csr

{ unsigned long i;

unsigned char Csra[4];

}myCsra;

#define RMT RE2 // ;遙控接收輸入腳位地址(RA。1)

#define BITIN 7 //遙控接收數據位位標誌

uchar CNT0, CNT3, CNT4; //用戶臨時寄存器1--4

uint CNT1;

uchar TABADD; //數碼管顯示碼取碼用寄存器

uchar CSR0; //;遙控鍵碼反碼寄存器

uchar CSR1; //;遙控器鍵碼寄存器

uchar CSR2; //;遙控器用戶碼高8位寄存器

uchar CSR3; //;遙控器用戶碼低8位寄存器

uchar FLAGS2; //;臨時寄存器

uchar CSR2A ; //遙控接收32位數據暫存寄存器

const unsigned char table[] = {0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f,

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

* 名 稱:initial

* 功 能:系統初始化子程序

* 入口參數:

* 出口參數:

* 說 明:

* 備 註:慧凈電子網 www.HLMCU.COM 慧凈空間 /hlmcu

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

void initial (void)

{

PORTA = 0;

ADCON1 = 7; // 設置RA口全部為普通數字IO口

TRISA = 0x00;

TRISE2 = 1; // 將RMT設置為輸入,其它所有IO口設置為輸出

TRISD = 0; // ;RC口全部為輸出

PORTD = 0xFF; //先讓數碼管全部不顯示

TRISC = 0xf0;

PORTC = 0x11;

}

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

* 名 稱:RCV()

* 功 能:紅外掃描譯碼

* 入口參數:

* 出口參數:

* 說 明:

* 備 註:慧凈電子網 www.HLMCU.COM 慧凈空間 /hlmcu

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

void RCV()

{

if (!RMT)

{

CNT1 = 640; //4*256*10us 640*16=10。24ms

CNT2 = 0;

//RCV1

do

{ // ;先檢測引導碼的9MS低電平_____┏┓

// ;每壹個循環16US

if (RMT)

CNT2 = CNT2++;

if (!RMT)

CNT2 = 0;

if (CNT2_2) //高電平大於8*10US=80US則為有效高電平,

break; //否則是壹些幹擾信號16*4=64us

}

while (CNT1--); //低電平大於4*256*10US=10.24MS則是錯誤脈沖

//RCV2

if (CNT2_2 && (0 < CNT1) && (CNT1 < 320)) //;低電平小於2*256*10US=5.12MS┏┒____

{ //320*16=5。12ms則是錯誤脈沖

CNT1 = 480; //;3*256*10us 480*16=7.68

CNT2 = 0;

//RCV3 //;每壹個循環16US

do

{

if (!RMT)

CNT2 = CNT2++;

if (RMT)

CNT2 = 0;

if (CNT2_2) // 低電平大於8*10US=80US則為有效低電平,否則是壹些幹擾信號

break; //RCV4,否則是壹些幹擾信號16*4=64us

// 高電平大於3*256*10US=7.68MS則是錯誤的

}

while (CNT1--);

//RCV4

if (CNT2_2 && (0 < CNT1) && (CNT1 < 320)) //高電平小於1*256*10US=2.56MS則是錯誤的

{ //480-320=160 *16= 2.56ms

CNT3 = 32; //接收數據***32位,16位用戶碼,8位控制碼加8位控制碼的反碼

//RCV5

do

{

CNT2 = 0;

CNT0 = 86; //低電平大於256-170=86*10US=860US錯誤 86*10 __┌┐

CNT4 = 200; //高電平大於256-56=200*10US=2MS錯誤 200*10

//RCV5_HI

do

{ //;每壹個循環10US

if (RMT)

CNT2 = CNT2++;

if (!RMT)

CNT2 = 0;

if (CNT2_3) //;高電平大於8*10US=80US則為有效高電平

break; //RCV6否則是壹些幹擾信號16*4=64us

//;低電平大於860US則是錯誤的

}

while (CNT0--);

//CV6

if ((CNT0 == 0) || (CNT2_3 == 0)) break;

CNT2 = 0;

//RCV6_LO

do

{ //┌┐__

if (!RMT)

CNT2 = CNT2++;

if (RMT)

CNT2 = 0;

if (CNT2_3) //低電平大於10*8US=80US則是有效低電平

break ; // COMPARE 否則是壹些幹擾信號16*4=64us

}

while (CNT4--); //高電平大於256-56=200*10US=2MS錯誤

if ((CNT4 == 0) || (CNT2_3 == 0)) break;

//OMPARE

CNT0 = (86 - CNT0) + (200 - CNT4) ;

//;減CNT0的值 等於實際低電平計數值

// ;減CNT4的值 等於實際高電平計數值

// ;將高低電平的計數加在壹起並存入CNT0,通過比較高低電平總的時間來確定是1還是0

// ;總的值大於255(即時間大於255*10US=2.55MS)則錯誤 255*10=2.55

// ;總的時間小於70*10US=700US則是錯誤的 70*10=700

if (( (70 < CNT0) && (CNT0 < 130)) || ((160 < CNT0) && (CNT0 < 230) ) ) // ;130*10=1.3MS

{

if ((70 < CNT0) && (CNT0 < 130))

//COMPARE_H // ;時間大於1.3MS轉去確定是否1

Bitin = 0; //;時間在700US-1.3MS之間則是0

else // if (160<CNT0<230) //;小於160*10US=1.6MS,則錯誤

//;大於230*10US=2.3MS,則錯誤

Bitin = 1; // ;時間在1.6MS-2.3MS之間則是1

myCsra.i = myCsra.i >> 1; //;將每壹位移入相應寄存器

if (Bitin)

bitset ( myCsra. Csra[3], 7);

else bitclr ( myCsra. Csra[3], 7);

}

else break;

}

while (CNT3--); //;是否接收完32位

CSR3 = myCsra. Csra[0];

CSR2 = myCsra. Csra[1];

CSR1 = myCsra. Csra[2];

CSR0 = myCsra. Csra[3];

CSR2A = ~CSR0; //;比較鍵碼的反碼取反後是否等於鍵碼

//;不等於則接收到的是錯誤的信息

// 將鍵碼送顯示

}

}

}

}

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

* 名 稱:display()

* 功 能:數碼管顯示

* 入口參數:

* 出口參數:

* 說 明:

* 備 註:慧凈電子網 www.HLMCU.COM 慧凈空間 /hlmcu

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

void display()

{

int i, j; //定義查表變量

i = CSR3 & 0x0f;

PORTD = table[i]; //送D口顯示

PORTA = 0x1;

for (j = 0;j < 50;j++); //延長壹段時間,保證亮度

i = CSR3 & 0xf0;

i = i >> 4; //右移4位

PORTD = table[i]; //送D口顯示

PORTA = 0x2;

for (j = 0;j < 50;j++); //延長壹段時間,保證亮度

i = CSR2 & 0x0f;

PORTD = table[i]; //送D口顯示,並顯示小數點

PORTA = 0x4;

for (j = 0;j < 50;j++); //延長壹段時間,保證亮度

i = CSR2 & 0xf0;

i = i >> 4;

PORTD = table[i]; //送D口顯示

PORTA = 0x6;

for (j = 0;j < 50;j++); //延長壹段時間,保證亮度

i = CSR1 & 0x0f;

PORTD = table[i]; //送D口顯示,並加上小數點

PORTA = 0x8;

NOP(); //延長壹段時間,保證亮度

for (j = 0;j < 50;j++);

i = CSR1 & 0xf0;

i = i >> 4;

PORTD = table[i]; //送D口顯示

PORTA = 0x0A;

NOP(); //延長壹段時間,保證亮度

for (j = 0;j < 50;j++);

}

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

* 名 稱:main

* 功 能:主程序

* 入口參數:

* 出口參數:

* 說 明:

* 備 註:慧凈電子網 www.HLMCU.COM 慧凈空間 /hlmcu

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

void main(void)

{

initial (); //系統初始化子程序

while (1)

{

RCV(); //遙控接收程序

display(); //解碼顯示程序

}

}

  • 上一篇:為什麽網頁建立960為什麽網頁建立960不能用
  • 下一篇:如何加強關工委制度建設,不斷提升關工委工作科學化,規範化水平
  • copyright 2024編程學習大全網