?? khts52.c
字號:
/*------------------------------------------------------------------*-
防爆型礦井提升機綜合后備保護器控制程序
CPU型號:AT89S52
設 計:周志江 日 期: 07-10-10
修 改: 日 期:
-*------------------------------------------------------------------*/
#include "regx52.h"
bdata char KEYF;
sbit k1_f = KEYF^0;
sbit k1_pf = KEYF^1;
sbit k2_f = KEYF^2;
sbit k2_pf = KEYF^3;
sbit k3_f = KEYF^4;
sbit k3_pf = KEYF^5;
sbit k4_f = KEYF^6;
sbit k4_pf = KEYF^7;
bdata char S1;
sbit DKD = S1^0; /* 卡斗狀態(tài)指示 */
sbit DSS = S1^1; /* 松繩狀態(tài)指示 */
sbit DS = S1^2; /* 深失狀態(tài)指示 */
sbit DPC = S1^3; /* 爬超狀態(tài)指示 */
sbit DJC = S1^4; /* 減超狀態(tài)指示 */
sbit DDC = S1^5; /* 等超狀態(tài)指示 */
sbit DGJ = S1^6; /* 過卷狀態(tài)指示 */
sbit DTS = S1^7; /* 提升狀態(tài)指示 */
bdata char S2;
sbit DTR = S2^0; /* 提人狀態(tài)指示 */
sbit DCZ = S2^1; /* 誤操作狀態(tài)指示 */
sbit DMC = S2^2; /* 滿倉狀態(tài)指示 */
sbit DZX = S2^3; /* 閘隙狀態(tài)指示 */
sbit DQY = S2^4; /* 欠壓狀態(tài)指示 */
sbit DQX = S2^5; /* 缺相狀態(tài)指示 */
sbit DGZ = S2^6; /* 過載狀態(tài)指示 */
sbit DXF = S2^7; /* 下放狀態(tài)指示 */
bdata char JDQ;
sbit DJA = JDQ^0; /* 安全繼電器及狀態(tài)指示 */
sbit DJF = JDQ^1; /* 禁放繼電器及狀態(tài)指示 */
sbit DJT = JDQ^2; /* 禁提繼電器及狀態(tài)指示 */
sbit DJS = JDQ^3; /* 減速繼電器及狀態(tài)指示 */
sbit DJG = JDQ^4; /* 警告繼電器及狀態(tài)指示 */
sbit ITR = P0^0; /* 提人信號 */
sbit IK1 = P0^1; /* 按鍵Set 信號 */
sbit IK2 = P0^2; /* 按鍵++ 信號 */
sbit IK3 = P0^3; /* 按鍵-- 信號 */
sbit IK4 = P0^4; /* 按鍵Exit 信號 */
sbit IFX = P1^1; /* 方向信號 1:提升;0:下放*/
sbit IS1 = P1^2; /* 深指信號1 */
sbit IS2 = P1^3; /* 深指信號2 */
sbit IBB1 = P1^4; /* 同步信號1 */
sbit ITB2 = P1^5; /* 同步信號2 */
sbit ISS = P1^6; /* 松繩信號 */
sbit IZX = P1^7; /* 閘間隙信號 */
sbit I2C_SDA = P3^0; /* The two-wire I2C bus SDA */
sbit I2C_SCK = P3^1; /* The two-wire I2C bus CLK */
sbit I2C_SDT = P3^2; /* 實時時鐘數(shù)據(jù)線引腳 */
sbit I2C_WP = P3^3; /* 實時時鐘復位線引腳 */
sbit IMC = P3^4; /* 滿倉信號 */
sbit IGZ = P3^5; /* 過載信號 */
sbit IQX = P3^6; /* 缺相信號 */
sbit IQY = P3^7; /* 欠壓信號 */
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
unsigned char k1c,k2c,k3c,k4c;
char code dake07[6]={'d','a','k','e','0','7'};
idata char DisTab[] = {
//0----1----2----3----4----5----6----7----8----9
0x88,0xBE,0xC4,0x94,0xB2,0x91,0x81,0xBC,0x80,0x90,
//0.---1.---2.---3.---4.---5.---6.---7.---8.---9.
0x08,0x3E,0x44,0x14,0x32,0x11,0x01,0x3C,0x00,0x10,
//A----B----C----D----E----F----U---\- 滅
0xA0,0x83,0xC9,0x86,0xC1,0xE1,0x8A,0xf7,0xff
};
#define _Null (28)
#define _F (27)
#define _D (0x86)
#define _E (0xC1)
#define _FH (0x77)
unsigned char DT[6]={0x00,0x30,0x08,0x01,0x10,0x07};// 秒,分,時,日,月,年
unsigned char DisBuf[17],T2Buf[2];
unsigned char error;
unsigned char sys_osc,DT_UP;
unsigned int SetJS,SetXS,SetTB1,SetTB2;
unsigned int t2count,t2countp;
unsigned char SetSD1,SetSD2;
char SD;
//unsigned int recordaddr;
void Delay_10_uS(void){char i=10;while(i--);}
void Delay_N_mS( unsigned int n_milisecond) /* n mS delay */
{
unsigned char i;
while(n_milisecond--){
i=37;
while(i--);
}
}
void CleanDis(void)
{
unsigned char i;
for(i = 1 ; i < 18 ; i++){ P2 &= 0x07; P2 |= i<<3; P0 = 0xff; }
P2 &= 0x07;
}
void ErrorDis(unsigned char error)
{
unsigned char i;
P2 &= 0x07; P2 |= 1<<3; P0 = DisTab[error];
P2 &= 0x07; P2 |= 2<<3; P0 = DisTab[0];
P2 &= 0x07; P2 |= 3<<3; P0 = _E;
for(i = 4;i < 18;i++){ P2 &= 0x07; P2 |= i<<3; P0 = 0xff;}
P2 &= 0x07;
}
void KeyMenu(void);
void TimeSet(void);
void DisPlay(void);
bit I2C_Start(void);
void I2C_Stop(void);
void I2C_Nack(void);
bit I2C_Send_Byte( unsigned char);
unsigned char I2C_Receive_Byte(void);
void AT24C64_R(void *mcu_address,unsigned int AT24C64_address,unsigned int count);
void AT24C64_W(void *mcu_address,unsigned int AT24C64_address,unsigned int count);
unsigned char AT24C64_R_Byte(unsigned int AT24C64_address);
void AT24C64_W_Byte(unsigned int AT24C64_address,unsigned char Data);
void RTInputByte(unsigned char d); // 實時時鐘寫入一字節(jié)
unsigned char RTOutputByte(void); // 實時時鐘讀取一字節(jié)
void W1302(unsigned char ucAddr, unsigned char ucDa); // 往DS1302寫入數(shù)據(jù)
unsigned char R1302(unsigned char ucAddr); // 讀取DS1302某地址的數(shù)據(jù)
void Set1302(unsigned char *pClock);
void Get1302(unsigned char ucCurtime[]); // 讀取DS1302當前時間
main()
{
unsigned int i,j;
unsigned char tmr;
for(tmr=1;tmr<18;tmr++){ P2 &= 0x07; P2 |= tmr<<3; P0 = 0x00; }
P2 &= 0x07;
for(tmr=0;tmr<6;tmr++)DisBuf[tmr]=AT24C64_R_Byte(tmr);
Delay_N_mS(100);
for(tmr=0;tmr<6;tmr++)if(dake07[tmr]!= DisBuf[tmr])error = 1;
if(error==1){
CleanDis();
ErrorDis(error);
while(1);
}
Get1302(DT);// 讀入時間 ss mm hh DD MM YY
for(tmr=0;tmr<2;tmr++)if(DT[tmr] >= 0x60)error = 2;
if(DT[2]>0x23)error = 2;
if(DT[3]>0x31)error = 2;
if(DT[4]>0x12)error = 2;
if(DT[5]>0x99)error = 2;
if(error==2){
CleanDis();
ErrorDis(error);
while(1);
}
P2 &= 0x07;
P2 |= 18<<3;
if(IK1)Delay_N_mS(200);
if(IK1){
AT24C64_R(DisBuf,6,10); // 讀入?yún)?shù) 井深值、井深系數(shù)、提物速度、提人速度、上下同步值
KeyMenu();
}
P2 &= 0x07;
Delay_N_mS(200);
AT24C64_R(DisBuf,6,10); // 讀入?yún)?shù) 井深值、井深系數(shù)、提物速度、提人速度、上下同步值
// 計算每米脈沖數(shù)、保護包絡點值、上下同步點T2值
CleanDis();
/* 硬件定時器 計數(shù)器 中斷 參數(shù) 初始化 */
TimeSet();
while(1){ for(i=0;i<200;i++)for(j=0;j<2000;j++); }
}// Main End
void TimeSet(void)
{ //T0方式1
TMOD = 0x11;
TL0 = 0x00; TH0 = 0x4C;
TL1 = 0x00; TH1 = 0x4C;
T2MOD = 0x01;
T2CON = 0x4e;
P1 &= 0xFE;
PCON = 0x00;
ES = 1;
ET0 = 1;
ET1 = 1;
EA = 1;
TR0 = 1;
TR1 = 1;
TR2 = 1;
S1 = S2 = 0xff;
JDQ = 0;
}
void timer0 (void) interrupt 1 using 1
{
TL0=0x09;
TH0=0x4C;//50ms T0 at mode1 11.0592MHz
//----------程序定時調(diào)度代碼---------
sys_osc+=2;
if( sys_osc > 20) sys_osc = 1;
T2Buf[0] = TH2;
T2Buf[1]= TL2;
if(EXF2==0){
T2Buf[0] = ~T2Buf[0];
T2Buf[1] =256 -T2Buf[1];
if(T2Buf[1]==0)T2Buf[0] = T2Buf[0]+1;
}
if(sys_osc==10) DT_UP=1;
if(sys_osc == 20){
DT_UP=1;
DT[0]++;
if((DT[0]&0x0f) > 9){DT[0]&=0xf0;DT[0]+=0x10;}
if((DT[0]&0xf0) > 0x50){DT[0]&=0x0f;DT[1]++;}
if((DT[1]&0x0f) > 9){DT[1]&=0xf0;DT[1]+=0x10;}
if((DT[1]&0xf0) > 0x50){DT[1]&=0x0f;DT[2]++;}
if((DT[2]&0x0f) > 9){DT[2]&=0xf0;DT[2]+=0x10;}
if((DT[2]&0xf0) >= 0x20){if((DT[2]&0x0f) > 3)DT[2]&=0x00;}
}
}
void timer1 (void) interrupt 3 using 1
{
TL1=0x00;
TH1=0x3C;//50ms T0 at mode1 11.0592MHz
P2 &= 0x07;
P2 |= 18<<3;
k1_pf = k1_f;
k2_pf = k2_f;
k3_pf = k3_f;
k4_pf = k4_f;
if(ITR){ DTR = 0; }else{DTR = 1; }
if(IK1){ if(k1_f == 0)if(++k1c > 2){ k1_f = 1; k1c = 0;}}
else { if(k1_f != 0)if(++k1c > 2){ k1_f = 0; k1c = 0;}}
if(IK2){ if(k2_f == 0)if(++k2c > 2){ k2_f = 1; k2c = 0;}}
else { if(k2_f != 0)if(++k2c > 2){ k2_f = 0; k2c = 0;}}
if(IK3){ if(k3_f == 0)if(++k3c > 2){ k3_f = 1; k3c = 0;}}
else { if(k3_f != 0)if(++k3c > 2){ k3_f = 0; k3c = 0;}}
if(IK4){ if(k4_f == 0)if(++k4c > 2){ k4_f = 1; k4c = 0;}}
else { if(k4_f != 0)if(++k4c > 2){ k4_f = 0; k4c = 0;}}
P2 &=0x07;
/* 顯示 日期 工作或故障記錄 */
if(k1_f && ~k1_pf){// KEY1 down
Get1302(DT);
}
/* 故障記錄 查詢 《 */
if(k2_f && ~k2_pf){// KEY2 down
// recordaddr -=11;
// if(recordaddr<=20);
}
/* 故障記錄 查詢 》 */
if(k3_f && ~k3_pf){// KEY3 down
// recordaddr +=11;
// if(recordaddr > 0xfff0);
}
/* 退出查詢狀態(tài) 返回 運行狀態(tài) */
if(k4_f && ~k4_pf){// KEY4 down
}
//End if(KEYF!=0){...}
/****************************************************
速度 井深 計算
****************************************************/
if(DT_UP)
{
SetJS = T2Buf[0]*256 + T2Buf[1];
t2count = SetJS;
SD=t2count-t2countp;
if(SD < 0) SD = 0 - SD;
DisBuf[0] = SD%10;
SD = SD/10;
DisBuf[1] = SD%10;
SD = SD/10;
DisBuf[2] = SD%10;
if((SD==0)&&(DisBuf[2]==0))DisBuf[2] = _Null;
t2countp = t2count;
DisBuf[3] = SetJS%10;
SetJS = SetJS/10;
DisBuf[4] = SetJS%10;
SetJS = SetJS/10;
DisBuf[5] = SetJS%10;
if((DisBuf[5]==0)&&(SetJS==0))DisBuf[5]= _Null;
SetJS = SetJS/10;
DisBuf[6] = SetJS%10;
if((DisBuf[6]==0)&&(SetJS==0))DisBuf[6]= _Null;
SetJS = SetJS/10;
DisBuf[7] = SetJS%10;
if(EXF2==1){
if(DisBuf[7]==0)DisBuf[7]= _Null;
}else DisBuf[7] = _F;
DT_UP = 0;
}
/*****************DisPlay OUT************************/
if(IFX){ DXF = 0; DTS = 1; }else{ DTS = 0; DXF = 1; }
if(ISS){ DSS = 0; error=1; }else{DSS = 1; }
if(IMC){ DMC = 0; error=1; }else {DMC = 1; }
if(IZX){ DZX = 0; error=1; }else{DZX = 1; }
if(IQY){ DQY = 0; error=1; }else{DQY = 1; }
if(IQX){ DQX = 0; error=1; }else{DQX = 1; }
if(IGZ){ DGZ = 0; error=1; }else{DGZ = 1; }
if(k1_f==1)DisDT(1);else DisDT(0);
DisBuf[14] = P2&0x07;
DisBuf[15] = S1;
DisBuf[16] = S2;
DisPlay();
// 故障判斷輸出 記錄
if(error==1){
EA=0;
DJA = 1; /* 安全繼電器及狀態(tài)指示 */
DJG = 1;
P2 &= 0x07;
P2 |= 19<<3;
P0 = JDQ;
P2 &=0x07;
Get1302(DT);
/* 存儲故障記錄 */
P2 &= 0x07;
P2 |= 18<<3;
while(~IK4);
error=0;
S1=0xff;
S2=0xff;
JDQ = 0;
P2 &= 0x07;
P2 |= 19<<3;
P0 = JDQ;
P2 &=0x07;
EA=1;
}
} // End Time1
void DisPlay(void)
{
P2 &= 0x07; P2 |= 1<<3; P0 = DisTab[DisBuf[0]];
P2 &= 0x07; P2 |= 2<<3; P0 = DisTab[DisBuf[1]]&0x7f;
P2 &= 0x07; P2 |= 3<<3; P0 = DisTab[DisBuf[2]];
P2 &= 0x07; P2 |= 4<<3; P0 = DisTab[DisBuf[3]];
P2 &= 0x07; P2 |= 5<<3; P0 = DisTab[DisBuf[4]]&0x7f;
P2 &= 0x07; P2 |= 6<<3; P0 = DisTab[DisBuf[5]];
P2 &= 0x07; P2 |= 7<<3; P0 = DisTab[DisBuf[6]];
P2 &= 0x07; P2 |= 8<<3; P0 = DisTab[DisBuf[7]];
P2 &= 0x07; P2 |= 9<<3; P0 = DisTab[DisBuf[8]];
P2 &= 0x07; P2 |= 10<<3;P0 = DisTab[DisBuf[9]];
P2 &= 0x07; P2 |= 11<<3;P0 = DisTab[DisBuf[10]];
P2 &= 0x07; P2 |= 12<<3;P0 = DisTab[DisBuf[11]];
P2 &= 0x07; P2 |= 13<<3;P0 = DisTab[DisBuf[12]];
P2 &= 0x07; P2 |= 14<<3;P0 = DisTab[DisBuf[13]];
P2 &= 0x07; P2 |= 14<<3;P0 = DisTab[DisBuf[14]];
P2 &= 0x07; P2 |= 14<<3;P0 = DisTab[DisBuf[15]];
P2 &= 0x07; P2 |= 14<<3;P0 = DisTab[DisBuf[16]];
P2 &= 0x07;
}
/****************************************************************
模塊名稱:AT24C64.C
功 能:EEPROM讀寫模塊 EEPROM芯片型號:AT24C64
*********************************************************************/
bit I2C_Start(void)
{
Delay_10_uS();
I2C_SDA =1;
Delay_10_uS();
I2C_SCK =1;
Delay_10_uS();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -