搜索
bottom↓
回复: 7

哪位写过用89C2051做的红外发射程序

[复制链接]

出0入0汤圆

发表于 2012-11-27 13:30:30 | 显示全部楼层 |阅读模式
      如题,哪位做过? 能把C写的源代码共享一下吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-11-27 13:37:37 | 显示全部楼层
不是跟C52一个样的吗?改改就用了~~

出0入0汤圆

 楼主| 发表于 2012-11-27 13:40:41 | 显示全部楼层
nongxiaoming 发表于 2012-11-27 13:37
不是跟C52一个样的吗?改改就用了~~

  哪里有下? 网上找了一下,是发现很多,但是不知道哪个能用!

出0入0汤圆

发表于 2012-11-27 21:12:03 | 显示全部楼层
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit P3_4=P3^4 ;
static bit OP;        //红外发射管的亮灭
static unsigned int count;       //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char flag;      //红外发送标志
char iraddr1;  //十六位地址的第一个字节
char iraddr2;  //十六位地址的第二个字节
int u=0;
uchar key11;
void SendIRdata(char p_irdata);
void delay();
uchar sccode,recode;
void dlms(void);                        /*延时函数*/
uchar kbscan(void);                     /*键扫描函数*/
uchar flag1;                             /*按键标志位  用于显示164的标志*/
uchar idata LED[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0xc3,0x85,0x61,0x71,0x31,0x31};
uchar        num=0;       
void dlms()
  { uchar i;
    for(i=200;i>0;i--){}
  }
uchar kbscan(void)
{
    uchar sccode,recode;
    P1=0xf0;                           /*发全0行扫描码,列线输入*/
    if((P1&0xf0)!=0xf0)                /*判断读进来的P1是否有变化,既有无键按下*/
      { dlms();                        /*延时去抖*/
        flag1=1;
        if((P1&0xf0)!=0xf0)            /*再判断是否是误动作引起的键变化*/
          {sccode=0xfe;                /*逐行扫描码初值*/
           while((sccode&0x10)!=0)     /*判数行扫描码左移时,不超4位*/
            {P1=sccode;                /*输出行扫描码*/
              if((P1&0xf0)!=0xf0)      /*判断读进P1是否有变化,既本行有无键按下*/
               {recode=(P1&0xf0)|0x0f;
                return((~sccode)+(~recode));/*返回按键特征码*/
               }
              else
                sccode=(sccode<<1)|0x01;  /*行扫描码左移一位*/
            }
          }
        }
       flag1=0;
      return(0);
}
void todokey(q)
  uchar q;
{
  switch(q)
  {//key11
   case 0x11: {num =0x00;break;}   /*0*/
   case 0x21: {num =0x01;break;}   /*1*/
   case 0x41: {num =0x02;break;}   /*2*/
   case 0x81: {num =0x03;break;}
   case 0x12: {num =0x04;break;}
   case 0x22: {num =0x05;break;}
   case 0x42: {num =0x06;break;}
   case 0x82: {num =0x07;break;}
   case 0x14: {num =0x08;break;}
   case 0x24: {num =0x09;break;}
   case 0x44: {num =0x0a;break;}
   case 0x84: {num =0x0b;break;}
   case 0x18: {num =0x0c;break;}
   case 0x28: {num =0x0d;break;}
   case 0x48: {num =0x0e;break;}   /*E*/
   case 0x88: {num =0x0f;break;}   /*F*/
   default:break;  
  }
}
void main()
{
  uchar key=0;
SCON=0x00;        //置串口工作方式 0//
  EA=1;
  count = 0;
  flag = 0;
  OP = 0;
  P3_4 = 0;  
  TMOD = 0x11; //设定时器0和1为16位模式1
  ET0 = 1; //定时器0中断允许
  TH0 = 0xFF;
  TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次  
  TR0=0;
  iraddr1=3;
  iraddr2=252;
while(1)
  {P1=0xf0;          
  if((P1&0xf0)!=0xf0)                /*判断读进来的P1是否有变化,既有无键按下*/
    { key=kbscan();
  dlms();
  todokey(key);
  if(flag1==1)
      {
           TI=0;
           SBUF=~LED[num];        //读表格数据,串行发送数据
      
   
         TR0=1;
         for(u=0;u<5;u++)
          {delay();
             SendIRdata(num);//key11//发送的键值***************************************//
            
      }
      TR0=0;
      }      
         
      }
    }   
}   
//定时器0中断处理
void timeint(void) interrupt 1
{
  TH0=0xFF;
  TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
  count++;

  if (flag==1)
  {
    OP=~OP;
  }
  else
  {
    OP = 0;
  }
  P3_4 = OP;
}

void SendIRdata(char p_irdata)
{
  int i;
  char irdata=p_irdata;
  //发送9ms的起始码
  endcount=223;
  flag=1;
  count=0;
  do{}while(count<endcount);
  //发送4.5ms的结果码
  endcount=117;
  flag=0;
  count=0;
  do{}while(count<endcount);
  //发送十六位地址的前八位
  irdata=iraddr1;
  for(i=0;i<8;i++)
  { //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
     endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);
    //停止发送红外信号(即编码中的高电平)
     if(irdata-(irdata/2)*2)  //判断二进制数个位为1还是0
     {
       endcount=41;  //1为宽的高电平
     }
    else
     {
     endcount=15;   //0为窄的高电平
     }
    flag=0;
    count=0;
    do{}while(count<endcount);

    irdata=irdata>>1;
  }
  //发送十六位地址的后八位
  irdata=iraddr2;
  for(i=0;i<8;i++)
  {
     endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);

     if(irdata-(irdata/2)*2)
     {
        endcount=41;
     }
     else
     {
       endcount=15;
     }
     flag=0;
     count=0;
     do{}while(count<endcount);

     irdata=irdata>>1;
  }
  //发送八位数据
  irdata=p_irdata;
  for(i=0;i<8;i++)
  {
     endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);

     if(irdata-(irdata/2)*2)
     {
         endcount=41;
     }
     else
     {
       endcount=15;
     }
     flag=0;
     count=0;
     do{}while(count<endcount);
     irdata=irdata>>1;
  }
  //发送八位数据的反码
  irdata=~p_irdata;
  for(i=0;i<8;i++)
  {  endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);
     if(irdata-(irdata/2)*2)
     {endcount=41;
     }
     else
     {endcount=15;
     }
     flag=0;
     count=0;
     do{}while(count<endcount);
     irdata=irdata>>1;
  }
  endcount=10;
  flag=1;
  count=0;
  do{}while(count<endcount);
  flag=0;
}
void delay()
{ int i,j;
  for(i=0;i<400;i++)
  {
    for(j=0;j<100;j++)
    {
    }
  }
}
  
  
  
  

出0入0汤圆

发表于 2012-11-27 21:12:37 | 显示全部楼层
这个是我以前用过的,可用的。你自己修改一下就行。。。

出0入0汤圆

发表于 2012-11-27 21:49:38 | 显示全部楼层
正好学习,支持

出0入0汤圆

 楼主| 发表于 2012-11-28 10:31:19 | 显示全部楼层
linguicheng 发表于 2012-11-27 21:12
#include
#include
#include

谢谢!
还有一个问题,是时钟频率是用多少的? 12MHZ 还是11.0592MHz的!

出0入0汤圆

发表于 2012-11-28 22:11:29 | 显示全部楼层
12MHZ时钟
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 20:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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