📄 p87lpc764+万能遥控调光调速器.c
字号:
}
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 + -