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

📄 main.c

📁 单片机at89s52,模数ad7705采集压力,数码管显示驱动ch452,用于测试油箱盖气密性等
💻 C
字号:
#include <INTRINS.H>    

//#include <at89x52.h>
#include <string.h>
#include <stdlib.h>
#include <absacc.h>
#include <stdio.h>

#include "ch452cmd.h"      
#include "pin.h" 

#define uchar unsigned char
#define uint  unsigned int

#define KBD_PORT=P0;
#define FSM_INIT 0x00;
#define FSM_WAIT_PRESS 0x01;
#define FSM_VERFY1 0x02;
#define FSM_VERFY2 0x03;
#define FSM_WAIT_RELEASE 0x04;

#define FILTER_A 10
#define FILTER_N 11	
unsigned int last_value;
unsigned char scankey=0;
bit Timerout=0;
bit keypress;

#define RELOAD_HIGH 0x3C
#define RELOAD_LOW 0xD2
#define DB_VAL 2
sbit PBTN=P0^0; 
sbit NBTN=P0^1;
sbit RSTBTN=P0^2; 
sbit vHigh=P2^0;
sbit vLow=P2^1;
sbit vDir=P2^2;
sbit lRun=P2^3;
sbit lOk=P2^4;
sbit lErr=P2^5;
sbit buzzer=P1^6;
unsigned int keepcnt=0xff;
unsigned int itimeover=0xffff;
bit keepok=0;
bit btimeover=0;

bit almpulse;

unsigned char alarm;

bit pmode=0; 
bit nmode=0;
bit rstmode=0;
bit disp_updata=0; 
unsigned char istep=0;

//0Pa=1.241mv
#define PP3_63k 34944
#define PP3_04k 34708
#define PP10_00k 40239
#define PP20_00k 46085
#define PP21_00k 46531
#define NP49 32270
#define NP588 31929

sbit ADC_DIN=P3^0;     
sbit ADC_CLK=P3^1; 
sbit ADC_DRDY=P3^2;

unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,
	0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};
unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,
	25,28,31,34,38,41,44,48,
	50,53,56,59,63,66,69,72,
	75,78,81,84,88,91,94,97};
unsigned char displaybuf[8]={16,16,16,16,16,16,16,16};

float voltage;
unsigned int data_out;

void system_tick(void) interrupt 1
{
	static unsigned char second_cnt=20;
	TR0=0;
	TH0=RELOAD_HIGH; 
	TL0=RELOAD_LOW;
	TR0=1; 

	Timerout=1;
	scankey=KBD_PORT;
	if(!PBTN || !NBTN)
	{
		keypress=1;
	}
	else
	{
		keypress=0;
	}

	if((istep==1)||(istep==2)||(istep==3)||(istep==4)||(istep==5)||(istep==7)||(istep==8)) 
	{
		if(!keepok&&keepcnt) keepcnt--;
		if(!keepcnt)
		{
			keepok=1;
		}
		if(keepok)
	 	{
			itimeover--;
			if(!itimeover) btimeover=1;
		}
	}

	if(alarm) alarm--;

	second_cnt--;
	if(!second_cnt)
	{
		second_cnt=20;
		disp_updata=1;
	}
	if(disp_updata&&(istep==10)) 
		almpulse=!almpulse;
	else
		almpulse=0;

}

void delay1(uint ms)
{
	uint i,j;
	for(i=0;i<ms;i++)
	for(j=0;j<1000;j++);
}

void delay2(uint us)
{
	uint i;
	for(i=0;i<us;i++)
		_nop_();
}

unsigned char rearrange(unsigned char a)
{   
unsigned char i,b;   
b=a&0x01;   
for(i=1; i<8; i++)   
{   
b=b<<1;   
a=a>>1;   
b=b+(a&0x01);   
}   
return(b);   
}   
   
void WriteToReg_ADC(unsigned char a)  
{   
SCON=0;   
TI=0;   
SBUF=a;   
while(!TI);   
}   
   
void MX7705_Init()    
{   
unsigned char i;    
   
ADC_CLK=1;
ADC_DIN=1;
for(i=0;i<100;i++)   
{   
ADC_CLK=0;   
ADC_CLK=1;   
}    
WriteToReg_ADC(0x04); //0x20    
WriteToReg_ADC(0x30); //0x0c    
WriteToReg_ADC(0x08); //0x10  
WriteToReg_ADC(0x42); //0x42  
   
}   
   
unsigned int ReadWord()   
{   
unsigned char high8,low8;   
unsigned int out;   
   
SCON=0;   
   
REN=1;    
RI=0;   
while(!RI);   
high8=SBUF;   
   
ADC_CLK=1;   
   
RI=0;   
while(!RI);   
low8=SBUF;   
REN=0;    
out=rearrange(high8);   
out=out<<8;   
out=out+rearrange(low8);   
return(out);   
   
}   

uint get_ad()
{
	uint value;
	while(ADC_DRDY==0)
	{
		WriteToReg_ADC(0x1C);    
		value=ReadWord();  
	}
    return value;
}

