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

📄 hwx.txt

📁 stc52单片机红外线的例子
💻 TXT
字号:
/*红外线接收程序,本程序运行在NEC制下的遥控器下,市面上的遥控器大部份都是NEC制的,运行程序,按遥控器
在数码管上显示相应的地址码-控制码(以16进制显示)分四段,前两段是地址码,后两段为控制吗,根据NEC编码不同,
有的是前8位为数据码,后8位为数据据码的反码,有的是16位编码,就没有反码了*/

#include <reg51.h>
#include <intrins.h>

sbit hwx=P3^3;		//定义红外接收脚,

code unsigned char table[]=
			{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
			0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
			//共阴数码管 0-9 a-f - 表
unsigned char l_tmpdate[8]={0,0,0,0,0,0,0,0};//显示管数据

unsigned char l_lhj[66];		//定义66位数组变量来存储接收的时间参数
void delay();//延时子函数
void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数

void main(void)     //入口函数
{
	EA=1;			//首先开启总中断
	EX1=1;  		//开启外部中断 1
	IT1=1;        // 设置成 下降沿触发方式
	while(1){		//循环显示,接收都由
		display(l_tmpdate,8);		
	}		

}
void display(unsigned char *lp,unsigned char lc)//显示
{
	unsigned char i;		//定义变量
	P2=0;					//端口2为输出
	P1=P1&0xF8;				//将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管
	for(i=0;i<lc;i++){		//循环显示
	P2=table[lp[i]&0x7f];		//查表法得到要显示数字的数码段
	if(lp[i]>0x7f)
		P2+=0x80;
	delay();				//延时
	P2=0;					//清0端口,准备显示下位
	if(i==7)				//检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据
		break;	
	P1++;					//下一位数码管
	}
}
void delay(void)								//空5个指令
{
	unsigned char i=13;
	while(i)
		i--;
}
void hongwai(void)   interrupt 2     //外部中断 1 ,INT1(P3^3)连接红外线接收IC数据脚
{
	unsigned char i,j,tmp;
	EX1=0;
//	hwx=1;
	j=33;			//传送一组数包括引导码1位,地址码8位加反码8位,指令码8位加反码8位,总共33位
	i=0;			//从第一维数组开始
	tmp=100;		//加八延时,
	while(tmp){
	tmp--;
	}
	if(hwx){		//然后再检测红线接收脚是有数据招收,有继续,没有则退出
		EX1=1;
		return;
	}	
	while(j){		//循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平时间常数,只接低电平常数就
				//可以判断1或0了,在这里我们都接收
				//还有一点要知道,接收波形是反向,在没有接收时端口为高电平
		tmp=0;
		l_lhj[i]=1;		//时间量从1开始
		while(!hwx){	//检测高低电平的变化
			l_lhj[i]++;		//没变继续加1
			delay();		//加入延时,是因为我们采用8位二进来存储,如果不加延时,时间量将计满
			tmp++;			//此变量为防止干扰带来的死循环
			if(tmp==250)
				break;
		}
		i++;
		tmp=0;
		l_lhj[i]=1;		//时间量从1开始
		while(hwx){		//检测高低电平的变化
			l_lhj[i]++;	//没变继续加1	
			delay();		//同上
			tmp++;
			if(tmp==250)
				break;
		}	
		i++;		
		j--;
	}
	i=255;				//加入循环延时,抗干扰
	while(i){
	tmp=255;
	while(tmp){
	P2=0XF0;
	tmp--;
	}
	i--;			
	}
	tmp=0;
	//这里显示了全部的四段码,包括地址位两段,控制位两段,每段用点分开
	for(i=3;i<19;i++,i++){		//处理地址位前8位,这是3是因为去掉前面的引导码。对低电平时间数据的数理,
		tmp>>=1;				//右移一位,接收低电平在前
		if(l_lhj[i]>30)			//检测低电平时间超过30就确认为1
			tmp+=0x80;
	}	
	l_tmpdate[0]=tmp/16;		//分开2位以16进制显示
	l_tmpdate[1]=tmp%16+0x80;		//0x80为加入小数点,目的是分开四段好看些
	tmp=0;
	for(i=19;i<35;i++,i++){		//同上,这里处理地址位后8位
		tmp>>=1;
		if(l_lhj[i]>30)
			tmp+=0x80;
	}
	l_tmpdate[2]=tmp/16;
	l_tmpdate[3]=tmp%16+0x80;
	tmp=0;
	for(i=35;i<51;i++,i++){		//同上,这里处理控制位前8位
		tmp>>=1;
		if(l_lhj[i]>30)
			tmp+=0x80;
	}
	l_tmpdate[4]=tmp/16;
	l_tmpdate[5]=tmp%16+0x80;
	tmp=0;
	for(i=51;i<67;i++,i++){		//同上,这里处理控制位后8位
		tmp>>=1;
		if(l_lhj[i]>30)
			tmp+=0x80;
	}
	l_tmpdate[6]=tmp/16;
	l_tmpdate[7]=tmp%16+0x80;	
	EX1=1;	
}
//朋友们,到这里,你是否有想过用遥控接收的指令码当键盘码来处理别的呢!
//比如按下了某个键的指令码去处理继电器的打开、关闭,哈哈,这个就你们自己来发辉下了

⌨️ 快捷键说明

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