#include "chen.h"
#include "eepm.c"
//---------------------------------------------------------------------------
void timer1isr(void) interrupt 3//TIMER1中断
{
key_jiance();//按键检测程序
if(valuecout!=0)//自动清零程序
{
valuejia++;
if(valuejia>=20)//1S
{
valuejia=0;
valuecout=0;
}
}
else
valuejia=0;
if(waitbiao1==1)//超时判断
{
waitjia++;
if(waitjia>=2)//100MS
{
waitjia=0;
waitbiao2=1;
waitbiao1=0;//清零
}
}
else
waitjia=0;
TH1=0x3c;//50MS
TL1=0xb0;
TF1=0;
}
//---------------------------------------------------------------------------
void int0isr(void) interrupt 0 //INT0中断
{
if(Remflag==1)
{
addrdata=TH1;
addrdata=(addrdata<<8)+TL1;
TH0=0x00;
TL0=0x00;
if(cntint<16)//地址
{
tempaddr=tempaddr<<1;//将接收的到最低位移到最高位
if(addrdata>rembjzhi)//判断接收的地址
{
tempaddr|=1;//宽脉冲为1
}
cntint++;//中断次数加1
}
else
{
if(cntint<24)
{
tempkey=tempkey<<1;
if(addrdata>rembjzhi)//判断接收的数据
{
tempkey|=1;
}
cntint++;
}
else
{
EX0=0;//关外部中断0
TR0=0;//清零
TMOD&=0xf0;//设定时器1为定时方式
TMOD|=0x01;
TH0=0x00;
TL0=0x00;
Remflag=0;
cntint=0;
valuecout++;
if(valuecout>=5)
{
valuebuf[valueshu]=tempaddr;
valuebuf[valueshu]<<=8;
valuebuf[valueshu]|=tempkey;
valueshu++;
if(valueshu>=5)
{
valueshu=0;
valuecout=0;
jieshujchuli_qi=1;//启动接收数据处理程序
}
}
}
}
}
IE0=0;//标志位清零
}
//---------------------------------------------------------------------------
void caiji_chuli(void)//接收数据处理程序
{
if(jieshujchuli_qi)
{
if(valuebuf[1]==valuebuf[2])//错误码处理
{
remvalue=valuebuf[1];
}
else
{
if(valuebuf[2]==valuebuf[3])
{
remvalue=valuebuf[2];
}
else
{
if(valuebuf[3]==valuebuf[4])
{
remvalue=valuebuf[3];
}
}
}
if(remvalue!=0)//判断是否是有效值
{
if(cunrelay_compare()) //记录数据比较函数
{
if(ledzhi_close==1)//判断是否为只关闭状态
{
led=1;//指示灯关闭
}
else
{
led=~led;
}
xuexi_qi=0;//清零
}
else
{
if(xuexi_qi==1)
{
eeprom_xtcs_write(0);//记录参数存储
xuexi_qi=0;
led=0;//亮
}
}
}
cntint=0;
Remflag=0;//清零
tongbuma=0;
remvalue=0;
rembjzhi=0;
addrdata=0;
jieshujchuli_qi=0;
led=~led;
}
if(relay_clear_biao==1)//判断是否清空记录
{
relay_clear_biao=0;
eeprom_xtcs_write(1); //记录清空
}
}
//---------------------------------------------------------------------------
void key_jiance(void)//按键检测程序
{
if(key==0)//判断按键是否按下
{
keyjia1++;
if(keyjia1>=20)//1S
{
keyjia1=0;
keyjia2++;
led=~led;
}
}
else
{
if(keyjia2>=15)//清空学习记录
{
relay_clear_biao=1;//记录清空
led=1;//亮
}
else
{
if(keyjia2>=10)//只关闭功能
{
ledzhi_close=~ledzhi_close;//LED只关闭
}
else
{
if(keyjia2>=5)//学习功能
{
xuexi_qi=1;//学习启动标志置1
led=0;//灭
}
}
}
keyjia1=0;
keyjia2=0;//清零
}
}
//---------------------------------------------------------------------------
void init(void)//单片机初始化
{
WDT_CONTR=0x00;//关闭看门狗
CLK_DIV=0x00; //无分频
AUXR=0x00; //定时器0 12T,定时器1 12T
P3M1=0x00;
P3M0=0x01;//LED驱动脚设置为推挽输出
TCON=0x00;//清零
TMOD=0x11;//定时器0为16位,定时器1为16位
TH0=0x00;
TL0=0x00;
TF0=0; //标志位清零
TR0=0;
ET0=0; //定时器0中断不使能
TH1=0x3c; //50MS
TL1=0xb0;
TF1=0; //标志位清零
TR1=0;
ET1=1; //定时器1中断使能
IE0=0; //标志位清零
IT0=1; //下降沿触发
EX0=0; //外部0中断使能
IAP_CONTR=0x80;//使能FLASH编程
EA=1; //打开总中断
TR1=1; //打开定时器1
led=1; //默认亮
eeprom_xtcs_read();//记录参数读出
}
//---------------------------------------------------------------------------
void main(void)
{
init();//单片机初始化
while(1)
{
if((Remflag==0)&&(jieshujchuli_qi==0))//用来检测同步码
{
while(!RemPin);//检测高电平
while(RemPin);//检测低电平
TF0=0;
TH0=0;//清零
TL0=0;
TR0=1;//启动定时器0
waitbiao1=1;//防止死机
while(!RemPin)//等待高电平
{
if(waitbiao2==1)
{
waitbiao2=0;
break;
}
}
waitbiao1=0;
waitbiao2=0;//清零
TR0=0;//关闭定时器
tongbuma=TH1;
tongbuma=(tongbuma<<8)+TL1;
if(tongbuma>2360)//判断同步码的宽度是否正确
{
IE0=0;//标志位清零
EX0=1;//开外部中断0
Remflag=1;//是同步码,标志位置1
TMOD&=0xf0;//设定时器1为定时方式
TMOD|=0x09;//定时器1为16位,启动门控制
TH0=0;
TL0=0;
TR0=1;//同步码检测成功
rembjzhi=(tongbuma*2)/31;//计算宽窄码判断值
}
}
caiji_chuli();//接收数据处理程序
}
}
//---------------------------------------------------------------------------
评论0