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

📄 test.c.bak

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


sbit FS1 = P1^0;
sbit FS2 = P1^1;
sbit BEEP = P1^4;
sbit IR_IN = P3^2;

unsigned char ir_timer=0;
unsigned int 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=0x40;//22M
	EA=1;
	ET0=1;

	TR0=1;
}
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
	RI=0;
	TI=1; 
}

void serial_out(unsigned char d){
	while(!TI);
	TI=0;
	SBUF=(d);
}

//等待指定长度的串行数据到达,超时值为每两个字节之间的间隔时间而非等待整个串的时间.
//超时单位为time_out * 100uS,为0时为永久等待
bit wait_serial(unsigned char *p, unsigned char len, unsigned char time_out){
	unsigned int time=jiffies;
	unsigned char n=0;
	while(time_out == 0 || jiffies-time < time_out){
		if (RI){
			p[n++]=SBUF;
			RI=0;
			if(n==len)
				return 0;
			time=jiffies;
		}
	}
	return 1;
}

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

	if (ir_step == 50)//数据未取走,停止红外接收.
		return;

	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
//数据转换规则:前32位每4位取中间两位,合成16字节地址,之后16位每两位取第1位,得到8位键值
//地址:ED FF
//键值:FC F3 CF 3F  分别对应按键A,B,C,D

	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;
		}
	}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;
		}
	}else
	if(ir_step>48 && ir_step<=50){
		if(ir_step==50){
			if (__ir_timer < 0x90 || __ir_timer > 0xa0)//接收码收0x94结束,未收到该码则为出错
				ir_step=0;
			else{
				ir_buf[0]=ir_addr>>8;
				ir_buf[1]=ir_addr;
				ir_buf[2]=ir_data;
			}
		}
	}
}


void ee_write(unsigned char ee_addrh,unsigned char ee_addrl,unsigned char ee_num,unsigned char *sp);
void ee_read(unsigned char ee_addrh,unsigned char ee_addrl,unsigned char ee_num,unsigned char *sp);

void setup12887(unsigned char *p);//*p指向7字节数组,从0到6分别是秒 分 时 星期 日 月 年
void read12887(unsigned char *p);//*p指向7字节数组,从0到6分别是秒 分 时 星期 日 月 年
void start12887(void);

unsigned char date[7];

void sleep(unsigned int t){
	unsigned int time=jiffies;
	while(jiffies-time<t);
}

typedef struct log_s{
	unsigned char index;
	unsigned char year;
	unsigned char month;
	unsigned char day;
	unsigned char hou;
	unsigned char min;
	unsigned char sec;
	unsigned char rsv1;
} log_t;

#include <string.h>
unsigned char log_pos=0;
unsigned char log_index=0;
#define MAX_LOGS 60

void find_log_pos(){
	log_t log;
	log_index=0;
	log_pos=0;

	memset((void *)&log, 0xff, sizeof(log_t));
	ee_read(log_pos>>5, log_pos<<3, sizeof(log_t), (unsigned char*)&log);
	if(log.year==0xff)
		return;
	log_index=log.index;

	for(log_pos=1; log_pos<MAX_LOGS; log_pos++){
		memset((void *)&log, 0xff, sizeof(log_t));
		ee_read(log_pos>>5, log_pos<<3, sizeof(log_t), (unsigned char*)&log);
		log_index++;
		if(log.year==0xff)
			return;
		if(log.index == log_index)
			continue;
		return;
	}
	if (log_pos==MAX_LOGS)
		log_index++;
}

void write_log(){
	log_t log;

	memset((void *)&log, 0xff, sizeof(log_t));
	if(log_pos>=MAX_LOGS)
		log_pos=0;

	read12887(date);
	log.index=log_index;
	log.year=date[6];
	log.month=date[5];
	log.day=date[4];
	log.hou=date[2];
	log.min=date[1];
	log.sec=date[0];
	ee_write(log_pos>>5, (log_pos<<3)&0xff, sizeof(log_t), (unsigned char*)&log);
	log_pos++;
	log_index++;
}

void clear_log(){
	log_t log;

	memset((void *)&log, 0xff, sizeof(log_t));
	for(log_pos=0; log_pos<MAX_LOGS; log_pos++){
		ee_write(log_pos>>5, log_pos<<3, sizeof(log_t), (unsigned char*)&log);
		sleep(100);
	}
}

typedef struct arg_s{
	unsigned int ir_addr;
	unsigned char ir_data;
	unsigned int delay1;
	unsigned int delay2;
	unsigned int delay3;
}arg_t;

arg_t arg;

#define arg_addr 0x300
void get_arg(){
	ee_read(arg_addr>>8, arg_addr&0xff, sizeof(arg_t), (unsigned char*)&arg);
}

void save_arg(){
	arg.ir_addr=(ir_buf[0]<<8)|ir_buf[1];
	arg.ir_data=ir_buf[2];
	arg.delay1=10000;
	arg.delay2=10000;
	arg.delay3=10000;
	ee_write(arg_addr>>8, arg_addr&0xff, sizeof(arg_t), (unsigned char*)&arg);
}

sys_init(){
	clock_init();
	init_serialcomm();
	start12887();
	find_log_pos();
	get_arg();
}

void main(){

	sys_init();

	while(1){
		ir_test();
		if(ir_step == 50){
			write_log();
			if(ir_addr == arg.ir_addr){
				if(ir_data == 0xFC){
					FS1 = 0;
					BEEP = 0;
					sleep(arg.delay1);
					BEEP = 1;

					sleep(arg.delay2);
					
					FS2 = 0;
					BEEP = 0;
					sleep(arg.delay3);
					BEEP = 1;
				}
				if(ir_data == 0xF3){
					FS1 = 1;
					FS2 = 1;
				}
			}
			ir_step=0;
		}
		if (RI){
			unsigned char ch = SBUF;
			RI=0;
			if(ch=='w'){
				unsigned char sbuf[3];//r addr_h addr_l len
				if(wait_serial(sbuf, 3, 0)==0){
					unsigned char dbuf[32];
					if(wait_serial(dbuf, sbuf[2], 200)==0){
						ee_write(sbuf[0], sbuf[1], sbuf[2], dbuf);
					}else
						serial_out(0x56);
				}else
					serial_out(0x57);
			}
			else
			if(ch=='r'){
				unsigned char i;
				unsigned char sbuf[3];//r addr_h addr_l len
				unsigned char dbuf[32];
				if(wait_serial(sbuf, 3, 200)==0){
					ee_read(sbuf[0], sbuf[1], sbuf[2], dbuf);
					for(i=0; i<sbuf[2]; i++)
						serial_out(dbuf[i]);
				}else{
#if 0				//测试用0.
					serial_out(0x55);
#else
					unsigned char seg;
					for(seg=0; seg<32; seg++){
						ee_read(seg>>3, seg<<5, 32, dbuf);
						for(i=0; i<32; i++)
							serial_out(dbuf[i]);
					}
#endif
				}
			}
			else
			if(ch=='d'){
				unsigned char i;
				if(wait_serial(date, 7, 200)==0){
					setup12887(date);
				}else{
					read12887(date);
					for(i=0; i<7; i++)
						serial_out(date[i]);
				}
			}
			else
			if(ch=='i'){
				serial_out(ir_buf[0]);
				serial_out(ir_buf[1]);
				serial_out(ir_buf[2]);
			}
			else
			if(ch=='c'){
				clear_log();
			}
			else
			if(ch=='s'){
				save_arg();
			}
		}
	}
}

⌨️ 快捷键说明

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