⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p87lpc764+万能遥控调光调速器.c

📁 P87LPC764+万能遥控调光调速器.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
}
Read_Last_FireAngle(); 
if(ON==0){ 
/*渐亮到上一次调定的亮度*/ 
ON=1; /*允许可控硅触发*/ 
Led=1; /*指示灯灭*/ 
if(CtlLamp) 
for(Fire_Angle=10;Fire_Angle>Last_FireAngle;Fire_Angle--) Delay(1);

else{ 
Fire_Angle=MaxFireAngle/2; /*中速运转*/ 
Delay(3000); /*延迟5s*/ 
/*转变为上次调定的转速*/ 
if(Fire_Angle>Last_FireAngle){ 
while(Fire_Angle>Last_FireAngle){ 
Fire_Angle--; 
Delay(1); 
} 
}
else{ 
while(Fire_Angle<Last_FireAngle){ 
Fire_Angle++; 
Delay(1); 
} 
} 
} 
}
else{ 
Led=0; /*指示灯点亮*/ 
if(CtlLamp) 
/*渐暗到最小亮度后关闭*/ 
for(Fire_Angle=Last_FireAngle;Fire_Angle<MaxFireAngle- 
AngleLimit;Fire_Angle++) Delay(1); 
ON=0; /*不允许可控硅触发*/ 
}
break; 
case 2: /*点击二次*/ 
if(!CtlLamp) break; 
if(ON==0){ 
Read_Last_FireAngle(); 
Fire_Angle=Last_FireAngle; 
ON=1; /*可控硅打开为上次亮度*/ 
Led=1; /*指示灯关闭*/ 
}
else{ 
/*可控硅关闭*/ 
ON=0; 
Led=0; 
}
break; 
case 3: /*点击三次*/ 
break;

case 4: /*持续按住*/ 
EX1=0; 
i=0; 
while(CONTI || CONTI_R){/*亮度逐渐增大,直到放开*/ 
WDRST=0X1E; /*清看门狗*/ 
WDRST=0XE1; 
if(ON==0){ /*原来关闭,亮度从0 开始,是电机,不予理会*/ 
if(CtlLamp){ 
ON=1; 
Led=1; 
Fire_Angle=MaxFireAngle-AngleLimit; 
} 
}
if(ON){ 
if(CtlLamp){/*灯*/ 
if(Fire_Angle>AngleLimit){ 
Fire_Angle-=1; 
Delay(1); 
} 
else 
Fire_Angle=AngleLimit; 
}
else{/*电机*/ 
if(Fire_Angle>AngleLimit+SpeedLimit){ 
Fire_Angle-=1; 
Delay(1); 
} 
else 
Fire_Angle=AngleLimit+SpeedLimit; 
} 
}
if(INT1){ /*等待遥控键释放*/ 
if(i++>100) CONTI_R=0; 
}
else 
i=0; 
}
Write_FireAngle(); 
EX1=1; 
break; 
case 5: /*点击一次,持续*/ 
EX1=0; 
i=0;

