欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2303|回復: 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)
{
}
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2018-10-18 23:53 | 只看該作者
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表