原创 学习型红外遥控开关控制灯口源程序

2011-3-1 20:51 5325 8 15 分类: MCU/ 嵌入式

源程序代码及释意

 

 

#include<reg52.h>       

#define uchar unsigned char

#define uint unsigned int     //定义变量名

#define Imax 14000  

#define Imin 8000 

#define Inum1 1450  

#define Inum2 700

#define Inum3 3000  //定义解码时中断时间相应的取值。

#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值

sfr P1M1=0X91;

sfr P1M0=0X92; //声明P1口的软件配置工作类型寄存器地址

sfr AUXR=0X8E; //声明AUXR寄存器地址

sfr IAP_DATA=0XC2;

sfr IAP_ADDRH=0XC3;

sfr IAP_ADDRL=0XC4;

sfr IAP_CMD=0XC5;

sfr IAP_TRIG=0XC6;

sfr IAP_CONTR=0XC7; //声明EEPROM存储器所用寄存器地址

sbit pro=P3^7; //定义学习按键接口为P3.7

sbit tel=P1^2; //定义指示灯控制位为P1.2

sbit control=P1^1; //定义双向可控硅控制位为P1.1

void IAP_DISABLE();//声明禁止IAP函数

BYTE_READ(uchar addr);  //声明字节读函数

void SECTOR_ERASE(uchar addr); //声明字节擦除函数

void BYTE_PROGRAM(uchar addr, uchar edata); //声明字节写入函数

uchar Im[4];//定义红外编码是数组

unsigned long m,Tc; //定义编码个数及时长时长

uchar f;    //

uchar IrOK; /定义/红外接收合法

uchar funnum;

uchar open,open1,close,close1; //定义开关编码寄存器

void delay1(uchar i)  //延时函数1

{

  uchar j;

  uint k;

  for(j=i;j>0;j--)

    for(k=1500;k>0;k--);

}

 

void delay2(uchar i)  //延时函数2

{

  uchar j,k;

  for(j=i;j>0;j--)

    for(k=125;k>0;k--);

}

/*EEPROM读写程序*/

BYTE_READ(uchar addr)// EEPROM字节读函数

 {

IAP_DATA = 0x00; //清空EEPROM寄存器内容

IAP_CONTR=ENABLE_ISP;//设置IAP_CONTR寄存器

IAP_CMD=0X01; //送字节读命令

IAP_ADDRH=0X00;

IAP_ADDRL=addr; //送EEPROM地址,高八位不用

IAP_TRIG=0X5A;

IAP_TRIG=0XA5; //触发寄存器

delay1(2);        // 延时

IAP_DISABLE();//禁止IAP

return (IAP_DATA); //返回读的数据

}

void BYTE_PROGRAM(uchar addr ,uchar edata)//EEPROM字节写函数

{

IAP_CONTR=ENABLE_ISP; //设置IAP_CONTR寄存器

IAP_CMD=0X02; //送字节写命令

IAP_ADDRH=0X00;

IAP_ADDRL=addr; //送EEPROM地址,高八位不用

IAP_DATA=edata;//送入写的数据

IAP_TRIG=0X5A;

IAP_TRIG=0XA5; //触发寄存器

delay1(2); // 延时

IAP_DISABLE();//禁止IAP

 }

 

 void SECTOR_ERASE(uchar addr) //EEPROM字节擦除函数

{

IAP_CONTR=ENABLE_ISP; //设置IAP_CONTR寄存器

IAP_CMD=0X03; //送字节写命令

IAP_ADDRH=0X00;

IAP_ADDRL=addr; //送EEPROM地址,高八位不用

IAP_TRIG=0X5A;

IAP_TRIG=0XA5; //触发寄存器

delay1(2); // 延时

IAP_DISABLE();//禁止IAP

 }

 

void IAP_DISABLE()//禁止IAP函数

{

IAP_CONTR=0X00; //禁止IAP

IAP_CMD=0X00; //填写IAP_CMD为0

IAP_ADDRL=0X00;

IAP_ADDRH=0X80; //地址指向最高防止误动作

 

}

/*演示主程序*/

void main(void)

