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

📄 11.c

📁 一个水闸水位控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<all.h>   /*GAE328.717 2500KN   开度 一路荷重-四位显示,传感器为meyle输入,MA输入*/
                  /*  按键声音提示  继电器输出      */
#define MAXDATA 9999	/*加减变量的最大数*/

#define VARNUMBER   7	/*预置变量个数*/
#define LEDBIT1     7

#define DBNUMBER 1      /*定标变量个数*/
#define MAX7219CHIPNUMBER  2	/*MAX7219芯片的个数*/
#define MAX7219BITNUMBER     4 	/*MAX7219显示的位数*/

#define adsetlowwA       80
#define adsethighwA     82
  
#define adsetlowwB       84
#define adsethighwB      86


//#define  A   0x00          /*tlv2544 A路输入*/
//#define  B   0x20          /*tlv2544 B路输入*/


#define BCDL12 0x3fff	
#define BCDH34 0x4fff
#define BCDL56 0x6fff	
#define BCDH78 0x7fff
#define CGL 0x1fff
#define CGH 0x2fff
#define IDE 0x0fff	/*功能选择及定标(或从机地址)的地址*/
#define JDQ 0xafff	/*继电器的地址*/
#define AVERAGENUMBER 1		/*荷重传感器输入软件滤波次数*/

sbit MAX7219_CLK =P3^5;
sbit MAX7219_DIN =P1^2;
sbit MAX7219_LOAD=P1^7;

sbit X25045_CS=P1^0;
sbit X25045_SCK=P1^1;
sbit X25045_SI=P1^2;      
sbit X25045_SO=P1^3;

sbit MAX490_RO=P3^4;
sbit MAX490_DI=P3^3;

sbit AD420_CLK=P2^2;		/*P33*/
sbit AD420_DIN=P1^2;		/*P34*/
sbit AD420_LATCH=P1^6;		/*P35*/	

sbit AD7705_CS=P1^5;
sbit AD7705_SCLK=P2^1;
sbit AD7705_DIN=P1^2;
sbit AD7705_DOUT=P1^3;


void delay(unsigned int delaytime );
void bin_bcdK(unsigned int temp);
void bin_bcdA(unsigned int temp);	/*二进制转换为四位BCD码*/
void warn();
void key_press();

union word_bytes{unsigned int word;struct{unsigned char b0;unsigned char b1;}bytes;};

void max7219_init();
void max7219_input_8_bit(unsigned char inputaddress,unsigned char inputdata);
void max7219_disp(unsigned char dispdata[],unsigned char n);

void ad7705_in();
void x25045_init();
void x25045_write_word(unsigned int address,unsigned int indata);
unsigned int x25045_read_word(unsigned int address);
int coder_jb5();	       /*变型码4095传感器译码*/
//bit saveorder;
bit press;

bdata unsigned char zw;	/*传感器取值位变量;高位*/
bdata unsigned char yw; /*传感器取值位变量;中位*/ 
bdata unsigned char xw; /*传感器取值位变量;低位*/ 
bdata unsigned char bzw;/*传感器取值位变量;高位*/ 
bdata unsigned char byw; /*传感器取值位变量;中位*/ 
bdata unsigned char bxw; /*传感器取值位变量;低位*/ 
sbit z0=zw^0;sbit z1=zw^1;sbit z2=zw^2;sbit z3=zw^3;/*传感器24位格雷码分别对应为*/      
sbit z4=zw^4;sbit z5=zw^5;sbit z6=zw^6;sbit z7=zw^7;/*低x0-x7-y0-y7-z0-z7高*/   

sbit y0=yw^0;sbit y1=yw^1;sbit y2=yw^2;sbit y3=yw^3;/*首先接收数据首位z7  */   
sbit y4=yw^4;sbit y5=yw^5;sbit y6=yw^6;sbit y7=yw^7;/*最后接收数据末位x0  */   

sbit x0=xw^0;sbit x1=xw^1;sbit x2=xw^2;sbit x3=xw^3;/*一个位置数据共24位  */   
sbit x4=xw^4;sbit x5=xw^5;sbit x6=xw^6;sbit x7=xw^7;/* 格雷码 */   


sbit bz0=bzw^0;sbit bz1=bzw^1;sbit bz2=bzw^2;sbit bz3=bzw^3;/*传感器24位二进制分别对应为*/      
sbit bz4=bzw^4;sbit bz5=bzw^5;sbit bz6=bzw^6;sbit bz7=bzw^7;/*低bx0-bx7-by0-by7-bz0-bz7高*/   

