性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

PIC16F877A 單片機(jī) 紅外線遙控 解碼函數(shù)求解答?

買了本學(xué)習(xí)PIC單片機(jī)的書,光盤中帶的函數(shù)如下,但是現(xiàn)在不能正常解碼,求各位大師傅們能給解惑。指導(dǎo)一下RVC紅外掃描譯碼部分的函數(shù)。
#include
__CONFIG(0x2F02);
//芯片配置字,看門狗關(guān),上電延時(shí)開,掉電檢測關(guān),低壓編程關(guān),加密,4M晶體HS振蕩
#define uchar  unsigned char
#define uint   unsigned int
#define bitset(var,bitno)((var)|=1<<(bitno))
#define bitclr(var,bitno)((var)&=~(1<<(bitno)))
//下面這段程序用的是結(jié)構(gòu)體的位域,方便進(jìn)行位操作
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                               //遙控接收數(shù)據(jù)位位標(biāo)志
uchar CNT0, CNT3, CNT4;                         //用戶臨時(shí)寄存器1--4
uint CNT1;
uchar TABADD;                                  //數(shù)碼管顯示碼取碼用寄存器
uchar CSR0;                                    //;遙控鍵碼反碼寄存器
uchar CSR1;                                    //;遙控器鍵碼寄存器
uchar CSR2;                                    //;遙控器用戶碼高8位寄存器
uchar CSR3;                                    //;遙控器用戶碼低8位寄存器
uchar FLAGS2;                                  //;臨時(shí)寄存器
uchar CSR2A ;                                  //遙控接收32位數(shù)據(jù)暫存寄存器
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,
//*************延時(shí)函數(shù)*************
void delay(uint xms,uint xus)
{
	int i,j;
	for(i=0;i>xms;i--);
	{for(j=0;j>xus;j--);}
}
/****************************************************************************
* 名    稱:initial 
* 功    能:系統(tǒng)初始化子程序
****************************************************************************/
void initial (void)
{	
	T2CON=0X07;
	ADCON1 = 0x07;                	//設(shè)置RA口全部為普通數(shù)字IO口
	TRISA = 0x00;					//RA設(shè)置為輸出模式
	PORTA = 0X00;					//RA輸出低電位
	TRISE2 = 1 ;					//將RMT設(shè)置為輸入,其它所有IO口設(shè)置為輸出
	TRISD = 0X00;                  	//RC口全部為輸出
	PORTD = 0xFF;              		//先讓數(shù)碼管全部不顯示
	TRISC = 0xf0;					//RC高四位為輸入,低四位為輸出
	PORTC = 0x11;
}
/****************************************************************************
* 名    稱:RCV() 
* 功    能:紅外掃描譯碼
****************************************************************************/
void RCV()
{
	if (!RMT)
	{
		CNT1 = 640;   			//4*256*10us  640*16=10。24ms
		CNT2 = 0;				//RCV1
//		delay(10,240);
		do
		{   					// ;先檢測引導(dǎo)碼的9MS低電平_____┏┓
								// ;每一個(gè)循環(huán)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則是錯(cuò)誤脈沖
		//RCV2
		if (CNT2_2 && (0 < CNT1) && (CNT1 < 320)) //;低電平小于2*256*10US=5.12MS┏┒____//320*16=5。12ms則是錯(cuò)誤脈沖
		{                                       
			CNT1 = 480;                            //;3*256*10us  480*16=7.68
//			delay(7,680);
			CNT2 = 0;
			//RCV3          //;每一個(gè)循環(huán)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則是錯(cuò)誤的
			}
			while (CNT1--);

			//RCV4

			if (CNT2_2 && (0 < CNT1) && (CNT1 < 320)) //高電平小于1*256*10US=2.56MS則是錯(cuò)誤的
			{                                 //480-320=160 *16= 2.56ms
				CNT3 = 32;                   //接收數(shù)據(jù)共32位,16位用戶碼,8位控制碼加8位控制碼的反碼
				//RCV5
				do
				{
					CNT2 = 0;
					CNT0 = 86;                  //低電平大于256-170=86*10US=860US錯(cuò)誤 86*10 __┌┐
					CNT4 = 200;                 //高電平大于256-56=200*10US=2MS錯(cuò)誤   200*10
					//RCV5_HI
					do
					{                    //;每一個(gè)循環(huán)10US
						if (RMT)
							CNT2 = CNT2++;
						if (!RMT)
							CNT2 = 0;
						if (CNT2_3)         //;高電平大于8*10US=80US則為有效高電平
							break;          //RCV6否則是一些干擾信號16*4=64us

						//;低電平大于860US則是錯(cuò)誤的
					}
					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錯(cuò)誤

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

					//OMPARE
					CNT0 = (86 - CNT0) + (200 - CNT4) ;
					//;減CNT0的值  等于實(shí)際低電平計(jì)數(shù)值
					// ;減CNT4的值  等于實(shí)際高電平計(jì)數(shù)值
					// ;將高低電平的計(jì)數(shù)加在一起并存入CNT0,通過比較高低電平總的時(shí)間來確定是1還是0
					// ;總的值大于255(即時(shí)間大于255*10US=2.55MS)則錯(cuò)誤  255*10=2.55
					// ;總的時(shí)間小于70*10US=700US則是錯(cuò)誤的            70*10=700
					if (( (70 < CNT0) && (CNT0 < 130)) || ((160 < CNT0) && (CNT0 < 230) ) ) // ;130*10=1.3MS
					{
						if ((70 < CNT0) && (CNT0 < 130))
							//COMPARE_H   // ;時(shí)間大于1.3MS轉(zhuǎn)去確定是否1
							Bitin = 0;           //;時(shí)間在700US-1.3MS之間則是0
						else // if (160> 1;      //;將每一位移入相應(yīng)寄存器
						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;  //;比較鍵碼的反碼取反后是否等于鍵碼
				//;不等于則接收到的是錯(cuò)誤的信息
				// 將鍵碼送顯示
			}

		}

	}

}

/****************************************************************************
* 名    稱:display() 
* 功    能:數(shù)碼管顯示
****************************************************************************/
void display()
{
	int i, j;                  	//定義查表變量
	i = CSR1 & 0x0f;
	PORTD = table[i];         	//送D口顯示,并加上小數(shù)點(diǎn)
	PORTA = 0x10;
	NOP();                   	//延長一段時(shí)間,保證亮度
	for (j = 0;j < 50;j++);

	i = CSR1 & 0xf0;
	i = i >> 4;					//向左移四位
	PORTD = table[i];         	//送D口顯示
	PORTA = 0x20;
	NOP();                 		//延長一段時(shí)間,保證亮度
	for (j = 0;j < 50;j++);

}

/****************************************************************************
* 名    稱:main
* 功    能:主程序
****************************************************************************/
void main(void)
{
	initial ();                //系統(tǒng)初始化子程序
	while (1)
	{
		RCV();               //遙控接收程序
		display();           //解碼顯示程序
	}
}

全部回復(fù)(1)
正序查看
倒序查看
2016-06-21 10:34
幫你頂,來大神解答哇~
0
回復(fù)
發(fā)