{

         tel=0; //指示灯亮

         delay2(200); // 延时

         tel=1; //指示灯灭

         funnum=1;

         AUXR=0X00;

         P1M1=0X00;

         P1M0=0X02; //P1.1设为推挽输出

         IAP_ADDRH=0X00;//地址就不访问高8位了

         m=0;

         f=0;

         EA=1;  //开中断

         IT1=1;EX1=1;//边沿触发方式

         TMOD=0x01;  //设置中断定时器方式

         TH0=0;

TL0=0;   //定时器置零

         TR0=1; //开启定时器0中断

  open=BYTE_READ(0x00);

delay1(2);

  open1=BYTE_READ(0x01);

delay1(2);

   close=BYTE_READ(0x02);

delay1(2);

  close1=BYTE_READ(0x03);//读存储器内红外开关数据

delay1(2);

 

 while(1) //循环函数

 {

  goon:delay1(5); //延时

      if(IrOK==1)//如果收到的的编码信号合法

      {

 

           if(pro==0)//如果学习键按下

             {control=0;//开始编程时禁止打开开关

               if(funnum==1)//第一次采集开的信号

                  {

 

 open=Im[0];

 open1=Im[2];//编码存入开启寄存器

 SECTOR_ERASE(0X00);  //擦除要存储的地址           

delay1(2);                //延时 

BYTE_PROGRAM(0x00 ,open); //开的编码写入存储器

 delay1(2);                    //延时

 BYTE_PROGRAM(0x01 ,open1); //开的反编码写入存储器

                    tel=0;     //指示灯亮

                    delay2(200); //延时

                   funnum++;  //存储下一个键

                   IrOK=0;    //清除编码合法标志

                    goto  goon; //循环

                    }

               if(funnum==2)    //如果该存关的编码了

                 {

                  close=Im[0];

                  close1=Im[2]; //编码存入关的寄存器

delay1(2);   //延时

 BYTE_PROGRAM(0x02,close); //关的编码写入存储器

                  delay1(2);   //延时

 BYTE_PROGRAM(0x03,close1); //关的反编码写入存储器

 tel=0; //指示灯亮

                  delay2(200); //延时

                   tel=1;  //指示灯灭

                  funnum=1;//恢复标识初始值

                  IrOK=0;  //清除编码合法标志

                  goto  goon;//继续循环

                  }

               }

               if(pro==1) //如果按键没有按下

               {

               if(open==Im[0]&&open1==Im[2])//打开信号与预存编码相等且反码也相等

                {control=1;

tel=0;//打开灯,且指示灯亮

}

               if(close==Im[0]&&close1==Im[2]) //关闭信号与预存编码相等且反码也相等

                {control=0;

tel=1;} //关闭灯,且指示灯灭

          }

      }

    }

  }

//外部中断解码程序

void intersvr1(void) interrupt 2 using 1

{       Tc=TH0*256+TL0;        //提取中断时间间隔时长

        TH0=0;

        TL0=0;              //定时中断重新置零

    if((Tc>Imin)&&(Tc<Imax))

        {

         m=0;

        f=1;

       return;

         }       //找到启始码

    if(f==1)

       {

        if(Tc>Inum1&&Tc<Inum3)

           {

         Im[m/8]=Im[m/8]>>1|0x80; m++;

            }

      if(Tc>Inum2&&Tc<Inum1)

            {

         Im[m/8]=Im[m/8]>>1;

 m++; //取码0-7都属于IM0在8-15都是IM1在16-23时属于IM2以此类推

            }

           if(m==32)

      {

         m=0;

         f=0;

         if(Im[2]==~Im[3]&&Im[0]==~Im[1]) //取码完成后判断读码是否正确

           {

             IrOK=1;//编码合法标志置一

            }

                                                      

        else IrOK=0;  //取码完成后判断读码是否正确

    }

  }

 }

PARTNER CONTENT

文章评论11条评论)

登录后参与讨论

用户377235 2012-5-24 13:27

我按照你的电路做了,就是用的STC12C2052AD芯片。电路可以用,但是断电后就存不住数据。我也把存储器的一些东西改了。就是不行。帮帮忙吧我的邮箱lijiangbo0312@163.com 谢谢

用户420162 2012-4-18 19:06

初学单片机、请各位高手多多指点!!!

用户377235 2012-3-28 21:32

哪个中断程序有点不是恨了解啊

用户1589473 2012-1-4 10:31

谢谢楼主的好程序

用户1433066 2011-10-30 19:30

那是中断口不用定义

用户347137 2011-4-5 16:35

打错了,这程序有问题,不能用的,

用户347137 2011-4-5 16:34

这电路根本就是有问题的,不能用的哦,后面的人别上当哦,别浪费了编程器和单片机的钱,

用户387337 2011-3-17 17:40

现在我的电路都已经弄好了,就差程序的问题了,请帮忙改一下好吗?在线等!邮箱:13633151145@139.com

用户387337 2011-3-17 17:37

第29行有错误啊

用户387337 2011-3-17 17:35

您好啊!源程序好像有点问题啊!您没有定义P3.3口啊,红外根本读不进去啊!你看一下,是不是有问题?
相关推荐阅读
用户1433066 2010-11-23 13:04
学习型红外遥控开关控制灯口电路图
...
用户1433066 2010-06-20 11:38
外围简单的0-999V自动量程电压表程序
#include<pic.h>#define uchar unsigned char#define uint  unsigned int__CONFIG(11111110111010);/...
用户1433066 2010-06-20 11:36
外围简单的0-999V自动量程电压表电路图
...
用户1433066 2010-01-09 17:25
外围简单的0-999V自动量程电压表视频
外围简单的0-999V自动量程电压表http://www.tudou.com/v/drP2MbPZBVQ...
用户1433066 2010-01-09 14:46
5元制作PIC单片机烧录器
                            5元制作PIC单片机烧录器                                                           ...
EE直播间
更多
我要评论
11
8
关闭 站长推荐上一条 /3 下一条