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

📄 khts52.c

📁 提升机综合后备保护装置 源程序 AT89S52单片机
💻 C
📖 第 1 页 / 共 3 页
字号:
/*------------------------------------------------------------------*-

     防爆型矿井提升机综合后备保护器控制程序 
     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;   /* 卡斗状态指示 */
sbit DSS     = S1^1;   /* 松绳状态指示 */
sbit DS      = S1^2;   /* 深失状态指示 */
sbit DPC     = S1^3;   /* 爬超状态指示 */
sbit DJC     = S1^4;   /* 减超状态指示 */
sbit DDC     = S1^5;   /* 等超状态指示 */
sbit DGJ     = S1^6;   /* 过卷状态指示 */
sbit DTS     = S1^7;   /* 提升状态指示 */ 
bdata char S2;
sbit DTR     = S2^0;   /* 提人状态指示 */
sbit DCZ     = S2^1;   /* 误操作状态指示 */
sbit DMC     = S2^2;   /* 满仓状态指示 */ 
sbit DZX     = S2^3;   /* 闸隙状态指示 */
sbit DQY     = S2^4;   /* 欠压状态指示 */
sbit DQX     = S2^5;   /* 缺相状态指示 */
sbit DGZ     = S2^6;   /* 过载状态指示 */
sbit DXF     = S2^7;   /* 下放状态指示 */

bdata char JDQ;
sbit DJA     = JDQ^0;   /* 安全继电器及状态指示 */
sbit DJF     = JDQ^1;   /* 禁放继电器及状态指示 */
sbit DJT     = JDQ^2;   /* 禁提继电器及状态指示 */ 
sbit DJS     = JDQ^3;   /* 减速继电器及状态指示 */
sbit DJG     = JDQ^4;   /* 警告继电器及状态指示 */


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;   /* 实时时钟数据线引脚 */
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);                    // 实时时钟写入一字节
unsigned char RTOutputByte(void);                     // 实时时钟读取一字节
void W1302(unsigned char ucAddr, unsigned char ucDa); // 往DS1302写入数据
unsigned char R1302(unsigned char ucAddr);            // 读取DS1302某地址的数据  
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); // 读入参数 井深值、井深系数、提物速度、提人速度、上下同步值

     
     KeyMenu();
  }
  P2 &= 0x07;
  Delay_N_mS(200);
  
  AT24C64_R(DisBuf,6,10); // 读入参数 井深值、井深系数、提物速度、提人速度、上下同步值
  // 计算每米脉冲数、保护包络点值、上下同步点T2值
  
 
  	
  CleanDis();
  
  /* 硬件定时器 计数器 中断 参数 初始化 */
  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 
  //----------程序定时调度代码---------
  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);
	}
	/* 退出查询状态 返回 运行状态 */
  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;   /* 安全继电器及状态指示 */
  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 + -