mTouch 发表于 2012-11-27 13:30:30

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

      如题,哪位做过? 能把C写的源代码共享一下吗?

nongxiaoming 发表于 2012-11-27 13:37:37

不是跟C52一个样的吗?改改就用了~~

mTouch 发表于 2012-11-27 13:40:41

nongxiaoming 发表于 2012-11-27 13:37 static/image/common/back.gif
不是跟C52一个样的吗?改改就用了~~

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

linguicheng 发表于 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;        //读表格数据,串行发送数据
      
   
         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++)
    {
    }
}
}





linguicheng 发表于 2012-11-27 21:12:37

这个是我以前用过的,可用的。你自己修改一下就行。。。

jst877863 发表于 2012-11-27 21:49:38

正好学习,支持

mTouch 发表于 2012-11-28 10:31:19

linguicheng 发表于 2012-11-27 21:12 static/image/common/back.gif
#include
#include
#include


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

linguicheng 发表于 2012-11-28 22:11:29

12MHZ时钟
页: [1]
查看完整版本: 哪位写过用89C2051做的红外发射程序