有没有人闲的没事干帮我看看程序和电路图哪里出问题了啊。一个红外光控自动窗帘

2019-07-15 10:44发布

本帖最后由 磐石526 于 2017-5-21 21:59 编辑

主程序
#include  <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define ad0_7  P1
sbit wr=P3^6;
sbit rd=P3^7;
sbit IN1=P2^0;
sbit IN2=P2^1;
sbit IN3=P2^2;
sbit IN4=P2^3;
sbit ENA=P2^4;
sbit ENB=P2^5;
sbit IR=P3^2;
uint n,y,z,m;
uchar        N[4];         
void guangkong(void);          光控制窗帘
void hongwai(void);    红外控制窗帘
void dakai(void);   窗帘打开子程序
void guanbi(void);窗帘关闭子程序
void YS(uchar time);     延时

void main()
{
  IT0 = 1;
  EX0 = 1;
  EA = 1;
  guangkong();
}
/***************************************************************
    电机打开
***************************************************************/
void dakai()
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
for(n=0;n<10;n++)
{
for(y=0;y<1000;y++);
{ENA=1;
ENB=1;
YS(2);
ENA=0;
ENB=0;
YS(1);
}
}
}
/***************************************************************
    电机关闭
***************************************************************/
void guanbi()
{
   IN1=0;
   IN2=1;
   IN3=1;
   IN4=0;
   for(z=0;z<10;z++)
   for(m=0;m<1000;m++)
   {ENA=1;
   ENB=1;
   YS(2);
   ENA=0;
   ENB=0;
    YS(1);
}
}
/***************************************************************
    光控
***************************************************************/
void guangkong()
{
uchar ad_data;
while(1)
{wr=0;
_nop_();
wr=1;//WR由低电平到高电平时,即上升沿时,AD开始采样转换
YS(1);//延时1ms,等待采样转换结束
ad0_7=0xff;//这条语句不能少,我也还不知道为什么
rd=0;//读取转换数据结果数据结果
_nop_();
ad_data=ad0_7;//把数据存到ad_data中
if(ad_data<150)
{
dakai();
}
if(ad_data>400)
{
guanbi();
}
}
}
   /***************************************************************
    红外执行
***************************************************************/

void hongwaiint0() interrupt 0
{         
   uchar j,k,r;
        uint err,Time;
        Time=0;                                         
        YS(7);        //7ms
        if(IR==0)                //确认是否真的接收到正确的信号
        {         
               
                err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
                /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
                侯,程序死在这里*/        
                while((IR==0)&&(err>0))        //等待前面9ms的低电平过去                  
                {                        
                        YS(1);
                        err--;
                }
                if(IR==1)                        //如果正确等到9ms低电平
                {
                        err=500;
                        while((IR==1)&&(err>0))                 //等待4.5ms的起始高电平过去
                        {
                        YS(1);
                                err--;
                        }
                        }
                        }
        for(k=0;k<4;k++)                //共有4组数据
                        {                                
                                for(j=0;j<8;j++)        //接收一组数据
                                {

                                        err=60;               
                                        while((IR==0)&&(err>0))//等待信号前面的560us低电平过去
                                        {
                                        YS(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IR==1)&&(err>0))         //计算高电平的时间长度。
                                        {
                                                YS(10);         //0.1ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        return;
                                                }
                                        }
                                        N[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                N[k]|=0x80;
                                        }
                                        Time=0;                //用完时间要重新赋值                                                        
                                }
                                }
         if(N[0] == ~N[1] && N[2] == ~N[3])            //校验识别码,操作码        
           {
                   r=N[2];
           }

        EX0 = 1;        

if(r==0x01)
{
dakai();

}
if(r==0x02)
{
guanbi();}         
}

/***************************************************************
    延时程序
***************************************************************/
void YS(uchar time)
{
     uchar i,j;
         for(i=0; i<time; i++)
     for(j=0; j<247; j++)_nop_();
}

红外发射

#include <REG52.h>
#include <intrins.h>
#define uchar unsigned char
#define  uint  unsigned int  
#define SBM   0x80                //识别码
#define m9    (65536-9000)               //约9mS
#define m4_5  (65536-4500)               //约4.5mS
#define m1_6  (65536-1630)               //约1.65mS
#define m_65  (65536-580)               //约0.65mS
#define m_56  (65536-560)               //约0.56mS
#define m40   (65536-40000)       //约40mS
#define m56   (65536-56000)       //56mS
#define m2_25 (65536-2250)        //约2.25mS

sbit IR  = P3^6;                                  //定义发射引脚(接PNP三极管基极)
                                
void  KEY(void);
void  ZZ(uchar x);
void  Z0(uchar temp);
void  TT0(bit BT,uint q);
void  YS(uchar time);

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:主函数
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{

  TMOD = 0x01;         //T0 16位工作方式
  IR=1;                                   //发射端口常态为高电平

  while(1)
  {
    KEY();
  }
}

void KEY(void)
{ uchar v;
  P1=0xff;           //将键盘端口未按下按键时,按键1,2输入端口为0
if(P1!=0xff)         //检测是否有按键按下,如果有则hangval必不为0xf8
   {
    YS(10);            //按键去抖动,延时10毫秒
    if(P1!=0xff)       //确实有按键按下
      {
       v=P1;
switch(v)
{

  case 0xfe:ZZ(0x01);v=0;break;  
  case 0xfc:ZZ(0x02);v=0;break;               
  default:v=0;
}  
      }
           }

}

void ZZ(uchar x)
{
  TT0(1,m9);                   //高电平9mS
  TT0(0,m4_5);               //低电平4.5mS

  /*┈ 发送4帧数据 ┈*/
  Z0(SBM);                                                                                                                                       
  Z0(~SBM);
  Z0(x);
  Z0(~x);

  /*┈┈ 结束码 ┈┈*/
  TT0(1,m_65);
  TT0(0,m40);


            

}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:单帧发送程序
入口参数:1帧数据
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Z0(uchar temp)
{
  uchar l;
  for (l=0;l<8;l++)                     //循环8次移位
       {     
                 TT0(1,m_65);                        //高电平0.65mS         
                         if(temp&0x01)
                          TT0(0,m1_6); //发送最低位
                         else        
                           TT0(0,m_56);     
                         temp >>= 1;                //右移一位
        }   
}

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:38KHz脉冲发射 + 延时程序
入口参数:(是否发射脉冲,延时约 q (uS))
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void TT0(bit BT,uint q)
{
  TH0 = q/256;                    //输入T0初始值
  TL0 = q%256;
  TF0=0;                                //清0
  TR0=1;                                //启动定时器0
  if(BT == 0) while(!TF0);        //BT=0时不发射38KHz脉冲只延时;BT=1发射38KHz脉冲且延时;
  else while(1)                            //38KHz脉冲,占空比1:5
         {
                  IR = 0;
                  if(TF0)break;
               if(TF0)break;
                  IR = 1;
                if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                  if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                  if(TF0)break;
                 }
  TR0=0;                                //关闭定时器0
  TF0=0;                                //标志位溢出则清0

  IR =1;                                //脉冲停止后,发射端口常态为高电平
}
/***************************************************************
函数功能:按键消抖    延时程序
入口参数:1ms×time       (晶振=12MHz)
***************************************************************/
void YS(uchar time)
{
     uchar i,j;
         for(i=0; i<time; i++)
     for(j=0; j<247; j++)_nop_();
}


88888.png
0条回答

一周热门 更多>