打印

请帮我检查一下关于红外线遥控电路的程序有什么错误吗

[复制链接]
1902|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
745163965|  楼主 | 2013-5-29 18:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

一 红外发射部分   
/********************************************************************
#include<reg52.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char

uchar code Disp_Tab[16] =  {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39, 0x5e,0x79,0x71};          //共阴极字型码
/*************************************************************
* 名称 :init()
* 功能 : 对系统进行初始化设定
* 输入 : 无
* 输出 : 无
*************************************************************/

void init(void)         
{
  P1=oxff;
  P3^5=0;
  IE=0;                  //关总中断与中断1
  TMOD=0x20;             //设定时器T1方式2自动重装模式
  TH1=0xf3;              //定时13us
  TL0=0xf3;
  EA=1;                  //开总中断
  SCON=0;                //置串行口工作方式0

}

/**************************************************************
* 名称 : main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
*************************************************************/
void main (void)
{
  init();        //调用初始化子程序
  Void();     //调用各功能子程序
}  
  2.键盘扫描子程序
sbit ir=P1^0;//红外发射管控制脚,使用12M晶振
unsigned int count, set_count; //中断计数,设定中断次数
bit irflag,keyflag;   //红外发送标志位,按键标志位
unsigned char irsys[]={0x00,0xff};//16位用户码
unsigned char irdata,ircode; //发送的红外数据
Void  xianshi(void)
{
        uchar Key_Value;  //读出的键值
        while(1)
        {
                P1 = 0xf0;
                if(P1 != 0xf0)
                {
                        Delay_1ms(15);        //按键消抖
                        if(P1 != 0xf0)
                        {
                                Key_Value = Keyscan();               
                        }
                }
                P0 = table[Key_Value];
                P2 = 0x07;       

void Delay_1ms(uint i)//1ms延时
{
        uchar x,j;   //输入x (延时一毫秒的个数)*/
    for(j=0;j<i;j++)
        for(x=0;x<=148;x++);       
}

void delay()    //延时,延时时间大概为10ms
{
        int i,j;
        for(i=0; i<=10; i++)
        for(j=0; j<=2; j++);
}
uchar Keyscan(void)   //按键值  实现按键的读取
{
        uchar i,j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
        for(j=0; j<4; j++)
        {
                P1 = Buffer[j];/*以下三个_nop_();作用为让 P1 口的状态稳定*/
                delay();
                temp = 0x01;                                                                                                                                                                    
                for(i=0; i<4; i++)
                {
                        if(!(P1 & temp))
                        {
                                return (i+j*4);
                        }
                        temp <<= 1;
                }       
        }
}

  3.红外编码子程序
sbit   P3^5;
static bit OP;        //红外发射管的亮灭
static unsigned int count;       //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char flag;      //红外发送标志
void SendIRdata(char p_irdata);
void delay();
void mamn(void)
{
  count = 0;
  flag = 0;
  OP = 0;
  P3^4 = 0;
  EA = 1; //允许CPU中断
  TMOD = 0x11; //设定时器0和1为16位模式1
  ET0 = 1; //定时器0中断允许
  TH0 = 0xFF;
  TL0 = 0xE8; //设定时值0为38K 也就是每隔26us中断一次  
  TR0 = 1;//开始计数
  iraddr1=3;
  iraddr2=252;
  do{
   unsigned char i;
      delay();
      SendIRdata(12);
  }while(1);
}
//定时器1中断处理
void timeint(void) interrupt 1
{
  TH0=0xFF;
  TL0=0xE8; //设定时值为38K 也就是每隔26us中断一次
  count++;
  if (flag==1)
  {
    OP=~OP;
  }
  else
  {
    OP = 0;
  }
  P3^5 = OP;
}
void SendIRdata(char p_irdata)
{
  int i;
  char irdata=p_irdata;
  //发送3ms的起始码
  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 < 200; j++)
}
  }
}
*****************单片机红外发射***********************************
4.显示子程序
Void mimakey(void)
sbit load=P2^6;
sbit din=P2^4;
sbit clk=P2^5 ;

#define decode_mode 0x09
#define intensity 0x0a
#define scan_limit 0x0b
#define shut_down 0x0c
#define display_test 0x0f

  void write7221( unsigned char address,unsigned char dat)
{
   unsigned char i;
   load=0;
    for(i=0;i<6;i++)
        {
        clk=0;
        din=(bit)(address&0x80);
        address<<=1;
        clk=1;
        }
        for(i=0;i<6;i++)
        {
        clk=0;
        din=(bit)(dat&0x80);
        dat<<=1;
        clk=1;
    }
        load=1;
}
  void initial_7221(void)
  {
  write7221(shut_down,0x01);
  write7221(display_test,0x00);
  write7221(decode_mode,0xff);
  write7221(scan_limit,0x07);
  write7221(intensity,0x03);
  }
二 接收部分
  1.主程序
#include<reg52.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char

uchar code Disp_Tab[16] =  {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39, 0x5e,0x79,0x71};          //共阴极字型码
/*************************************************************
* 名称 :init()
* 功能 : 对系统进行初始化设定
* 输入 : 无
* 输出 : 无
*************************************************************/