sbit by0=byw^0;sbit by1=byw^1;sbit by2=byw^2;sbit by3=byw^3;/*首先接收数据首位bz7  */   
sbit by4=byw^4;sbit by5=byw^5;sbit by6=byw^6;sbit by7=byw^7;/*最后接收数据末位bx0  */   

sbit bx0=bxw^0;sbit bx1=bxw^1;sbit bx2=bxw^2;sbit bx3=bxw^3;/*一个位置数据共24位  */   
sbit bx4=bxw^4;sbit bx5=bxw^5;sbit bx6=bxw^6;sbit bx7=bxw^7;/*4096*4096=16777216  */  


unsigned long  pfdatadone();

void ad420_out();
unsigned char adout[4];
int c;
unsigned char varidentify;

bdata unsigned char ledbyte1;	/*报警触点及指示灯*/
bdata  warnbyte;
sbit warn0=warnbyte^0;
sbit warn1=warnbyte^1;
sbit warn2=warnbyte^2;
sbit warn3=warnbyte^3;
sbit warn4=warnbyte^4;
sbit warn5=warnbyte^5;
sbit warn6=warnbyte^6;

sbit warn7=warnbyte^7;

sbit leda1=ledbyte1^0;
sbit ledb1=ledbyte1^1;
sbit ledc1=ledbyte1^2;
sbit ledd1=ledbyte1^3;
sbit lede1=ledbyte1^4;
sbit ledf1=ledbyte1^5;
sbit ledg1=ledbyte1^6;
sbit leddp1=ledbyte1^7;

unsigned int idata chiefdataA;	/*主数据*/
unsigned int idata chiefdata;		/*主数据*/
unsigned int idata chiefdataB;	/*主数据*/
unsigned int idata var[VARNUMBER]; 	/*预置变量*/
unsigned char dispdataAB[8];
unsigned char dispdataK[8];
unsigned int adbufferA[AVERAGENUMBER];  /*A路传感器值缓冲区*/
unsigned int adbufferB[AVERAGENUMBER];  /*B路传感器值缓冲区*/
unsigned int idata adsetlowA,adsethighA;
unsigned int idata adsetlowB,adsethighB;

/*主程序开始++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
main()					/*主程序*/
{
char  i,akey,cc;
long k;
float adfloat;
int old;
press=0;
x25045_init();				/*看门狗初始化*/

X25045_CS=0;delay(1);X25045_CS=1;			/*喂狗*/			
//X25045_CS=0;delay(1);X25045_CS=1;			/*喂狗*/			

for(i=0;i<VARNUMBER;i++) var[i]=x25045_read_word(i*2);		/*取EEPROM中的变量值*/

adsetlowA=x25045_read_word(adsetlowwA);
adsethighA=x25045_read_word(adsethighwA);
adsetlowB=x25045_read_word(adsetlowwB);
adsethighB=x25045_read_word(adsethighwB);

while(1)
{
X25045_CS=0;delay(1);X25045_CS=1;	    /*喂狗*/
max7219_init();			            /*MAX7219初始化*/
if((~IDE)&0x1){key_press();}		/*若选择键按下,调用按键处理程序*/ 

      if((~IDE)&0x8)
        {
        i=press;
        if (akey==0)
        {
        switch (i)
        {
        case 1: press=0;break;
        case 0: press=1;break;
        default: 
                break;      
        }
        }
        akey=1;
        }
       else akey=0;
  cc=~IDE ;    

AD7705_CS=0;
   for(i=1;i<=40;i++)
     {AD7705_SCLK=0;
      AD7705_DIN=1;
      AD7705_SCLK=1;
      }
  AD7705_CS=1;
  X25045_CS=0;delay(1);X25045_CS=1;	    /*喂狗*/
ad7705_in();
k=0;
for(i=0;i<AVERAGENUMBER;i++)
{k=adbufferA[i]+k;
}
k=k/AVERAGENUMBER;
if(k<=adsetlowA) k=0;
else k=(k-adsetlowA)*(var[6]-var[5])/(adsethighA-adsetlowA)+var[5];
chiefdataA=(int)(k);
X25045_CS=0;delay(1);X25045_CS=1;	    /*喂狗*/
for(i=0;i<AVERAGENUMBER;i++)
{k=adbufferB[i]+k;
}
k=k/AVERAGENUMBER;
if(k<=adsetlowB) k=0;
else k=(k-adsetlowB)*(var[6]-var[5])/(adsethighB-adsetlowB)+var[5];
chiefdataB=(int)(k);
X25045_CS=0;delay(1);X25045_CS=1;	    /*喂狗*/
old=coder_jb5();			/*调用接触式传感器输入程序*/

if(old>8000)  chiefdata=0;
 else if(old>5465.575)  chiefdata=(int)((old-5465.575)*0.860543+4440);
   else if(old>2671.57)  chiefdata=(int)((old-2671.57)*0.828427+2125);
   else    chiefdata=(int)(old*0.794664);

 
  
  
      
  bin_bcdK(chiefdata);
//  BCDL12=dispdataK[1]*16+dispdataK[0];
  delay(1);
//  BCDH34=dispdataK[3]*16+dispdataK[2];
  dispdataK[2]=dispdataK[2]|0x80;	
  bin_bcdA(chiefdataA);
//  BCDL56=dispdataAB[1]*16+dispdataAB[0];
  delay(1);
//  BCDH78=dispdataAB[3]*16+dispdataAB[2];
  dispdataAB[1]=dispdataAB[1]|0x80;	
  
   
  for(i=0;i<8;i++)
{	
MAX7219_LOAD=0;    
max7219_input_8_bit(i+1,dispdataAB[i]);
max7219_input_8_bit(i+1,dispdataK[i]); 
MAX7219_LOAD=1;
}
warn();				         /*调用报警子程序*/

if(chiefdata<=0x0) {adout[0]=0x00;adout[1]=0x00;}
else if(chiefdata>=6300) {adout[0]=0xFF;adout[1]=0xFF;}
else {adfloat=65535*(float)(chiefdata-0x0)/(float)(6300-0x0);
adout[0]=(char)adfloat;adout[1]=(char)(adfloat/256);}

if(chiefdataA<=0x0) {adout[2]=0x00;adout[3]=0x00;}
else if(chiefdataA>=2500) {adout[2]=0xFF;adout[3]=0xFF;}
else {adfloat=65535*(float)(chiefdataA-0x0)/(float)(2500-0x0);
adout[2]=(char)adfloat;adout[3]=(char)(adfloat/256);}


ad420_out();			/*调用4-20MA输出程序*/

}
}
/*主程序结束++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


void delay(unsigned int delaytime) 		/*延迟dealytime个毫秒*/
{unsigned char j;
  while(delaytime--) 
    {	
	for (j=0;j<125;j++)
	{;}
    }
}	


