?? liheqi.c
字號:
//離合器
//date 2006/03/25
#include <REG51F.H>
sfr CKCON=0x8f;
sbit QIAN=P0^0;
sbit HOU =P0^1;
sbit SHACHE=P0^2;
sbit KEY =P0^3;
sbit LEDLI=P0^4;
sbit LEDHE=P0^5;
sbit LIN1=P1^6;
sbit HIN1=P1^3;
sbit LIN2=P1^7;
sbit HIN2=P1^4;
sbit DAOCHE=P2^0;
unsigned char jishu,number,zankongbi,s_time,aa_time,bb_time,cc_time,kuai,man,ji_time,qidong,fan_zhuan,tiaochu;
unsigned int Zhuan1,Che1;
unsigned int Zhuan,Che;
unsigned int cha,checha;
unsigned int jiajia;
int zankong;
void Int0() interrupt 0 using 0 //轉速計數
{
EA=0;
Zhuan1++;
EA=1;
}
void Int1() interrupt 2 using 2 //車速計數
{
EA=0;
Che1++;
EA=1;
}
void T0_int() interrupt 1 using 1
{
EA=0;
TR0=0;
TH0=0xFE; TL0=0x6F; //400us
TR0=1;
jiajia++;
if(jiajia>=1000)
jiajia=1000;
zankong=7-(jiajia*(7-zankongbi)/1000);
number++;
if(number<=zankong)
{
HIN1=1;
HIN2=0;
}
else
{
HIN1=0;
HIN2=1;
if(number>=10)
number=0;
}
EA=1;
}
void T1_int() interrupt 3 using 3
{
EA=0;
TR1=0;
TH1=0x3C; TL1=0xB0; //50ms
TR1=1;
if(qidong==1)
{
s_time++;
if(s_time>=(aa_time+bb_time))
s_time=0;
}
jishu++;
if(jishu>=10)
{
Zhuan=Zhuan1;
Che=Che1;
Zhuan1=0;
Che1=0;
jishu=0;
}
EA=1;
}
//--------------------------------------------------------------------------------
// The delay C function needs about 0.5 ms time
// time(us) =(i-1)* (165*6 + 2 +10)條指令 * 6 (時鐘模式)/6M(晶振)
// i=1 time =0.003ms; i=2 time=1ms i=3 time=2ms i=4 time=3ms.......
//--------------------------------------------------------------------------------
void delay(unsigned int i)
{
unsigned char j;
while(--i)
{
j=165;
while(--j);
}
}
void Fenli()
{
TR0=0;
LIN1=0;
HIN1=1;
LIN2=0;
HIN2=0;
delay(101);
if(HOU)
{
LIN1=1;
HIN1=1;
LIN2=0;
HIN2=0;
}
delay(51);
LIN1=0;
HIN1=1;
LIN2=0;
HIN2=1;
delay(51);
while(HOU)
{
LIN1=1;
HIN1=1;
LIN2=0;
HIN2=0;
}
LIN1=0;
HIN1=0;
LIN2=0;
HIN2=0;
LEDLI=1;
LEDHE=0;
delay(301);
tiaochu=0;
}
void jiehe()
{
unsigned char xx;
if((s_time==0)&&(fan_zhuan==1))
{
ji_time++;
fan_zhuan=0;
}
if(s_time==1)
fan_zhuan=1;
if((ji_time<=kuai)||(ji_time>(kuai+man)))
xx=aa_time;
else
xx=cc_time;
if(s_time<xx)
{
TR0=1;
LIN1=0; LIN2=1;
}
else
{
TR0=0;
LIN1=0;
HIN1=1;
LIN2=0;
HIN2=1;
}
}
main()
{
AUXR=0x01;
P0=0x0F;
P2=0xFF;
CKCON=0x01; //時鐘控制 為6時鐘
TMOD=0x01;//定時器模式1
TH0=0xFE; TL0=0x6F;
ET0=1; //定時器中斷允許
TR0=0;
TMOD=0x11;//定時器1用于16位定時器
TH1=0x3C; TL1=0xB0; //50ms
ET1=1;
TR1=1;
IT0=1;
IT1=1;
EX0=1; //外部中斷0使能
EX1=1; //外部中斷1使能
jishu=0;
number=0;
Zhuan1=0;
Che1=0;
Zhuan=0;
Che=0;
jiajia=0;
zankongbi=0;
aa_time=0;
bb_time=0;
s_time=0;
qidong=0;
tiaochu=0;
EA=1;
delay(601);
while(1)
{
if((KEY)||(SHACHE))
{
delay(21);//去抖 20ms
if((KEY)||((SHACHE)&&(Che<14)))
{
if(((HOU)&&(!QIAN))||(Che<4)||(DAOCHE))
{
Fenli();//有按紐信號或者剎車信號 分離
}
}
}
else
{
delay(21);//去抖 20ms
if((!KEY)&&(!SHACHE))
{
if(QIAN)//無前位信號
{ delay(6);
if(QIAN)//無前位信號
{
qidong=1;
jiajia=0;
s_time=0;
ji_time=0;
fan_zhuan=1;
if((Che<4)||(DAOCHE))
{
while(QIAN)
{
if((KEY)||(SHACHE))
break;
if(DAOCHE)
{
aa_time=3; bb_time=8; kuai=3; cc_time=1; man=9; zankongbi=7;
if(tiaochu==0)
jiehe();
}
else
{
cha=Zhuan/5;
if(cha>7) cha=7;
switch(cha)
{
case 0: aa_time=3; bb_time=8; kuai=2; cc_time=1; man=9; zankongbi=7; break;
case 1: aa_time=3; bb_time=8; kuai=2; cc_time=1; man=9; zankongbi=7; break;
case 2: aa_time=3; bb_time=8; kuai=2; cc_time=1; man=9; zankongbi=7; break;
case 3: aa_time=4; bb_time=8; kuai=3; cc_time=2; man=9; zankongbi=7; break;
case 4: aa_time=5; bb_time=8; kuai=3; cc_time=3; man=9; zankongbi=7; break;
case 5: aa_time=6; bb_time=8; kuai=3; cc_time=5; man=9; zankongbi=7; break;
case 6: aa_time=7; bb_time=8; kuai=3; cc_time=6; man=9; zankongbi=7; break;
case 7: aa_time=8; bb_time=8; kuai=3; cc_time=7; man=9; zankongbi=7; break;
}//結束分支程序
jiehe();
}
if((DAOCHE)&&(ji_time>kuai))
{
tiaochu=1;
break;
}
}//while
}//che<4
else//che>=4
{
while(QIAN)
{
checha=Che/7;
if(checha>6) checha=6;
switch(checha)
{
case 0: aa_time=3; bb_time=8; kuai=2; cc_time=1; man=4; zankongbi=7; break;
case 1: aa_time=3; bb_time=8; kuai=2; cc_time=1; man=4; zankongbi=6; break;
case 2: aa_time=4; bb_time=8; kuai=2; cc_time=1; man=4; zankongbi=5; break;
case 3: aa_time=5; bb_time=8; kuai=3; cc_time=2; man=4; zankongbi=4; break;
case 4: aa_time=6; bb_time=6; kuai=3; cc_time=3; man=4; zankongbi=5; break;
case 5: aa_time=7; bb_time=6; kuai=3; cc_time=4; man=4; zankongbi=4; break;
case 6: aa_time=8; bb_time=4; kuai=3; cc_time=5; man=4; zankongbi=3; break;
}//結束分支程序
jiehe();
}//while
}//che>=4
TR0=0;
LIN1=0;
HIN1=0;
LIN2=0;
HIN2=0;
delay(201);
LIN1=0;
HIN1=1;
LIN2=0;
HIN2=1;
}//結束無前位信號程序
else
{//有前位信號
TR0=0;
delay(3);
LIN1=0;
HIN1=1;
LIN2=0;
HIN2=1;
LEDLI=0;
LEDHE=1;
jiajia=0;
qidong=0;
}
}
}
}//結束無按紐程序
}//主while
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -