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

📄 irda1.c

📁 MCS-51单片机实验 39个实用实验和源码
💻 C
字号:
//---红外发送---

//-----头文件引用-----
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#define	C8279	XBYTE[0xF239]      //定义8279命令口地址
#define	D8279 	XBYTE[0xF238]      //定义8279数据口地址
#define	uchar	unsigned char  
#define	uint 	unsigned int

//-----宏声明-----   
uchar	code	ledseg[]={0x3f,0x06,0x5b,0x4F,0x66,0x6D,0x7D,0x07,0x7F,//显示'0,1,2,3,4,5,6,7,8'
						  0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40};//'9,a,b,c,d,e,f, ,-'
uchar	idata	diss[8]; 	//定义显示缓冲区
uchar	idata	fsdat[4]={0x00,0xff,0x55,0xaa};   //定义发送数据数组
uchar  key;					//键值变量
bit		bdata	kbz;		//定义键标志
bit		bdata	B_firstbz,B_againbz;	//定义第一次B键、重复B键标志
bit		bdata	ruptbz;		//定义中断标志
sbit	FSCOM=P1^6;     	//定义发送口

//-----初始化-----
void	first()			 	
{
	C8279=0x00;				//置8279工作方式
	C8279=0x2f;				//置键盘扫描速率
	C8279=0xc1;				//清除LED显示
	while(C8279&0x80);		//等待清除结束	
	TMOD=0x01;         		//置定时器工作方式
	ET0=1;
	EA=1;	
	diss[7]=fsdat[0]/16;  //初始显示送缓冲区
	diss[6]=fsdat[0]%16;
	diss[5]=fsdat[1]/16;
	diss[4]=fsdat[1]%16;
	diss[3]=0x10;
	diss[2]=0x10;
	diss[1]=0x11;
	diss[0]=0x11;
}

//-----中断程序-----
void ctc0() interrupt  1
{
	TR0=0;
	ruptbz=1;				//置中断标志
}

//-----取键-----
void	getkey()				
{
	if((C8279&0x07)==0x00)	//无键按下
		{kbz=0;} 			//置无键标志	
	else
	{
		kbz=1;				//置有键标志
		C8279=0x40;			//读FIFO RAM命令
		key=D8279;			//读键值
		key=(key&0x3f);		//取键盘数据低6位   	
	 }		
}

//----显示-----
void	disp()			   	
{
	uchar	i;	
	for(i=0;i<8;i++)
	{
		C8279=i+0x80;
		D8279=ledseg[diss[i]];		
	}	
}

//-----A键处理-----
void keya()
{
	uchar m;
	for(m=2;m>0;m--)//取数据的高低位
	{
		do
		{
			getkey();
		}while(kbz==0);
		diss[m-1]=key;
		disp();
	}
	fsdat[2]=diss[1]*16+diss[0];//数据保存
	fsdat[3]=~fsdat[2];
}

//-----键控-----
void inkey()
{
	do
	{
		do
		{
			getkey();				//取键
		}while(kbz==0);	
		if(key==0x0a)
		{
			do
			{
				keya();				//A键处理			
			Loop:do
				{
					getkey();		//取键
				}while(kbz==0);
			}while(key==0x0a);	
			if(key==0x0b)
			{
				B_firstbz=1;		//置第一次B键标志
				B_againbz=0;
				return;
			}
			else
			{
				diss[1]=key;		//取数据高位
				disp();
				do
				{
					getkey();		//取键
				}while(kbz==0);
				diss[0]=key;		//取数据低位
				disp();
				fsdat[2]=diss[1]*16+diss[0];//保存输入键值
				fsdat[3]=~fsdat[2];			
				goto Loop;		
			}
		}
		if(key==0x0b)
		{
			if(B_firstbz==1)
			{
				B_firstbz=0;
				B_againbz=1;		//置重复B键标志
				return;
			}
		}
	}while((key!=0x0a)&&(key!=0x0b));
}

//-----载波-----	
void carrier_wave()
{	
	uchar i;
	FSCOM=1;		//8us(1)
	for(i=0;i<1;i++);
	FSCOM=1;
	FSCOM=1;
	FSCOM=0;		//18us(0)
	for(i=0;i<2;i++);		
}

//-----发送数据-----
void	transdat()					
{	
	uchar	i,j,k;
	for(i=0;i<255;i++)         	//发送引导码9200us(H)
	{
		carrier_wave();
	}
	for(i=0;i<99;i++)         	//发送引导码9200us(H)
	{
		carrier_wave();
	}
	if(B_againbz==1)             //判是否为持续码
	{                          	//发送持续码2200us(L)
		FSCOM=0;               
		TH0=0xf8;              	//设置定时器初值
		TL0=0x54;
		TR0=1;
		while(ruptbz==0);       //等待时间到
		ruptbz=0;
		for(i=0;i<26;i++)      	//发送结束码680us(H)
		{
			carrier_wave();		//载波
		}
		FSCOM=0;
		return;
	}
	else
	{                         	//发送引导码4400us(L)
		FSCOM=0;              	
		TH0=0xf0;				//设置定时器初值
		TL0=0x68;
		TR0=1;
		while(ruptbz==0);      	//等待时间到
		ruptbz=0;
		for(k=0;k<4;k++)      	//发送32位数据编码
		{
			for(j=0;j<8;j++)
			{
				for(i=0;i<26;i++)	//发送数据码680us(H)
			    {
				    carrier_wave();//载波
			     }
			   	FSCOM=0;	
			  	 if((_cror_(fsdat[k],j)&0x01)==0x01)//判数据位是否为‘1’?
			   	{
			  	   TH0=0xfa;         //为‘1’定时1600uS(L)
				   TL0=0x6d;
				   TR0=1;
				   while(ruptbz==0);//等待时间到
			 	   ruptbz=0;
			   	}
			   	else                // 为‘0’定时500us(L)
			   	{ 
				   TH0=0xfe;
				   TL0=0x64;
				   TR0=1;
				   while(ruptbz==0);//等待时间到
				   ruptbz=0;
			   }
		   }                             
	   }
	   for(i=0;i<26;i++)           //送结束码680us(H)
	   {
		  carrier_wave();
	   }
    }
}

//-----主程序-----
main()
{
	first();		//初始化
	while(1)
	{
		disp();		//显示
		inkey();	//键控
		transdat();	//发送		
	}
}	
					

⌨️ 快捷键说明

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