99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖

PIC16F877A 單片機 紅外線遙控 解碼函數求解答?

買了本學習PIC單片機的書,光盤中帶的函數如下,但是現在不能正常解碼,求各位大師傅們能給解惑。指導一下RVC紅外掃描譯碼部分的函數。
#include
__CONFIG(0x2F02);
//芯片配置字,看門狗關,上電延時開,掉電檢測關,低壓編程關,加密,4M晶體HS振蕩
#define uchar  unsigned char
#define uint   unsigned int
#define bitset(var,bitno)((var)|=1<<(bitno))
#define bitclr(var,bitno)((var)&=~(1<<(bitno)))
//下面這段程序用的是結構體的位域,方便進行位操作
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,
//*************延時函數*************
void delay(uint xms,uint xus)
{
	int i,j;
	for(i=0;i>xms;i--);
	{for(j=0;j>xus;j--);}
}
/****************************************************************************
* 名    稱:initial 
* 功    能:系統初始化子程序
****************************************************************************/
void initial (void)
{	
	T2CON=0X07;
	ADCON1 = 0x07;                	//設置RA口全部為普通數字IO口
	TRISA = 0x00;					//RA設置為輸出模式
	PORTA = 0X00;					//RA輸出低電位
	TRISE2 = 1 ;					//將RMT設置為輸入,其它所有IO口設置為輸出
	TRISD = 0X00;                  	//RC口全部為輸出
	PORTD = 0xFF;              		//先讓數碼管全部不顯示
	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
		{   					// ;先檢測引導碼的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
//			delay(7,680);
			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> 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() 
* 功    能:數碼管顯示
****************************************************************************/
void display()
{
	int i, j;                  	//定義查表變量
	i = CSR1 & 0x0f;
	PORTD = table[i];         	//送D口顯示,并加上小數點
	PORTA = 0x10;
	NOP();                   	//延長一段時間,保證亮度
	for (j = 0;j < 50;j++);

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

}

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

全部回復(1)
正序查看
倒序查看
2016-06-21 10:34
幫你頂,來大神解答哇~
0
回復
主站蜘蛛池模板: 亚洲有吗在线观看 | 在线高清理伦片a | 国产69精品久久久久孕妇 | 成人免费毛片片v | 蜜臀精品国产高清在线观看 | 欧美一性一交一A片费看 | 午夜精品久久久久9999高清 | 久久精品成人一区二区三区 | 探花bt| 久久WWW成人看片免费不卡 | 久久字幕精品一区 | 阿公抱着我边摸边吃奶视频 | 999久久久免费精品播放 | 女主播扒开屁股给粉丝看尿口 | 亚洲精品无码一区二区三区 | 日日摸夜夜添夜夜无码区 | 亚洲综合另类小说色区 | 免费又黄又爽又猛大片午夜 | 日韩亚洲国产中文字幕欧美 | 超碰在线观看av | 亚洲精品国产精品乱码不卞 | 97超碰人人干 | 久久伊人精品一区二区三区 | 色呦呦免费看 | 人妻系列无码专区久久五月天 | 亚洲国产精品国自产拍久久 | 久热精品在线播放 | 35岁少妇被23岁小伙征服 | 狠狠躁日日躁狂躁夜夜躁 | 影视先锋男人无码在线 | 国产香蕉97碰碰视频VA碰碰看 | 天堂网www天堂在线资源库 | 中国亚州女人69内射少妇 | 天天做天天爱天天爽综合网 | 伊人久久一区二区三区无码 | 九九欧美视频 | 涩涩一区二区 | 浴室洗澡偷拍一区二区 | 国产一区二区0 | 国产精久久久久久 | 中文字幕一区二区在线视频 |