使用51单片机模拟红外线遥控器的按键发射的红外线

模拟红外线遥控器的c语言代码

  • 本代码模拟的是红外线遥控器的1234的编码规则,
    • 51单片机代码

本代码模拟的是红外线遥控器的1234的编码规则,

通过4个按键,可以直接按下触发红外线编码,发射出的红外线与红外线遥控器相同。遥控器如下图1所示。遥控器1234对应码表值如下图2所示。用户码为00FF
使用51单片机模拟红外线遥控器的按键发射的红外线_第1张图片
使用51单片机模拟红外线遥控器的按键发射的红外线_第2张图片

51单片机代码

按键为单片机P3.4-P3.7号端口,红外线发射端口为P1.5端口。晶振采用为12M晶振,需要模拟更多按键的请自取。

#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char 
#define uint  unsigned int 
#define SBM   0x80                //识别码
#define ms9    (65536-9000) 	      //约9mS
#define ms4_5  (65536-4500) 	      //约4.5mS
#define ms1_6  (65536-1630) 	      //约1.65mS
#define ms_65  (65536-580) 	      //约0.65mS
#define ms_56  (65536-560) 	      //约0.56mS
#define ms40   (65536-40000)       //约40mS
#define ms56   (65536-56000)       //56mS
#define ms2_25 (65536-2250)        //约2.25mS
sbit IR  = P1^5;				  //定义发射引脚(接PNP三极管基极)
sbit K1=P3^4;
sbit K2=P3^5;
sbit K3=P3^6;
sbit K4=P3^7;
uchar KEY(void);
void  SanZhuan(void);
void  ZZ(uchar x);
void  Z0(uchar temp);
void  TT0(bit BT,uint x);
/*┈┈┈┈┈┈┈┈┈┈┈函数功能:主函数┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{ 
	TMOD = 0x01;         //T0 16位工作方式
	IR=1;				   //发射端口常态为高电平
	while(1) 
	{
		SanZhuan();
	}}
uchar KEY(void)
{
	if(K1==0)  return 1;
	if(K2==0)  return 2;
	if(K3==0)  return 3;
	if(K4==0)  return 4;
	return 0;
}
void SanZhuan(void)		 
{
	uchar v;
	v = KEY();
	switch(v)
	{
		case 1:ZZ(0x0c);v=0;break;		//" 数字1 "
		case 2:ZZ(0x18);v=0;break;		//" 数字2 "
		case 3:ZZ(0x5e);v=0;break;		//" 数字3 "
		case 4:ZZ(0x08);v=0;break;		//" 数字4 "
		default:v=0;
	}}
/*┈┈┈┈┈┈┈┈┈┈函数功能:发送主程序┈┈┈┈┈┈┈┈┈┈┈┈*/
void ZZ(uchar x)
{ 
	TT0(1,ms9);		   //高电平9mS
	TT0(0,ms4_5);	       //低电平4.5mS
	/*┈ 发送4帧数据 ┈*/
	Z0(SBM);													                               
	Z0(~SBM);
	Z0(x);
	Z0(~x);
	/*┈┈ 结束码 ┈┈*/
	TT0(1,ms_65);
	TT0(0,ms40);
	/*┈┈ 重复码 ┈┈*/
	while(KEY())
	{
		TT0(1,ms9);
        TT0(0,ms2_25);
        TT0(1,ms_56);
        TT0(0,ms40);
		TT0(0,ms56);				  
    }}
/*┈┈┈┈┈┈┈┈┈┈单帧发送程序┈┈┈┈┈┈┈┈┈┈┈┈*/
void Z0(uchar temp)
{ 
	uchar v;
	for (v=0;v<8;v++)                     //循环8次移位 
	{     
		TT0(1,ms_65);		        //高电平0.65mS         
		if(temp&0x01) TT0(0,ms1_6); //发送最低位
		else          TT0(0,ms_56);     
		temp >>= 1;                //右移一位 
	}}
/*┈┈┈┈┈┈┈┈┈38KHz脉冲发射 + 延时程序┈┈┈┈┈┈┈┈┈┈┈┈*/
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;			        //脉冲停止后,发射端口常态为高电平
}

你可能感兴趣的:(c语言)