Sector_Erase(0x0000);//擦除扇区 1 Sector_Erase(0x200); Sector_Erase(0x400); Sector_Erase(0x600); Sector_Erase(0x800); Sector_Erase(0xa00);
Sector_Erase(0xc00);//擦除扇区 7 EX1=1; //开外部中断1
IT1=1;//外部中断1边沿触发,不然按住的时候一直中断 EA=1; delayms(1);
//等待按键时两个灯灭 while(1) {
if(receive)//外部按键中断1,正式进入接收函数 {
FASHE=0;//发射指示灯 JIESHOU=1; //接收指示灯 delayms(3000); JIESHOU=0; delayms(2); FASHE=1; delayms(3000); FASHE=0;
jieshou(); //接收函数是T0定时开始后计数满溢出跳出的 }
if(!KEY) //KEY为0时进入发射模式 {
JIESHOU=0;
delayms(200); FASHE=1; delayms(200); KEY=1; fashe(); } } }
/********************************************************************/
//接收函数初始化 void init1()//接收初始化 {
finish=1;
EA=0; //因为下面要写EEPROM,必须关闭EA TMOD=0x01;//T0方式1 TH0=0x00; TL0=0x00; TR0=0; EX0=1;
EX1=0;//关闭外部中断1按键 ,一旦进入接收函数,就关闭按键防止干扰 ET0=1; //开T0中断 IT0=1; //外部中断边沿触发 EA=0; } //
/********************************************************************/
//发射函数初始化
void init2()//发射初始化 {
contrl=0;//关闭发射端,由于它与38K输出端并联,所以拉低不输出 TMOD=0x21;//T0方式1,外部INTO唤醒 ,T1方式2 TH1=-(13/256);//定时13us翻转一次,即38KHZ (26us) TL1=-(13%6); ET1=1; //T1中断 TR1=1; EA=1; }
/************************************************************************/
// 红外接收子程序 void jieshou() {
init1(); //接收初始化 delayms(3000); flag=0; finish=1;
JIESHOU=1;//接收灯亮才可以开始按遥控 EA=1;//开中断 EX0=1; //接收灯亮等待接收
while(finish) //退出接收循环检测 {
while(flag)//T0已启动标志,用完记得清0,由外部中断0启动,初次启动检测
{//第一次低电平测宽已经开始
while(!cin);//等待高电平到来,T0中断不会在这里发生,因为低电平宽度不会有65MS这么长 { TR0=0;
a[j]=TH0; //低电平宽度 先存高8位数据 j++;
a[j]=TL0;//存储的是低电平宽度 j++;//数组下移 TH0=0;//重装T0
TL0=9;//补偿前面消耗的时间
TR0=1;//重新启动T0,计时高电平 }
//高电平测宽开始
while(cin&&flag);//等待cin低电平到来。T0中断就是在这里等待的时候发生的,因为最后一个电平必然是高电平(无信号就是高) //flag=1表示T0还没中断,还是接收有效
if(flag)//flag为1才表示计时有效,flag=0表示最后高电平很长结束了 { //加个flag才能退出这个等待 TR0=0;
a[j]=TH0; //先存高8位数据 j++;
a[j]=TL0;//存储的是低电平段 j++;//数组下移 TH0=0; //重装T0 TL0=0;
TR0=1;//重新启动T0,计时低电平 } }
//判断是否退出接收
if(end) {
receive=0;//用完接收启动标志要清0 flag=0; FASHE=1; delayms(122);
JIESHOU=1;//亮两个灯表示接收成功 j=0; finish=0; end=0; } }
//接收完亮两个灯 finish=1;
EX1=1;//开外部按键中断1 EA=1; }
/***********************************************/ // 红外发射子程序
void fashe() //发射程序里没有安排推出操作,所以只有重启才能重新进入选择模式 {
while(1) { ADC(); switch(k) {