/*二进制转换为BCD码模块开始++++++++++++++++++++++++++++++++++++++++++*/

void bin_bcdK(unsigned int temp)	/*二进制转换为四位BCD码*/
{
dispdataK[3]=temp/1000;			/*高位*/
temp= temp - dispdataK[3]*1000;
dispdataK[2]=temp/100;
temp=temp-dispdataK[2]*100;
dispdataK[1]=temp/10;
dispdataK[0]=temp%10;			/*低位*/
}

void bin_bcdB(unsigned int temp)	/*二进制转换为四位BCD码*/
{
dispdataAB[7]=temp/1000;			/*高位*/
temp=temp-dispdataAB[7]*1000;
dispdataAB[6]=temp/100;
temp=temp-dispdataAB[6]*100;
dispdataAB[5]=temp/10;
dispdataAB[4]=temp%10;				/*低位*/
}

void bin_bcdA(unsigned int temp)	/*二进制转换为四位BCD码*/
{
dispdataAB[3]=temp/1000;			/*高位*/
temp=temp-dispdataAB[3]*1000;
dispdataAB[2]=temp/100;
temp=temp-dispdataAB[2]*100;
dispdataAB[1]=temp/10;
dispdataAB[0]=temp%10;				/*低位*/
}
/*二进制转换为BCD码模块结束++++++++++++++++++++++++++++++++++++++++++*/
void dingshi(void)interrupt 1 using 1
{
c++;
if(c<6000)
  {
   TH0=-(10000/256);
   TL0=-(10000%256);
  }
else
  {
    varidentify=0;c=0;TR0=0;ET0=0;
    ledbyte1=0;ledb1=1;
	MAX7219_LOAD=0;
    max7219_input_8_bit(LEDBIT1,ledbyte1);	/*0x5为指示灯位于MAX7219中的位置*/
	MAX7219_LOAD=1;
  }

}
/*按键处理模块开始++++++++++++++++++++++++++++++++++++++++++++++++++*/
void key_press()			/*按键处理子程序*/
{
char i;
char keyindata; 			/*按键*/
//uchar varidentify=0;			/*变量标识*/
int temp;				/*变量增减中间计数器*/
char selelongpress=0;			/*选择键是否持续按下 0--N  1--Y*/
char times=0;				/*用于按键加速的记数变量*/
TCON=0x00;
TMOD=0x01;                
TR0=1;	
ET0=1;
TH0=-(10000/256);
TL0=-(10000%256);
EA=1;     //EA 为CPU 的中断开放标志位,EA=1,CPU 开放中断,EA=0,CPU 屏蔽所有中断
ES0=0;     //ES 为串行口中断允许位,ES=1,允许串行口中断,ES=0,禁止串行口中断
varidentify=0;			/*变量标识*/
c=0;
  while(1)				/*用GOTO跳出*/
  { X25045_CS=0;delay(1);X25045_CS=1;	
   keyindata=~IDE;			/*取按键*/
       switch(selelongpress)
    {
    case 1:
        if (!(keyindata&0x01)) selelongpress=0; 
        break;
    case 0:
    	if(keyindata&0x01) 
  		{
  		 delay(1);delay(1);delay(98);delay(1);/*消抖*/
         X25045_CS=0;delay(1);X25045_CS=1;	
        
  		//keyindata=~IDE;
  		ledbyte1=0;		/*清所有指示灯*/
  		selelongpress=1;	/*持续按下标志置位*/
  		if(!(keyindata&0x01)) break;
		if(varidentify<VARNUMBER) varidentify++;   /*变量标识+1*/
		else goto endless;
		temp=var[varidentify-1];/*中间计数器赋值*/ 		
		
		switch (varidentify)	/*置相应的指示灯*/
		{
		case 1:
			ledb1=1;
			warn7=1;
			JDQ=warnbyte;
			delay(8);
			warn7=0;
			JDQ=warnbyte;
			break;
                       
		case 2:
			ledc1=1;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;break;
			
  		case 3:
			ledd1=1;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;break; 
			   
	        case 4:
			lede1=1;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;break; 
			                 
	        case 5:
			ledf1=1;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;break;
                       
		case 6:
			ledg1=1;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;break;
			
  		case 7:
			leddp1=1;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;break; 
			
		  
		default:leda1=1;break;               /*运行灯*/
  		} 
  		times=0;		/*按键加速计数器清零*/
  		TH0=-(10000/256);
                TL0=-(10000%256);
  		}
    	  else if(keyindata&0x2)	/*加键*/
           {
                 if(times<15) {times++;temp++;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;delay(100);}
                 else if(times<150) {times++;temp=temp+5;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;delay(15);}
                 else {times=151;temp=temp+10;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;}
                 if(temp>MAXDATA){temp=0;}	
                 TH0=-(10000/256);
                 TL0=-(10000%256);
           }
  else if(keyindata&0x4)/*减键*/
           {
                if(times<15) {times++;temp--;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;delay(100);}
                else if(times<150) {times++;temp=temp-5;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;delay(15);}
                else {times=151;temp=temp-10;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;}
                if(temp>MAXDATA){temp=MAXDATA;}
                TH0=-(10000/256);
                TL0=-(10000%256);
                
             }

   else if(keyindata&0x8) 		/*确认*/
    	{
             var[varidentify-1]=temp;	/*中间计数器的值赋给相应的变量*/
             x25045_write_word((varidentify-1)*2,temp);	/*存入EEPROM中*/
             
            if(varidentify==6)
    			{ad7705_in();
    			x25045_write_word(adsetlowwA,adbufferA[AVERAGENUMBER-1]);
    			adsetlowA=adbufferA[AVERAGENUMBER-1];
    			x25045_write_word(adsetlowwB,adbufferB[AVERAGENUMBER-1]);
    			adsetlowB=adbufferB[AVERAGENUMBER-1];
    			}
    		    if(varidentify==7)
    			{ad7705_in();
    			x25045_write_word(adsethighwA,adbufferA[AVERAGENUMBER-1]);
    			adsethighA=adbufferA[AVERAGENUMBER-1];
    			x25045_write_word(adsethighwB,adbufferB[AVERAGENUMBER-1]);
    			adsethighB=adbufferB[AVERAGENUMBER-1];
    			}
    		    warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;delay(200);		/*按键加速计数器清零*/
    		TH0=-(10000/256);
                TL0=-(10000%256);
    		
    		}
	else times=0;			/*按键加速计数器清零*/
    default:
    	break;
    }
    
    if(varidentify==0) goto endless;
   
   else 
    {MAX7219_LOAD=0;    
     max7219_input_8_bit(0x0c,0x00);     
     max7219_input_8_bit(0x0c,0x01);/*00--关断 01--正常*/	
     MAX7219_LOAD=1;

   for(i=0;i<MAX7219BITNUMBER;i++)
	{MAX7219_LOAD=0;	
	   bin_bcdK(temp);
	  if(varidentify<4)

⌨️ 快捷键说明

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