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

📄 main.c

📁 使用isis模拟的红外编解码实验
💻 C
字号:
#include <reg52.h>
#define TIMEH 12 //基于22.1184M时钟晶振,数字越大,时间越长
#define TIMEL 50 //基于22.1184M时钟晶振,数字越大,时间越长
#define ROW P3 	 //矩阵按键接口定义
#define LINE P2	 //矩阵按键接口定义

extern void timer_init(void);
extern void delay(unsigned int);
extern unsigned char scan_key(void);

unsigned char irm_code;
sbit QD = P1^0;

void main()
{
	unsigned char tmp;
	irm_code=0xff;
	timer_init();
	while(1) {
		tmp = scan_key();
		if(tmp!=0xff) {
			if(irm_code==0xff) {//一次键值发射完成后会将irm_code置为0xff			
				irm_code = tmp;	//键值传递
				TR0 = 1; 		//启动定时器,完成编码发射
			}
			delay(10);//两次编码发射之间需要延时,连续发射会导致解码失败  
		}
	}	 
}

void timer_init(void)
{
	TMOD = 0x01;
	TH0 = 0xff;
	TL0 = 0xff;
	EA = 1;
	ET0 = 1;
	TR0 = 0;
}

/*定时中断,红外编码*/
void timer_int(void) interrupt 1
{
	static unsigned char i=0,flag=0;
	QD=~QD;
	if(i<10) { //连续发射5个“0”引导码
		TH0 = 255-TIMEH/2;
		TL0 = 255-TIMEL/2;
		i++;
	}
	else if(i<18) { //数据编码
		if((irm_code & 0x80)==0x80) {
			TH0 = 255-TIMEH;
			TL0 = 255-TIMEL;
			irm_code <<= 1;
			i++;
		}
		else {
			TH0 = 255-TIMEH/2;
			TL0 = 255-TIMEL/2;
			if(flag) {
				irm_code <<= 1;
				i++;
			}
			flag ^= 0x01;
		}		
	}
	else {
		TR0 = 0;
		i=0;
		QD=1;
		irm_code=0xff;
		TH0 = 0xff;
		TL0 = 0xff;	  
	}	
}


void delay(unsigned int t)
{
	unsigned char i;
	while(t--) for(i=0;i<230;i++);
}

/*矩阵按键扫描*/
unsigned char scan_key(void)
{
	unsigned char j; 		
	static unsigned char i=0;
	ROW = 255-(1<<i); //列扫描低电平有效,FE,FD,FB,F7
	if(LINE!=0xff) 
		for(j=0;j<8;j++) 
			if(LINE==(255-(1<<j))) return (j+(i<<3));
	i++; i&=0x03;
	return(0xff);
}





⌨️ 快捷键说明

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