使用51单片机模拟红外线遥控器的按键发射的红外线
模拟红外线遥控器的c语言代码
本代码模拟的是红外线遥控器的1234的编码规则,
通过4个按键,可以直接按下触发红外线编码,发射出的红外线与红外线遥控器相同。遥控器如下图1所示。遥控器1234对应码表值如下图2所示。用户码为00FF
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; //脉冲停止后,发射端口常态为高电平
}