找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2042|回复: 1
收起左侧

红外遥控led 双机通信发射接收程序

[复制链接]
ID:411420 发表于 2018-10-18 22:15 | 显示全部楼层 |阅读模式
附录一   发射器程序
#include <at89c51.h>
#include <intrins.h>
#define uchar  unsigned char
#define uint   unsigned int
# define _BV(bit) (1<<(bit))
sbit k1=P2^0;
sbit k2=P2^1;
sbit k3=P2^2;
sbit k4=P2^3;
sbit k5=P2^4;
sbit k6=P2^5;
sbit k7=P2^6;
sbit k8=P2^7;
sbit out=P3^7;
static bit OP;        //红外发射管的亮灭
static unsigned int count;       //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char Flag;      //红外发送标志
char iraddr1;  //十六位地址的第一个字节
char iraddr2;  //十六位地址的第二个字节
void SendIRdata(char p_irdata);
uchar t=16;
uchar CODE=0Xff;
void delay_LCM(uint);  //LCD延时子程序
/*********延时K*1ms,12.000mhz**********/
void delay_LCM(uint k)
{
    uint i,j;
    for(i=0;i<k;i++)
    {
        for(j=0;j<60;j++)
                {;}
    }
}
void key()
{
if(k1==0)//
{
  delay_LCM(5);
  if(k1==0)
  {
   SendIRdata(1);
                        P0=1;
   while(k1==0);
  }
}
  if(k2==0)//
{
  delay_LCM(5);
  if(k2==0)
  {
SendIRdata(2);
                        P0=2;
   while(k2==0);
  }
}
if(k3==0)//
{
  delay_LCM(5);
  if(k3==0)
  {
SendIRdata(3);
                        P0=3;
   while(k3==0);
  }
}
  if(k4==0)//
{
  delay_LCM(5);
  if(k4==0)
  {
   SendIRdata(4);
                        P0=4;
   while(k4==0);
  }
}
if(k5==0)//
{
  delay_LCM(5);
  if(k5==0)
  {
   SendIRdata(5);
                        P0=5;
   while(k5==0);
  }
}
  if(k6==0)//
{
  delay_LCM(5);
  if(k6==0)
  {
                        SendIRdata(6);
                        P0=6;
   while(k6==0);
  }
}
  if(k7==0)//
{
  delay_LCM(5);
  if(k7==0)
  {
   SendIRdata(7);
                        P0=7;
   while(k7==0);
  }
}
if(k8==0)//
{
  delay_LCM(5);
  if(k8==0)
  {
   SendIRdata(8);
                        P0=8;
   while(k8==0);
  }
}
}      //定时器0中断处理
void timeint(void) interrupt 1
{
  TH0=0xFF;
  TL0=0xe6; //设定时值为38K 也就是每隔26us中断一次
  count++;
}      //定时器1中断处理
void time1(void) interrupt 3
{
out=!out;
}
void SendIRdata(char p_irdata)
{
  int i;
  char irdata=p_irdata;         //发送9ms的起始码
  endcount=74;
  Flag=1;
  count=0;
  out=0;
        TR1=1;
  do{}while(count<endcount);
        TR1=0;
        out=1;        //发送4.5ms的结果码
                 //endcount=117;
                 //Flag=0;
                 //count=0;
                 //out=1;
                 //do{}while(count<endcount);
endcount=25;
     Flag=1;
     count=0;
            out=1;       //TR1=1;
     do{}while(count<endcount);     //发送八位数据
//irdata=~p_irdata;
  for(i=0;i<irdata;i++)
  {
     endcount=25;
     Flag=1;
     count=0;
            out=0;
                   TR1=1;
     do{}while(count<endcount);
                         TR1=0;
                   out=1;
endcount=25;
     Flag=1;
     count=0;
            out=1;
                   //TR1=1;
     do{}while(count<endcount);
                         }
}
main()
{
  count = 0;
  Flag = 0;
  OP = 0;
  out = 1;
  EA = 1; //允许CPU中断
  TMOD = 0x21; //设定时器0116位模式1
  ET0 = 1; //定时器0中断允许
P1=0xff;
  TH0 = 0xFF;
  TL0 = 0xE6; //设定时值038K 也就是每隔26us中断一次  
  TR0 = 1;//开始计数
TH1 = 256-13;
  TL1 = 256-13; //设定时值038K 也就是每隔26us中断一次
        ET1 = 1; //定时器1中断允许
                //TR1 = 1;
//定时器1中断允许
iraddr1=0x00;
iraddr2=0x00;
  while(1)
{
  key();
        //P2=CODE=P1;
//delay_LCM(100);
        //SendIRdata(CODE);
}
}
附录二   接收器程序
#include<AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
uchar data    IRcode[4];   //定义一个4字节的数组用来存储代码
uchar     CodeTemp;     //编码字节缓存变量
uchar     i,j,k;    //延时用的循环变量
uchar     dat=0;
uchar     num;
uint time;
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7;
sbit     IRsignal=P3^2;   //HS0038接收头OUT端直接连P3.2(INT0)
void delay(uint z);
void delay(uint z)
{
   uint a,b;
   for(a=z;a>0;a--)
     for(b=120;b>0;b--);
}
/**************************延时0.9ms子程序**********************/
void Delay0_9ms(void)
{uchar j,k;
     for(j=18;j>0;j--)
       for(k=20;k>0;k--) ;
}
/***************************延时1ms子程序**********************/
void Delay1ms(void)
{uchar i,j;
   for(i=2;i>0;i--)
      for(j=230;j>0;j--) ;
}
/***************************延时4.5ms子程序**********************/
void Delay4_5ms(void)
{uchar i,j;
     for(i=10;i>0;i--)
      for(j=225;j>0;j--) ;
}
/**************************** 延时子程序 ************************/
/************************中断0解码服务子程序**********************/
void int0(void) interrupt 0 using 2      
{
EX0=0;
P3_0=!P3_0;
num=0;
        for(k=0;k<4;k++)
   {
                          Delay0_9ms();
     if (IRsignal==1)         //如果0.9msIRsignal=1,说明不是引导码
     {
        k=4;
                break;        //P0=0XFF;
                                }
     else if(k==2)           //如果持续了3×0.9ms=9ms的低电平,说明是引导码
      {
                //P0=0;
        time=0;
num=0;
        while(IRsignal==0);
                        //if(IRsignal==0)
                        // num+=1;
//        P1=num;
                        //        while(IRsignal==0);
while(time<100)
{
        time++;
Delay0_9ms();    //跳过持续1ms的高电平
Delay0_9ms();     //跳过持续1ms的高电平
if(IRsignal==0)
{
P0=num;
num+=1;
   //P1=num;
}
while(IRsignal==0);
}  
                               
                                                                if(num==1)
                                                                led1=!led1;
                                                                if(num==2)
                                                                led2=!led2;
                                                                if(num==3)
                                                                led3=!led3;
                                                                if(num==4)
                                                                led4=!led4;
                                                                if(num==5)
                                                                led5=!led5;
                                                                if(num==6)
                                                                led6=!led6;
                                                                if(num==7)
                                                                led7=!led7;
                                                                if(num==8)
                                                                led8=!led8;
                                break;
//   delay(2);
       }
   }
EX0=1;
}
void init()// 定时器初始化
{
        TMOD=0x11;
        EA=1;
  IT0=1;    //INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
  EX0=1;    //外部中断INT0, (1:开,      0:关    )
  CodeTemp=0;    //初始化红外编码字节缓存变量
}
main()
{                       
init();
while(1)
{
}
}


回复

使用道具 举报

ID:1 发表于 2018-10-18 23:53 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表