uint filter2()
{
	uint value_buf[FILTER_N];
	uint temp;
	char count,i,j;
	for(count=0;count<FILTER_N;count++)
	{
		value_buf[count]=get_ad();
		delay2(10);
	}

	for(j=0;j<FILTER_N-1;j++)
	{
		for(i=1;i<FILTER_N-j;i++)
		{
			if(value_buf[i]>value_buf[i-1])
			{
				temp=value_buf[i-1];
				value_buf[i-1]=value_buf[i];
				value_buf[i]=temp;
			}
		}
	}

	return value_buf[(FILTER_N-1)/2];
}
void dispdata(bit dispflag)
{
	uint temp;
	if(dispflag)
	{
	voltage=2.5*(data_out/65536.0);     

	temp=(uint)(voltage*1000);
	displaybuf[0]=(uchar)voltage;
	displaybuf[1]=(temp%1000)/100; 
	displaybuf[2]=((temp%1000)%100)/10;
	displaybuf[3]=((temp%1000)%100)%10;

	CH452_Write(CH452_DIG0 | displaycode[displaybuf[0]]|0x80);
	CH452_Write(CH452_DIG1 | displaycode[displaybuf[1]]);
	CH452_Write(CH452_DIG2 | displaycode[displaybuf[2]]);
	CH452_Write(CH452_DIG3 | displaycode[displaybuf[3]]);		
	}
	else
	{
    CH452_Write(CH452_DIG0 | displaycode[17]);  
    CH452_Write(CH452_DIG1 | displaycode[17]);   
    CH452_Write(CH452_DIG2 | displaycode[17]);   
    CH452_Write(CH452_DIG3 | displaycode[17]); 
	}
}
void main()
{
	unsigned char fsm_key=0;
	unsigned char kbd_col;
	unsigned char kbd_row;
	unsigned char key_val;
	
	TMOD=0x11;
	TCON=0x15;
	IE=0x82;

	P0=0xff;
	P1=0x00;
	P2=0x00;

	CH452_Write(CH452_RESET);
    delay1(30);  
    CH452_Write(CH452_SYSON2);  
    CH452_Write(CH452_DIG0 | displaycode[17]);  
    CH452_Write(CH452_DIG1 | displaycode[17]);   
    CH452_Write(CH452_DIG2 | displaycode[17]);   
    CH452_Write(CH452_DIG3 | displaycode[17]);   
    delay1(100); 

   	MX7705_Init();   
	while(1)
	{
		if(Timerout)
		{
			Timerout=0;
			switch(fsm_key)
			{
			case 0:
				fsm_key=FSM_WAIT_PRESS;
				break;
			case 1:
				if(keypress)
				{
					key_val=0;
					kbd_col=0;
					if(!PBTN)
					{
						PBTN=1;
						kbd_col=1;
						fsm_key=FSM_VERFY1;
					} else if(!NBTN)
					{
						NBTN=1;
						kbd_col=2;
						fsm_key=FSM_VERFY1;
					} else if(!RSTBTN)
					{
						RSTBTN=1;
						kbd_col=3;
						fsm_key=FSM_VERFY1;
					}
					else
					{
						fsm_key=FSM_INIT;
					}
				}
				break;
			case 2:
				if(!PBTN)
				{
					fsm_key=FSM_VERFY2;
				}
				else if(!NBTN)
				{
					fsm_key=FSM_VERFY2;
				}
				else if(!RSTBTN)
				{
					fsm_key=FSM_VERFY2;
				}
				else
				{
					fsm_key=FSM_INIT;
				}
				break;					
			case 3:
				if(!PBTN)
				{
					key_val=kbd_col;
					if(!alarm&&!pmode&&!nmode)
					{
						pmode=1;
						istep=0;
					}
				}
				else if(!NBTN)
				{
					key_val=kbd_col;
					if(!alarm&&!nmode&&!pmode)
				 	{
						nmode=1;
						istep=0;
					}
				}
				else if(!RSTBTN)
				{
					key_val=kbd_col;
					if(!rstmode) rstmode=1;
				}
				fsm_key=FSM_WAIT_RELEASE;
				break;
			case 4:
				if(!keypress)
				{
					fsm_key=FSM_INIT;
				}
				break;
			default:
				fsm_key=FSM_INIT;
				break;
			}
		}
		
		data_out=filter2(); 
		if(!RSTBTN)   
		{   
    		if(disp_updata)
		    {
				disp_updata=0;	
				dispdata(1);
			}
		}
		
		if(istep==0)
		{
			keepcnt=20;
			itimeover=600;
			keepok=0;
			btimeover=0;
			if(pmode)
			{
				istep=1;
			}
			
			if(nmode)
			{
				istep=7;
			}

		}
	 	else if(istep==1)
		{

			vHigh=0;
			vLow=1;
			vDir=0;
			lOk=0;
			lErr=0;
			buzzer=0;
			if(keepok)
			{
				if(data_out>PP3_63k)
				{
					keepcnt=600;
					keepok=0;
					itimeover=600;
					btimeover=0;
					istep=2;
				}
				if(btimeover)
				{
					itimeover=600;
					btimeover=0;
					istep=10;
				}
			}
		}
		else if(istep==2)
		{
			vHigh=0;
			vLow=0;
			vDir=0;
			lOk=0;
			lErr=0;
			buzzer=0;
			if(keepok)
			{
				if(data_out>PP3_04k)
				{
					keepcnt=20;
					keepok=0;
					itimeover=600;
					btimeover=0;
					istep=3;
				}
				else
				{
					if((data_out<PP3_04k)||(data_out>PP3_63k))
					{
						istep=10;
					}
				}
				if(btimeover)
				{
					btimeover=0;
					itimeover=600;
					istep=10;
				}
			}
		}
		else if(istep==3)
		{
			vHigh=0;
			vLow=1;
			vDir=0;
			lOk=0;
			lErr=0;
			buzzer=0;
			if(keepok)
			{
				if(data_out>PP10_00k)
				{
					keepcnt=20;
					keepok=0;
					itimeover=600;
					btimeover=0;
					istep=4;
				}
				if(btimeover)
				{
					itimeover=600;
					btimeover=0;
					istep=10;
				}
			}
		}
		else if(istep==4)
		{
			vHigh=0;
			vLow=1;
			vDir=0;
			lOk=0;
			lErr=0;
			buzzer=0;
			if(keepok)
			{
				if(data_out>PP20_00k)
				{
					keepcnt=600;
					keepok=0;
					itimeover=600;
					btimeover=0;
					istep=5;
				}
				if(btimeover)
				{
					btimeover=0;
					itimeover=600;
					istep=10;
				}
			}
		}
		else if(istep==5)
		{
			vHigh=1;
			vLow=0;
			vDir=0;
			lOk=0;
			lErr=0;
			buzzer=0;
			if(keepok)
			{
				if((data_out>PP10_00k)&&(data_out<PP21_00k))
				{
					keepcnt=600;
					keepok=0;
					itimeover=600;
					btimeover=0;
					istep=6;
				}
				else
				{
					if((data_out>PP21_00k)||(data_out<PP10_00k))
					{
						istep=10;
					}
				}
				if(btimeover)
				{
					itimeover=600;
					btimeover=0;
					istep=10;
				}
			}
			else
			{
				if((data_out>PP21_00k)||(data_out<PP10_00k))
				{
					istep=10;
				}
			}
		}
		else if(istep==6)
		{
			keepcnt=600;
			keepok=0;
			itimeover=600;
			btimeover=0;
			vHigh=0;
			vLow=0;
			vDir=0;
			lOk=1;
			lErr=0;
			buzzer=1;
			delay1(50);
			buzzer=0;
			pmode=0;
			istep=0;
		}
		else if(istep==7)
		{
			vHigh=0;
			vLow=1;
			vDir=1;
			lOk=0;
			lErr=0;
			buzzer=0;
			if(keepok)
			{
				if(data_out<NP49)
				{
					keepcnt=600;
					keepok=0;
					itimeover=600;
					btimeover=0;
					istep=8;
				}
				if(btimeover)
				{
					itimeover=600;
					btimeover=0;
					istep=10;
				}
			}
		}
		else if(istep==8)
		{
			vHigh=0;
			vLow=1;
			vDir=1;
			lOk=0;
			lErr=0;
			buzzer=0;
			if(keepok)
			{
				if((data_out<NP49)&&(data_out>NP588))
				{
					keepcnt=600;
					keepok=0;
					itimeover=600;
					btimeover=0;
					istep=9;
				}
				else
				{
					if((data_out>NP49)||(data_out<NP588))
					{
						istep=10;
					}
				}
				if(btimeover)
				{
					btimeover=0;
					itimeover=600;
					istep=10;
				}
			}
			else
			{
				if((data_out>NP49)||(data_out<NP588))
				{
					istep=10;
				}
			}
		}
		else if(istep==9)
		{
			keepcnt=600;
			keepok=0;
			itimeover=600;
			btimeover=0;
			vHigh=0;
			vLow=0;
			vDir=0;
			lOk=1;
			lErr=0;
			buzzer=1;
			delay1(50);
			buzzer=0;
			nmode=0;
			istep=0;
		}
		else if(istep==10)
		{
			keepcnt=600;
			keepok=0;
			itimeover=600;
			btimeover=0;
			vHigh=0;
			vLow=0;
			vDir=0;
			lOk=0;
			lErr=1;
			buzzer=almpulse;
			if(!NBTN||!PBTN)
			{
				alarm=20;
				buzzer=0;
				lErr=0;
				istep=0;
				pmode=0;
				nmode=0;
			}
		}
		else
		{
			istep=0;
		}

		lRun=pmode||nmode;
	}
}


⌨️ 快捷键说明

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