745163965 发表于 2013-5-29 18:03

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


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

#define uint unsigned int
#define uchar unsigned char

uchar code Disp_Tab ={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; //发送的红外数据
Voidxianshi(void)
{
        uchar Key_Value;//读出的键值
        while(1)
        {
                P1 = 0xf0;
                if(P1 != 0xf0)
                {
                        Delay_1ms(15);        //按键消抖
                        if(P1 != 0xf0)
                        {
                                Key_Value = Keyscan();               
                        }
                }
                P0 = table;
                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 = {0xef, 0xdf, 0xbf, 0x7f};
        for(j=0; j<4; j++)
        {
                P1 = Buffer;/*以下三个_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 ={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.键盘扫描及密码修改子程序
Voidmimakey(void)
{
  uchari, key;//i循环变量key建好暂存器
  bitkeyok;
  for (i=0;i<6;i++) {mima =i+2;//设置初始密码234567
  {diss =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=key;//密码数字存于mima暂存器中
  diss=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);//在24w02中读取密码
      keyok=1;
      for(i=0;i<6;i++)//比较六位密码
      {
         if (mima!=diss ) {keyok=0; break;}//密码错误是解锁状态为0      
}
         if(keyok==1)   {right=1; error=0;}
         else   {right=0; error=1 ; }//当密码错误时闭锁
            if(error=1)   p^0=0p^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 =key;//密码数字存于mima暂存器中
             diss =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);//写入密码24w02

               }
                }
            }
            }
/*****************以上未修改密码状态*************************/
}
3.红外解码子程序
Voidjiema(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]
查看完整版本: 请帮我检查一下关于红外线遥控电路的程序有什么错误吗