源程序代码及释意
#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; //取码完成后判断读码是否正确
}
}
}
用户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
用户387337 2011-3-17 17:37
用户387337 2011-3-17 17:35