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

📄 text1.c

📁 基于80c51的半双工红外发射程序
💻 C
字号:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit wave=P3^7;
//bit flag_s=0;
bit flag_t1=0;//判断定时器1是否定时完成
uchar key=0;
//延时用来形成低电平
void delay(uchar i)
{uchar p;
while(i--)
{p=2;
while(p--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*用来产生38KHZ的方波*/
void osscia(void)
{
TH0=0xf3;
TL0=0xf3;
TR0=1;
} 





//键盘扫描的子程序段
bit  keych(void) //检测是否有键按下子程序//
 { 
   P1=0xf0;
   if(P1==0xf0) 
   return(0);
   else {
      
       return(1);
         }
}

uchar  keyscan(void) // 检测是哪个键按下子程序//
   { uchar m,n;
   uchar code k[4]={0xfe,0xfd,0xfb,0xf7};
   for(m=0;m<4;m++)
  { P1=k[m];
    n=P1+(m*m+5)*m/6;//此处要注意m为整型
	switch(n)
	{ case 0x7e:key=0+m*4;break;
	  case 0xbe:key=1+m*4;break;
	  case 0xde:key=2+m*4;break;
	  case 0xee:key=3+m*4;break;}
	                               }
   return(key); 			}

//用来发8位数据码
void tmpwrite(uchar i)
{uchar n;
 uchar test_bit;
 n=8;
test_bit=0x01;
 while(n--){
                   TH1=0xfd;      //固定延时低电平0.565MS(557)
                  TL1=0xcb;
                  TR1=1;
 				  wave=0;
                  osscia();                                                           
                while(flag_t1==0);
				 wave=1;
                 flag_t1=0; 
                
                                             
                 

            if((test_bit&i)==0x00)//成立就是写0
                 {
                   TH1=0xfd;      //固定延时0.56MS
                  TL1=0xd5;
                  TR1=1;
  				    while(flag_t1==0);
                 flag_t1=0; 
                  test_bit=test_bit<<1;
                 }
               else {//不成立就是写1,高电平1.685uS(1682)
               TH1=0xf9;     
                  TL1=0x70;
                  TR1=1;
  				    while(flag_t1==0);
                 flag_t1=0;        
                   test_bit=test_bit<<1;
                      }     
                
                }     
}


//用来发9MS的低电平
  void send9(void)
{TH1=0xdc;
TL1=0xdb;
TR1=1;
wave=0;
osscia();
while(flag_t1==0);
wave=1;
flag_t1=0;

}
   
//用来发4.5MS的高电平(实际值4507)
void send45(void)
{wave=1;
delay(179);

}



/******************************
|功能:用来调制红外发射信号
|
|
|
\*****************************/
void main(void)
{bit flag_k=0;
 TMOD=0x12;
 ET0=1;
ET1=1;
PT1=1;
 EA=1;//允许定时器中断,以后实现接收时是允许外部中断
// key=0x00;
while(1)   {
flag_k=keych();
if(flag_k==1)
{key=keyscan();
wave=1;
//delay(255);

 send9();//发9MS的低电平
 send45();//发4.5MS的高电平
tmpwrite(0x00);//写识别码
tmpwrite(0xff);//写识别码的反码
tmpwrite(key);//写数据位
tmpwrite(~key);//写数据的反码
//key++;
}
while(P1&0xf0!=0xf0);
}
}


void tt0(void)  interrupt 1
{
wave=~wave;
}

void tt1(void) interrupt 3
{TR0=0;
flag_t1=1;
TR1=0;
}

⌨️ 快捷键说明

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