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

📄 红外线发射.c

📁 红外线遥控Proteus仿真电路 发射接收程序
💻 C
字号:
/***************************************************************
	作品:红外线发射
  单片机:STC89C52RC
    晶振:12M
编译环境:Keil uVision4 V9.00
***************************************************************/
//
//	发射引脚(接PNP三极管b极)
//	PNP三极管e极接2Ω电阻,c极接红外发射管
     
#include <REG51.h>
#include <intrins.h>
#define uchar unsigned char 
#define uint  unsigned int 

#define SBM   0x80                //识别码

#define m9    (65536-9000) 	      //约9mS
#define m4_5  (65536-4500) 	      //约4.5mS
#define m1_6  (65536-1630) 	      //约1.65mS
#define m_65  (65536-580) 	      //约0.65mS
#define m_56  (65536-560) 	      //约0.56mS
#define m40   (65536-40000)       //约40mS
#define m56   (65536-56000)       //56mS
#define m2_25 (65536-2250)        //约2.25mS

sbit IR  = P3^6;				  //定义发射引脚(接PNP三极管基极)
sbit LED = P3^7;				  //发射指示灯

uchar KEY(void);
void  SanZhuan(void);
void  ZZ(uchar x);
void  Z0(uchar temp);
void  TT0(bit BT,uint x);
void  YS(uchar time);

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:主函数
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{ 

  TMOD = 0x01;         //T0 16位工作方式
  IR=1;				   //发射端口常态为高电平

  while(1) 
  {
   SanZhuan();
  }
}
/***************************************************************
函数功能:             4×4矩阵键盘
                           键值                    
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 
│     │    │    │    │    │    │    │    ┃
│     │    │    └────13   14   15   16   ┃   
│     │    └─────────9    10   11   12   ┃   
│     └──────────────5    6    7    8    ┃   
└────────────────────1    2    3    4    ┃  
***************************************************************/
uchar KEY(void)
{
 uchar H,L;            //行值,列值
 H=0;
 L=0;
 P1 = 0xf0;            //将键盘端口行值设为1,列值设为0
 if(P1!= 0xf0)         //检测是否有按键按下,如果有则hangval必不为0x0f
   {
    YS(10);            //按键去抖动,延时10毫秒
    if(P1!=0xf0)       //确实有按键按下
      {
       H  = P1&0xf0;   //按键后得到按键的行标志位,将行标志位赋值给hangval
       P1 = 0x0f;      //翻转键盘接口输出
       L  = P1&0x0f;   //得到列标志位
      }
	return (H+L);
   }
  return 0;
}
/***************************************************************
函数功能:散转程序
入口参数:v
//
//  13 14 15 16
//  9  10 11 12
//  5  6  7  8
//  1  2  3  4
***************************************************************/
void SanZhuan(void)
{
 uchar v;
 v = KEY();
 
 switch(v)
 {
  case 0x77:ZZ(0x01);v=0;break;		//"  "
  case 0xb7:ZZ(0x02);v=0;break;		//"  "
  case 0xd7:ZZ(0x03);v=0;break;		//"  "
  case 0xe7:ZZ(0x04);v=0;break;		//"  "
  case 0x7b:ZZ(0x05);v=0;break;		//"  "
  case 0xbb:ZZ(0x06);v=0;break;		//"  "
  case 0xdb:ZZ(0x07);v=0;break;		//"  "
  case 0xeb:ZZ(0x08);v=0;break;		//"  "
  case 0x7d:ZZ(0x09);v=0;break;		//"  "
  case 0xbd:ZZ(0x10);v=0;break;		//"  "
  case 0xdd:ZZ(0x11);v=0;break;		//"  "
  case 0xed:ZZ(0x12);v=0;break;		//"  "
  case 0x7e:ZZ(0x13);v=0;break;		//"  "
  case 0xbe:ZZ(0x14);v=0;break;		//"  "
  case 0xde:ZZ(0x15);v=0;break;		//"  "
  case 0xee:ZZ(0x16);v=0;break;		//"  "
  default:v=0;
 }
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:发送主程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void ZZ(uchar x)
{ 
  TT0(1,m9);		   //高电平9mS
  TT0(0,m4_5);	       //低电平4.5mS

  /*┈ 发送4帧数据 ┈*/
  Z0(SBM);													                               
  Z0(~SBM);
  Z0(x);
  Z0(~x);

  /*┈┈ 结束码 ┈┈*/
  TT0(1,m_65);
  TT0(0,m40);

  /*┈┈ 重复码 ┈┈*/
  while(KEY())
   {
        TT0(1,m9);
        TT0(0,m2_25);

        TT0(1,m_56);
        TT0(0,m40);
		TT0(0,m56);
		
		LED = !LED;		  //指示灯					  
    }

   LED = 1;  		  

}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:单帧发送程序
入口参数:1帧数据
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Z0(uchar temp)
{ 
  uchar v;
  for (v=0;v<8;v++)                     //循环8次移位 
       {     
	         TT0(1,m_65);		        //高电平0.65mS         
			 if(temp&0x01) TT0(0,m1_6); //发送最低位
			 else          TT0(0,m_56);     
			 temp >>= 1;                //右移一位 
        }    
}

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:38KHz脉冲发射 + 延时程序
入口参数:(是否发射脉冲,延时约 x (uS))
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void TT0(bit BT,uint x)
{
  TH0 = x>>8;	            //输入T0初始值
  TL0 = x;
  TF0=0;			        //清0
  TR0=1;			        //启动定时器0
  if(BT == 0) while(!TF0);	//BT=0时不发射38KHz脉冲只延时;BT=1发射38KHz脉冲且延时;
  else while(1)			    //38KHz脉冲,占空比5:26
         {
		  IR = 0;
		  if(TF0)break;
 	      if(TF0)break;
		  IR = 1;
  	      if(TF0)break;
   	      if(TF0)break;
   	      if(TF0)break;
		  if(TF0)break;
   	      if(TF0)break;
   	      if(TF0)break;
   	      if(TF0)break;
   	      if(TF0)break;
   	      if(TF0)break;
		  if(TF0)break;
		 }
  TR0=0;			        //关闭定时器0
  TF0=0;			        //标志位溢出则清0

  IR =1;			        //脉冲停止后,发射端口常态为高电平
}
/***************************************************************
函数功能:按键消抖    延时程序
入口参数:1ms×time       (晶振=12MHz)
***************************************************************/
void YS(uchar time)
{
     uchar i,j;
	 for(i=0; i<time; i++)
     for(j=0; j<247; j++)_nop_();
}

⌨️ 快捷键说明

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