void init(void)        
{
  IT0=1;      //负跳变中断
  EX0=1;      //开外部中断0
  EA=1;        //开总中断
  P2^0=0;      //关锁
  P2^3=0;      //关报警
  SCON=0;      //置串行口工作方式0
  delay();     延时
}
/**************************************************************
* 名称 : main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
*************************************************************/
void main (void)
{
  init();        //调用初始化子程序
  Void();     //调用各功能子程序
}
  2.键盘扫描及密码修改子程序
Void  mimakey(void)
{
  uchar  i, key;//i循环变量  key建好暂存器
  bit  keyok;
  for (i=0;i<6;i++) {mima [i]=i+2;  //设置初始密码234567
  {diss [i]=i;}  //在无输入时显示012345
  disp(diss);
  key=keyin();  //等待键按下 度键号
/******************以下为输入密码状态***********、
if((key==0x0b)&(keyok==0))
{
  for(i=0;i,<6;i++)   //六位密码输入
  {
    key=keyin();  //读一位
    if(key==0x0b)  break;
    if(key>=0x0a)  {do{key=keyin();}
  while(key>=0x0a);}
    mima[i]=key;  //密码数字存于mima暂存器中
    diss[i]=15;   //没输入一位密码显示E
    disp(diss);
}
if ( key!=0x0d)
{
   key=keyin ();
   if  (key==0x0d);   //六位密码输入完成时,是否确认
  
   else
   {
        if (key!=0x0c)
        while (keyin() !=0x0c);  //等待确认键按下
        while (page_rd (0,6, &diss[0]==0);  //在24w02中读取密码
        keyok=1;
        for(i=0;i<6;i++)  //比较六位密码
        {
         if (mima[i]!=diss[i] ) {keyok=0; break;}  //密码错误是解锁状态为0      
  }
         if(keyok==1)   {right=1; error=0;}
         else   {right=0; error=1 ; }  //当密码错误时闭锁
            if(error=1)   p^0=0  p^3=0;
            If(i=0;i++;i=3) p^3=0;
         while    void delay()    //延时,延时时间大概为10s
{
        int i,j;
        for(i=0; i<=100; i++)
              }
      }
}
/******************以上为输入密码状态*****************************/
  
/******************以下为修改密码状态*****************************/
     if(keyok==1)
     {
        if(key0x0d)
        {
            keyok=0; right=0; error=1;  //解锁状态设为0,闭锁
         }
         if ( key==0x0a )  //是设定键时,进入密码设置状态
         {
             for ( i=0; i<6; i++)
             {
             key=keyin ();
             if ( key==0x0d )   break;
             if ( key>=0x0a )   {do { key=keyin ();} while ( key.=0x0a ); }
             mima [i]=key;  //密码数字存于mima暂存器中
             diss [i]=14;
             disp ( diss );  //送显示
             }
             if ( key!=0x0d )  //6位输入完成时是否要确认,未完成则返回
             {
               key=keyin ();
               if  (key==0x0d);  //按下取消键时,设置密码取消
               else
               {
                if (key!=0x0c)    while (keyin()!=0x0c);  //等待确认键按下
                while (page_wr (0,6,&mima[0])==0);  //写入密码24w02

                 }
                }
              }
            }
/*****************以上未修改密码状态*************************/
}
  3.红外解码子程序
Void  jiema(void)
unsigned char d_code_x(unsigned int t)        {
                if(t<3ms )
                        return 0;
                else
                        {
                                if(t>3ms)
                                        return 1;
                                else
                                        return 0xff;//错误
                        }
        }
{
        unsigned int temp;
        unsigned char dd_code;
        if(TR0==0)
                {
                        TH0=TL0=0;
                        TR0=1;
                }
        else
                {
                        TR0=0;
                        temp=TH0*256+TL0;
                        TH0=TL0=0;
                        TR0=1;
                        dd_code=d_code_x(temp);
                        if(dd_code==0||dd_code==1)
                                {
                                        code_t=(code_t<<1)+dd_code;
                                        code_length++;
                                }
                        else
                                {
                                        if(code_length>=_code_length && code_right==0)
                                                {                                                       
                                                        code_tt=code_t;//红外代码正确
                                                        code_right=1;
                                                }
                                        code_length=0;
                                        code_t=0;       
                                }
                }       
}
  4.显示子程序
Void mimakey(void)
sbit load=P2^6;
sbit din=P2^4;
sbit clk=P2^5 ;

#define decode_mode 0x09
#define intensity 0x0a
#define scan_limit 0x0b
#define shut_down 0x0c
#define display_test 0x0f

  void write7221( unsigned char address,unsigned char dat)
{
   unsigned char i;
   load=0;
    for(i=0;i<6;i++)
        {
        clk=0;
        din=(bit)(address&0x80);
        address<<=1;
        clk=1;
        }
        for(i=0;i<6;i++)
        {
        clk=0;
        din=(bit)(dat&0x80);
        dat<<=1;
        clk=1;
    }
        load=1;
}
  void initial_7221(void)
  {
  write7221(shut_down,0x01);
  write7221(display_test,0x00);
  write7221(decode_mode,0xff);
  write7221(scan_limit,0x07);
  write7221(intensity,0x03);
  }

相关帖子

沙发
epherun| | 2013-9-23 14:50 | 只看该作者
我也搞这个

使用特权

评论回复
板凳
epherun| | 2013-9-23 14:52 | 只看该作者
红外程序联系方式QQ735842429

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