关键词不能为空

当前您在: 主页 > 英语 >

51单片机的红外收发C程序_带仿真图

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-01 23:49
tags:

-

2021年2月1日发(作者:sensitivity)




发射部分



#include



sbit P2_2=P2^2;


sbit signalBit=P2^1;






//


发送信号标志位



sbit LED=P3^7; //


使能信号位,将


E


位定义为


P2.2


引 脚



unsigned char irData[]={0x14,0xeb,0xf0,0x0f};










//


存放所有的控制码



unsigned char mazhi[]={0x33,0x22,0xeb,0x14};


unsigned char key,send_flag=0;


void SendIRdata(unsigned char irdata[4]);




//


红外发射函数



void anjian_send(unsigned char flag);


void delay(unsigned int



tt)




//


延时函数



{






while(--tt);


}


void main(void)



{





signalBit=0;



P2_2= 0;




TMOD=0x12;//


设定定时器


1

< p>


0


工作方式为


1



2



EX1=1;



IT1=1;




ET0 =1; //

< p>
定时器


0


中断允许




ET1 =1;






TH0= 0xf4;




TL0= 0xf4; //


设定时值


0



38K


也就是每隔


13us


中断一次



TR0= 0;//


先关闭定时器



0



TR1= 0;




IP=0X01;



EA=1; //


允许


CPU


中断





LED=0;






while(1)



{





P1=0XF0;





if(send_flag==1)







{






anjian_send(key);






send_flag=0;




}



}


}


void anjian_send(unsigned char flag)


{




unsigned char zhi=flag;












switch(zhi)







周期为


26us














{















case 0xee: SendIRdata(irData); break;












case 0xbe: SendIRdata(irData); break;









case 0xde: SendIRdata(irData); break;









case 0x7e: SendIRdata(irData); break;









case 0xed: SendIRdata(irData); break;









case 0xdd: SendIRdata(irData); break;









case 0xbd: SendIRdata(irData); break;









case 0x7d: SendIRdata(irData); break;









case 0xeb: SendIRdata(irData); break;









case 0xdb: SendIRdata(irData); break;









case 0xbb: SendIRdata(mazhi); break;









case 0x7b: SendIRdata(mazhi); break;









case 0xe7: SendIRdata(mazhi); break;









case 0xd7: SendIRdata(mazhi); break;









case 0xb7: SendIRdata(mazhi); break;









case 0x77:


SendIRdata(mazhi); break;






}






}


/*******


< p>
定时器


1


中断处理



***********/


void isr_T1(void) interrupt 3


{





}


/*******



定时器


0


中断处理




38K


载波发生器


***********/


void timeint(void) interrupt 1



{








P2_2=~P2_2;



//


产生


38k


的载波信号


}


/****************


中断


1


键盘的扫描




********************/



void Int1(void) interrupt 2





{


unsigned char l,h;










P1=0XF0;










l=P1;







l=l&0xf0;




if(l!=0xf0)




{









delay(10);






if(l!=0xf0)






{














l=P1&0xf0;








l=l|0x0f;








P1=l;








h=P1;

























h=h&0x0f;











l=l&0xf0;








key=h+l;











send_flag=1;











LED=~LED;






}




}


}



/*********




红外发射函数






************/


void SendIRdata(unsigned char *mData)



{




unsigned char i,j;



unsigned char test[4];



for(i=0;i<4;i++)






test[i]=mData[i];







TR0=1; //


开定时器


T0 < /p>


输出


38K


载波



/*********




发送


9ms


的高电平






************/



TH1=0XDF;





//


装入初值设置波延时为


9ms



TL1=0XE3;





TR1=1;






//


启动


T1


工作



定时所需时间





signalBit=1;










//


发送信号




while(!TF1);



TF1=0;


/*********




发送


4. 5ms


的低电平




*************/



TH1=0xef;



TL1=0xf0;



signalBit=0;



while(!TF1);



TF1=0;


/*********


发送



用户码



控制码



控制反码



***********/









for(j=0;j<4;j++)









//


发送十六位地址的前八位








{








for(i=0;i<8;i++)










{







//


先发送


0.565ms



38KHZ


红外波( 即编码中


0.565ms


的高电平)











TH1=0XFE;









TL1=0X70;






signalBit=1;









while(!TF1);






TF1=0;






//


停止 发送红外信号(即编码中的高电平)











if(test[j]&0x01) //


判断二进制数个位为


1


还是


0












{











TH1=0XFA;



//



//1


为宽的低电平


,


持续时间


1.685ms

















TL1=0X30;












}












else












{















TH1=0XFE;



< p>
//0


为窄的低电平


,


持 续时间



0.56ms









TL1=0x50;











}











signalBit=0;













while(!TF1);








TF1=0;














test[j]=test[j]>>1;








}







}







TR1=0;


//


发送停止位



关闭定时器


T0









signalBit=1;











delay(100);





signalBit=0;





TR0=0;



//


关闭定时器


T1




}




检测部分



#include //


包含单片机寄存器的头文件



#define uchar unsigned char


#define uint



unsigned int


sbit IR=P3^2; / /



IR


位定义为

P3.2


引脚



sbit rs=P2^4; //


寄存器选择位,将


RS


位定义为


P2.0


引脚



sbit rw=P2^5; //


读写选择位,将

< p>
RW


位定义为


P2.1


引 脚



sbit e=P2^6; //


使能信号位,将


E


位定义为


P2.2< /p>


引脚



sbit LED=P2^0; //


使能信号位,将


E


位定义为


P2.2


引脚



unsigned char code string[ ]=


unsigned char code




smg[]=


unsigned char code




MA[]=



unsigned char a[4]; //


储存用户码、用户反码与键数据码、键数据反码



unsigned int LowTime,HighTime; //


储存高、低电平的宽度



0-65535


void delay(unsigned int tt)




{






while(--tt);




}


void w_cmd(unsigned char dd)

-


-


-


-


-


-


-


-



本文更新与2021-02-01 23:49,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/595916.html

51单片机的红外收发C程序_带仿真图的相关文章