while(CONTI || CONTI_R){/*亮度逐渐减小,直到放开*/ 
WDRST=0X1E; /*清看门狗*/ 
WDRST=0XE1; 
if(ON){ 
if(CtlLamp){ 
if(Fire_Angle<MaxFireAngle-AngleLimit) { 
Fire_Angle+=1; 
Delay(1); 
} 
else{ 
Fire_Angle=MaxFireAngle-AngleLimit; 
ON=0; 
Led=0; 
} 
}
else{ 
if(Fire_Angle<MaxFireAngle-AngleLimit-SpeedLimit) { 
Fire_Angle+=1; 
Delay(1); 
} 
else{ 
Fire_Angle=MaxFireAngle-AngleLimit-SpeedLimit; 
ON=0; 
Led=0; 
} 
} 
}
if(INT1){ /*等待遥控键释放*/ 
if(i++>100) CONTI_R=0; 
}
else 
i=0; 
}
Write_FireAngle(); 
EX1=1; 
break; 
case 6: /*点击二次,持续*/ 
ON=0; /*禁止可控硅*/ 
IsStudy=1; /*设置红外学习标志*/ 
StudyOK=0; 
i=20; /*设置10s 学习时间*/ 
while(!StudyOK){/*等待学习完成,Led 闪烁*/ 
Led=~Led; 
Delay(500);


if(i--==0) goto NoSt; 
} 
/*学习成功*/ 
Led=1; 
Delay(100); 
Led=0; 
Delay(100); 
Led=1; 
Delay(100); 
NoSt: 
Led=0; 
IsStudy=0;/*进入接收状态*/ 
StudyOK=0; 
break; /*红外学习*/ 
default: 
break; 
} 
FuncCode=0; 
FuncSet=0; /*清除功能设置标志*/ 
}
void Write_FireAngle() 
{ 
Buf1[0]=Fire_Angle%256; 
Buf1[1]=Fire_Angle/256; 
WriteEE(128,2,Buf1); 
}
void Read_Last_FireAngle(void) 
{ 
ReadEE(128,2,Buf1); 
Last_FireAngle=Buf1[0]+Buf1[1]*256; 
}
void Write_MaxFireAngle() 
{ 
Buf1[0]=MaxFireAngle%256; 
Buf1[1]=MaxFireAngle/256; 
WriteEE(136,2,Buf1); 
}
void Read_MaxFireAngle(void) 
{ 
ReadEE(136,2,Buf1);

MaxFireAngle=Buf1[0]+Buf1[1]*256; 
}
void WDFeed() /*清看门狗*/ 
{ 
WDRST=0X1E; 
WDRST=0XE1; 
}
/*三次过零的时间间隔除于2 即为半周期时间值*/ 
void Calc_MaxFireAngle() 
{ 
while((CMP1 & 1)==0); /*等待过零*/ 
CMP1 &= 0xFE; /*清比较器中断标志*/ 
TR0=1; /*启动定时器*/ 
while((CMP1 & 1)==0); /*等待过零*/ 
CMP1 &= 0xFE; /*清比较器中断标志*/ 
while((CMP1 & 1)==0); /*等待过零*/ 
CMP1 &= 0xFE; /*清比较器中断标志*/ 
TR0=0; /*关闭定时器*/ 
MaxFireAngle=(TH0*256+TL0)/2; 
}
/*测量低电平宽度*/ 
unsigned char Get_L_Width() 
{ 
TH1=TL1=0; 
TR1=1; /*启动定时器*/ 
while(INT1!=1); 
TR1=0; 
TL1=(TH1*256+TL1 )/250; 
return(TL1/2); 
}
/*测量高电平宽度*/ 
unsigned char Get_H_Width() 
{ 
TF1=0; 
TH1=TL1=0; 
TR1=1; /*启动定时器*/ 
while(INT1!=0){ 
if(TH1>0X20) return(255);/*脉宽约为16ms*/ 
/*if(TF1==1) return(255);*/ 
}


TR1=0; 
TL1=(TH1*256+TL1 )/250; 
return(TL1/2); 
}
/*页写存储器,Num<=8*/ 
int WriteEE(unsigned char SubAdr,unsigned char Num,unsigned char *Wbuf) 
{ 
unsigned char data i; 
Start(); /*发送I2C 总线起始条件*/ 
if(SendByte(0xa0)!=0) return -1; /* 发送被控器总线地址*/ 
if(SendByte(SubAdr)!=0) return -1; /*发送写的地址*/ 
for(i=0;i<Num;i++) /*重复操作直到发送完最后一个数据*/ 
if(SendByte(*(Wbuf+i))!=0) return -1; 
Stop(); /*发送I2C 总线停止条件*/ 
Delay(10); /*延时10ms,等待数据写完*/ 
return 0; 
}
/*读多个字节数据 */ 
int ReadEE(unsigned char SubAdr,unsigned char Num,unsigned char *Rbuf) 
{ 
unsigned char data i; 
Start(); /* 发送I2C 总线起始条件*/ 
if(SendByte(0xa0)!=0) return -1;/*发送被控器总线写地址*/ 
if(SendByte(SubAdr)!=0) return -1; /*发送读首地址*/ 
Start(); /*发送I2C 总线重复起始条件*/ 
if(SendByte(0xa1)!=0) return(-1); /*发送被控器总线读地址*/ 
	if(Num!=1)
		{for(i=0;i<Num-1;i++) *(Rbuf+i)=ReadByte(); 
		SendACK(); /*发送应答信号*/ 
		 
	*(Rbuf+Num-1)=ReadByte(); 
	} 
else 
*Rbuf=ReadByte(); 
SendNoACK(); /*最后一个字节,发送非应答信号*/ 
Stop(); /*发送I2C 总线停止条件*/ 
return(0); 
} 
/*字节数据传送子程序发送一个字节数据或地址给被控器*/ 
int SendByte(unsigned char a)
{ 
unsigned char data i,j; 
unsigned char bdata Sin; 
Sin=a; 
for(i=0;i<8;i++) 
{ 
if((Sin & 0x80)==0) 
SDA=0; 
else 
SDA=1; 
for(j=0;j<2;j++); 
SCL=1; /*置时钟线为高通知被控器开始*/ 
for(j=0;j<4;j++);/*保证时钟高周期大于4 s*/ 
SCL=0; 
Sin=Sin<<1; 
}
for(j=0;j<2;j++); 
SDA=1; 
for(j=0;j<2;j++); 
SCL=1; 
for(j=0;j<2;j++); 
if (SDA==0) {SCL=0;return 0;} /*成功,返回0*/ 
for(j=0;j<1;j++); 
SCL=0; 
return -1; /*未收到应答,返回-1*/ 
}
/*数据接收子程序从被控器接收一个字节数据*/ 
unsigned char ReadByte() 
{ 
unsigned char data i,j; 
unsigned char bdata Sin; 
SDA=1; 
for (i=0;i<7;i++) 
{ 
SCL=0; 
for(j=0;j<2;j++); 
SCL=1; 
if(SDA==1) 
Sin|=0x01; 
else 
Sin&=0xfe; 
for(j=0;j<2;j++);
Sin<<=1; 
} 
SCL=0; 
for(j=0;j<2;j++); 
SCL=1; 
if(SDA==1) 
Sin|=0x01; 
else 
Sin&=0xfe; 
for(j=0;j<2;j++); 
return(Sin); 
}
/*发送应答位*/ 
void SendACK() 
{ 
unsigned char data j; 
SCL=0; 
for(j=0;j<2;j++); 
SDA=0; 
for(j=0;j<2;j++); 
SCL=1; 
for(j=0;j<4;j++); 
SCL=0; 
}
/*发送非应答位*/ 
void SendNoACK() 
{ 
unsigned char data j; 
SCL=0; 
for(j=0;j<2;j++); 
SDA=1; 
for(j=0;j<2;j++); 
SCL=1; 
for(j=0;j<4;j++); 
SCL=0; 
}
/*START 启动I2C 总线子程序发送I2C 起始条件*/ 
void Start(void) 
{ 
unsigned char data i;
SDA=1; /* 发送起始条件的数据信号*/ 
for (i=0;i<2;i++); 
SCL=1; /*发送起始条件的时钟信号*/ 
for(i=0;i<4;i++) ; /*起始条件建立时间大于4.7 s*/ 
SDA=0; /*发送起始信号*/ 
for(i=0;i<4;i++); /*起始条件锁定时间大于4 s*/ 
SCL=0; /*钳住I2C 总线准备发送或接收数据*/ 
}
/*STOP 停止I2C 总线子程序发送I2C 总线停止条件*/ 
void Stop(void) 
{ 
unsigned char data i; 
SDA=0; 
for(i=0;i<2;i++) ; 
SCL=1; 
for(i=0;i<4;i++) 
SDA=1; 
for(i=0;i<4;i++); 
}
/*一次延时1ms*/ 
void Delay(unsigned int x) 
{ 
unsigned char j; 
while(x--){ 
WDRST=0X1E; /*清看门狗*/ 
WDRST=0XE1; 
for(j=0;j<120;j++); 
} 
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -