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

📄 ird.c.bak

📁 TLC0831实例
💻 BAK
字号:
/*
	单片机红外遥控试验
	
	赵亮
	zhaoliang_0801@dl.cn
说明: 由于这个试验不是我的原创,所以没有过多的发言权,
	我只是在网上找到了程序,修改之后,用到了我的板子上
	试验结果,使用SAA3010 遥控器,板子上焊接红外接收头
	注意一定要在接收头的电源也地端一定要接上滤波电容
	我接的是一个10uf和一个104,效果还可以。
	
	数据线接到单片机的 外部中断0(P32)
	
	2007-4-12 9:47
	加入了 数码管显示,按下0~9之后,会有对应的显示
	
	试验现象:按下遥控器上的0~9按键,对应的P2口
	会有二进制的指示。

*/ 

#include "reg51.h"
#include "intrins.h"

unsigned char leddata[]= {		
                0x03,  //"0"
                0x9F,  //"1"
                0x25,  //"2"
                0x0D,  //"3"
                0x99,  //"4"
                0x49,  //"5"
                0x41,  //"6"
                0x1F,  //"7"
                0x01,  //"8"
                0x09,  //"9"
                0x11,  //"A"
                0xC1,  //"B"
                0x63,  //"C"
                0x85,  //"D"
                0x61,  //"E"
                0x71,  //"F"
                0x91,  //"H"
                0xE3,  //"L"
                0x13,  //"n"
                0x83,  //"u"
                0x31,  //"P"
                0xC5,  //"o"
                0xFD,  //"-"
                0xFF,  //off
                         };

sbit SM_1 = P1^6; 
sbit SM_2 = P1^7;

#define uchar unsigned char

uchar ykcode;                         //遥控码(14位的最后8位)
bit ykok;                             //遥控数据有效标志

uchar ykbnum;                         //遥控已接收位数
uchar ykbtc;                          //遥控中断时 ykbtc=TH1
uchar ykdelay;                        //遥控延时接收
bdata uchar ykcodetemp;               //遥控临时码
sbit ykcodetemp0=ykcodetemp^0;

unsigned char temp;

void YkInit(void);                   //遥控接收初始化
unsigned char YkGetcode(void);       //返回遥控码
bit YkTest(void);                    //检查有无遥控信号

void main(void)
{
	YkInit();
	SM_1 = 1;    
	SM_2 = 0;			 	
	SBUF = 0xff;
	while(1)				
	{	
	unsigned char i;
	if (ykok)
		{
			temp=ykcode; 
			 
			//P2=ykcode;
		SBUF = leddata[temp];
		for(i=0;i<100;i++);
				
		}	
	
	}
}

void YkInit(void)          		
{
	EA=1;                    
	
	TMOD=0x11;                //TMOD T0,T1  mode 1
	SCON=0x00;
	TH1=0;
	TL1=0;
	IE|=0x89;             
	IP|=0x01;            
	TCON |= 0x41;         
	ykbnum=0;
	ykcodetemp=0;
	ykdelay=0;
}


bit YkTest(void)        
{
        return(ykok);
}

void intx0() interrupt 0 using 2        // use ext int 0 P32 
{
	ykbtc=TH1;TH1=0;TL1=0;TR1=1;ET1=1;
	switch(ykbnum)
	{
		case(0):
			ykbnum=1;
			break;
		case(1):
			if(ykbtc==6)
				ykbnum=2;
			else 
				ykbnum=0;
			break;
		case(2):
			if(ykbtc==6||ykbtc==9)
				ykbnum=3;
			else 
				ykbnum=0; 
			break;
		case(3):
			if(ykbtc==9||ykbtc==6)
				ykbnum=4;
			else 
				ykbnum=0;
			break;
			
		default:
			if(ykbnum<7)
			{
				if(ykbtc==6)
					ykbnum++;
				else 
					ykbnum=0;
			}
			else 
			{
				if(ykbtc==6)
				{
					if(ykcodetemp0)
						ykcodetemp=ykcodetemp*2+1;
					else 
						ykcodetemp=ykcodetemp*2;
					ykbnum++;
				}
				else if(ykbtc==9)
				{        
					if(ykcodetemp0)
					{
						ykbnum++;
						ykcodetemp=ykcodetemp*2;
					}  
					else 
					{
						ykbnum+=2;
						ykcodetemp=ykcodetemp*2;
						ykcodetemp=ykcodetemp*2+1;
					}
				}
				else if(ykbtc>11&&ykbtc<15)
				{
					ykbnum+=2;
					ykcodetemp=ykcodetemp*2;
					ykcodetemp=ykcodetemp*2+1;
				}
				else if(ykbtc>30)
					EX0=1;
				else 
					ykbnum=0;                
			}
	}
}  

void intt1() interrupt 3 using 3        //Use timer1
{
	if(ykdelay)
	{
		ykdelay--;
		EX0=0;
	}        //ykdelay !=0 stop receive
	else
	{
	    if(ykbnum==13)    //遥控码最后一位为0,补0
	    {
		    ykcode=ykcodetemp*=2;
		    ykdelay=3;
		    EX0=0;        // stop receive
		    ykok=1;       // data valid
	    }
	    else if(ykbnum==14)       //遥控码最后一位为1,不用补
		{
		    ykcode=ykcodetemp;
		    ykdelay=3;
		    EX0=0;                // stop receive
		    ykok=1;               // data valid
		}
		else 
			EX0=1;                // continue to receive
	    ykbnum=0;
	    ykcodetemp=0;
	}
}

⌨️ 快捷键说明

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