⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 使用2051单片机对2272进行解码的完全代码,可直接拿来修改成很强的遥控器.
💻 C
字号:
#include <reg51.h>


sbit LED1 = P1^2;
sbit LED2 = P1^4;
sbit IR_IN = P3^2;

void init_serialcomm(void)
{
    SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
    TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload 
    PCON |= 0x80;       //SMOD=1; 
    TH1   = 0xFF;       //Baud:4800  fosc=11.0592MHz  :f4
    //IE   |= 0x90;       //Enable Serial Interrupt 
    TR1   = 1;          // timer 1 run 
	TI=1; 
}


unsigned char ir_timer=0,jiffies=0;
void clock_timer(void) interrupt 1 using 1{
	ir_timer++;
	jiffies++;
}

void clock_init(void){
	jiffies = 0;
	TMOD=0x02;
//	TH0=TL0=0x9b;//12M
//	TH0=TL0=0x7a;//16M
//	TH0=TL0=0x75;//16.59M
//	TH0=TL0=0x72;//17M
//	TH0=TL0=0x37;//24M
	TH0=TL0=0xa0;//22M
	EA=1;
	ET0=1;

	TR0=1;
}

unsigned char ir_step=0;
unsigned int ir_addr;
unsigned char ir_data;
void ir_test(void){
	bit ir_status,ir_last_status;
	unsigned char __ir_timer;

	ir_status=IR_IN;

	if (ir_last_status==ir_status){//超时处理
		if (ir_step>0 && ir_timer>0xb0){
			ir_timer=0;
			ir_step=0;
		}
		return;
	}

	__ir_timer=ir_timer;
	ir_timer=0;
	ir_step++;
	ir_last_status=ir_status;

	if(ir_step < 50 && __ir_timer > 0x18){//误码处理,提前出现数据码以外的非正常宽度编码,正常数据码宽度应小于0x10
		ir_step = 0;
		return;
	}

//0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 94
//0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 94

	if(ir_step <= 32){
		if((ir_step & 3)==2 || (ir_step & 3)==3){
			ir_addr >>= 1;
			if(__ir_timer < 0xa)
				ir_addr &= 0x7fff;
			else
				ir_addr |= 0x8000;
		}
		if(ir_step==16){
			TI=0;
			SBUF=(ir_addr>>8);
		}
		if(ir_step==32){
			TI=0;
			SBUF=(ir_addr>>8);
		}
	}else
	if(ir_step>32 && ir_step<=48){
		if((ir_step & 1)==0){
			ir_data >>= 1;
			if(__ir_timer < 0xa)
				ir_data &= 0x7f;
			else
				ir_data |= 0x80;
		}
		if(ir_step==48){
			TI=0;
			SBUF=(ir_data);
		}
	}else
	if(ir_step>48 && ir_step<=50){
		if(ir_step==50){
			ir_timer=0;
			ir_step=0;
			TI=0;
			if (__ir_timer > 0x90 && __ir_timer < 0xa0)
				SBUF=0xaa;
			else
				SBUF=0x55;
		}
	}
}

enum  eepromtype  {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
bit   RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
				unsigned char ControlByte,enum eepromtype EepromType);

unsigned char buf[8]={1,2,3,4,5,6,7,9};
void eeprom_read_test(unsigned char page){
	unsigned char i,j,c;
	for(i=0; i<32; i++){
		for(j=0; j<8; j++){
			buf[j]=1;
		}
		c = 0xa1 | page<<1;
		if(RW24XX(buf, 8, (unsigned int)((i*8)), c, M2408)){
			TI=0;
			SBUF=0x55;
		}
		for(j=0; j<8; j++){
			while(!TI);
			TI=0;
			SBUF=buf[j];
		}
	}
}
void eeprom_write_test(unsigned char page){
	unsigned char i,j,c;
	for(i=0; i<32; i++){
		for(j=0; j<8; j++){
			buf[j]=j<<1;
		}
		c = 0xa0 | page<<1;
		RW24XX(buf, 8, (unsigned int)(i*8), c, M2408);
	}
}

void wait(unsigned int t){
	while(t--)
		t=t;
}


void clock_test(){
	unsigned char i,d;
	unsigned char pdata *source=0;
//	for(i=0; i<128; i++){
//		source=i;
//		*source = i>>1;
//	}
	for(i=0; i<128; i++){
		source=i;
		d=*source;
		while(!TI);
		TI=0;
		SBUF=d;
	}
}

void setup12887(unsigned char *p);
void read12887(unsigned *p);
void start12887(void);

void main(){
	clock_init();
	init_serialcomm();
	wait(60000);
	wait(60000);
	wait(60000);

	while(0){
		ir_test();
	}
	{
		unsigned char p_w;
		bit ir_status,ir_last_status;
		LED1=0;
		LED2=1;
		ir_status=ir_last_status=1;
	while(1){
		while(1){
			ir_status=IR_IN;
			if (ir_last_status!=ir_status){
				ir_last_status=ir_status;
				break;
			}
		}
		p_w=jiffies;
		jiffies=0;

		while(!TI);
		TI=0;
		SBUF=p_w;
		LED1=!LED1;
		LED2=!LED2;
	}
	}
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -