噪声测量仪 源代码

此项目是参加省电子竞赛,噪声测量仪项目组作品源代码。
比赛四天三晚,时间匆忙,代码有点乱,贴在这里,留念。
下位机是Contex-M0, LPC1114

/****************************************Copyright (c)****************************************************
噪声测量仪
2011年
*********************************************************************************************************/
#include "..\config.h"
#include "..\LCD.h"
//#include "..\AD7822.h"
//#include "..\UART.h"
#include "..\ARM_AD.h"
//#include "..\TLC2543.h"
#include "..\Key_and_LED.h"
#include <math.h>

/*********************************************************************************************************
  宏定义
*********************************************************************************************************/
#define k_ADtoDB	1				//AD电压与分贝DB转换的系数
#define N_AD_aver	1				//读取多少个AD值然后取平均

char    GcRcvBuf[16];                                                   /*  存放AD采集到的数据              */
//INT32U	MAX=0,MIN=0;

/*********************************************************************************************************
** Function name:       myDelay
** Descriptions:        软件延时
*********************************************************************************************************/

void myDelay (INT32U ulTime)
{
    INT32U i;
    
    i = 0;
    while (ulTime--)
	{
		for(i = 0; i < 5000; i++);
    }
}
/*********************************************************************************************************
** ADtoDB
** 将AD到的电压转换成分贝值
*********************************************************************************************************/
void System_Start()
{
	Write_to_LCD(1,"    噪声测量    ");
	str_empty(data2);
	str_empty(data4);
	Write_to_LCD(3,"  2011电子竞赛  ");
	//myDelay(1500);
	
	// myDelay(1500);
	// str_empty(data2);
	// str_empty(data3);
	// str_empty(data4);
	Write_to_LCD(1,"    噪声测量    ");
	Write_to_LCD(3,"噪声:        dB");
}

float ADtoDB()
{//ln()函数关系
	//int DB;
	//DB = 8.6525 *log(AD_value * k_ADtoDB + 0.01)+32.629;	// Hz适用
	//DB = A_VALUE *log(AD_value * k_ADtoDB + 0.01)+TAIL_VALUE;	// Hz适用
	//DB = 10 *log((MAX-MIN)+0.01)+14;	// Hz适用
	DB = A_VALUE_now *log((MAX-MIN)+0.01)+TAIL_VALUE_now;	// Hz适用
	return DB;
}

INT32U OP_size = 1;				//程控增益的放大倍数可选1,2,4,8; 初始选择1
void OP_control(int AD_pre)	//用上一次的AD值来确定下一次可控增益的倍数
{
	INT32U size;
	if(AD_pre > 1600)
	{
		size = 1;
	}
	else if(AD_pre > 800)
	{
		size = 2;
	}
	else if(AD_pre > 400)
	{
		size = 4;
	}
	else	//AD_pre < 400
	{
		size = 8;
	}
	OP_size = size;
}
/*********************************************************************************************************
** Function name:       main
** Descriptions:        AD采集数据例程,P0.11采集。
**                      注意:由于AD参考电压是3.3V,若直接采用P0.11采集电压,电压不得高于3.3V。
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
float sumAD = 0;	//
INT32U  ulADCData; 	//转换为3300范围的瞬时值
int main (void)
{
    char LCD_item[16]="";
	INT32U  TIME_TIP = 0;
	INT8U i_DB_temp=0;
	
    targetInit();                                                       /*  初始化目标板,切勿删除      */
    pinInit();                                                          /*  引脚初始化                  */
	SYSAHBCLKCTRL |= (1ul << 6);                                       /*  使能GPIO模块时钟            */	
	
	Ini_LCD_all();
	Warming_LED_Init();
	//TLC2543_Drive_INIT();
	
	System_Start();
    //uartInit();                                                         /*  串口初始化                  */
    ADCInit();                                                        /*  ADC模块初始化               */
	zyIsrSet(NVIC_ADC, (unsigned long)adc0Isr, PRIO_THREE);
	Key_init();
	//AD7822Int();//外部12位AD芯片初始化
    #if BURST
        AD0CR |= 1ul << 16;
    #else 
        AD0CR |= 1ul << 24;
    #endif
	ADCFlag = 0;
    while(1)
	{
		
		watch_key();
        if (ADCFlag == 1)//有AD数据
		{
			TIME_TIP++;
            ADCFlag = 0;                                                /*  清零标志                    */
            //i++;
			ulADCBuf = (ulADCBuf * 3300) / 1024; 
            ulADCData = ulADCBuf;
			//while(!((OP_size == 1) && (ulADCData>1600)) )//程控增益	//后续增加
			{//可控增益到最大
				//OP_control(ulADCData);
			}
			
			{
				//sumAD = sumAD +  (ulADCData  - 1400)* (ulADCData -1400);
				//if (i == N_AD_aver)
				{
					//i = 0;
					//sumAD = sqrt(sumAD / N_AD_aver);
					
					//sprintf(GcRcvBuf, "VIN0 = %4d mv    ", ulADCBuf);//内部AD
					
					//iSendStr(GcRcvBuf);                         			/*  将数据发送到串口显示        */
					//ulADCData = 0;
					
					
					if(TIME_TIP <50)
					{
						if(MIN > ulADCBuf)
						{
							MIN = ulADCBuf;
						}
						if(MAX < ulADCBuf)
						{
							MAX = ulADCBuf;
						}
						
						ADtoDB();
						Warming_LED_Shine();
						
						if((DB < LOW_LIMIT) || (DB > HIGH_LIMIT))
						{
							;
						}
						else
						{
							sprintf(GcRcvBuf, "噪声:%4.2f  dB", DB);
							//sprintf(GcRcvBuf, "噪声:%6d  mV", MAX);
							Write_to_LCD(3,GcRcvBuf);
							if(MAX_DB < DB) MAX_DB = DB;
							if(getmax == 1)
							{
								sprintf(LCD_item,"最大噪声%4.2fdB",MAX_DB);//显示振幅
								Write_to_LCD(4,LCD_item);
							}
							else if(show_amp == 1)
							{
								i_DB_temp = i_DB+1;
								if(i_DB_temp == 4) i_DB_temp=0;
								Amp_temp = (MAX-MIN);
								sprintf(LCD_item," %1d次振幅:%4dmV",(i_DB_temp),Amp_temp);//显示振幅
								Write_to_LCD(4,LCD_item);
								if(Btn_1_dwon)//按下Btn_1
								{
									Correct_DB(Amp_temp);
								}
							}
						}
					}
					
					if(TIME_TIP == 50)
					{
						MAX=0;MIN=3300;
						TIME_TIP = 0;
					}
					
					//LCD_Dly(5000);						// 1s延时
					//myDelay(10);
					//sumAD =0;
				}
				#if BURST == 0
					AD0CR |= 1ul << 24;
				#endif
			}
		}
	}  
}

/*********************************************************************************************************
										End Of File
*********************************************************************************************************/

#ifndef LCD_H

/*********************************************************************************************************
  宏定义
*********************************************************************************************************/
#define DATA		4					//P1.4号管脚
#define CLK			3					//P2.3号管脚
#define SID   		(1<<DATA)			//数据管脚,R/W   1.4
#define SCLK  		(1<<CLK)			//时钟管脚,E     2.3
#define SCKL_0		(GPIO2DATA &= ~(SCLK))		//SCLK = 0
#define SCKL_1		(GPIO2DATA |= SCLK)			//SCLK = 1
#define SID_0		(GPIO1DATA &= ~(SID))		//SID = 0
#define SID_1		(GPIO1DATA |= SID)			//SID = 1

/*********************************************************************************************************
  全局变量
*********************************************************************************************************/
unsigned char data1[]={"                "};
unsigned char data2[]={"                "};
unsigned char data3[]={"                "};
unsigned char data4[]={"                "};

const unsigned char data_empty[]={"                "};

/*********************************************************************************************************
** Function name:       myDelay
** Descriptions:        软件延时
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void LCD_Dly (INT32U ulTime)
{
 	unsigned int i,j;
 	for(i=ulTime;i>0;i--)
   		for(j=200;j>0;j--);
}

void str_copy(unsigned char *str_dest, const unsigned char *str_source)
{
	int i = 0;
	for(i=0; i<16; i++)
	{
		str_dest[i] = str_source[i];
	}
}
void str_empty(unsigned char *str)
{
	int i = 0;
	for(i=0; i<16; i++)
	{
		str[i] = ' ';
	}
}
/***********************************************************************************************
** 函数名称:LCD_SendByte()
** 函数功能:发送一个字节
** 入口参数:bbyte		字节数据
** 出口参数:无
***********************************************************************************************/
void LCD_SendByte(unsigned char bbyte) 
{
	 unsigned char i;
	 
	 for(i=0;i<8;i++)
	 {
		if( (bbyte&0x80)!=0 ) SID_1;
    	else 
    	{
    		SID_0 ;							//SID=bbyte&0x80;取出最高位
    	}
		SCKL_1;								//SCLK=1;
		LCD_Dly(1);//DELETE
	 	SCKL_0;								//SCLK=0;
	 	bbyte<<=1; 							//左移
	 }  
}
/***********************************************************************************************
** 函数名称:LCD_Write()
** 函数功能:LCD写指令或数据
** 入口参数:control_flow		数据控制流,0 为写指令 1 为写数据
			 ddata				数据
** 出口参数:无
***********************************************************************************************/
void LCD_Write(unsigned char control_flow, unsigned char ddata) 
{
	  unsigned char start_data,Hdata,Ldata;
	  if(0==control_flow) start_data=0xf8;		//写指令
	    else       start_data=0xfa;  			//写数据
	  
	  Hdata=ddata&0xf0;		 					//取高四位
	  Ldata=(ddata<<4)&0xf0;  					//取低四位
	  LCD_SendByte(start_data);	  			//发送起始信号
	  LCD_Dly(1); 							//延时是必须的
	  LCD_SendByte(Hdata);	      			//发送高四位
	  LCD_Dly(1);  							//延时是必须的
	  LCD_SendByte(Ldata);		  			//发送低四位
	  LCD_Dly(1);  							//延时是必须的
}

void GPIO_LCD_init(void)
{
	GPIO1DIR = GPIO1DIR | SID;
	GPIO2DIR = GPIO2DIR | SCLK;
}

/***********************************************************************************************
** 函数名称:Ini_all()
** 函数功能:初始化ARM管脚和LCD寄存器
** 入口参数:无
** 出口参数:无
***********************************************************************************************/
void Ini_LCD_all(void)
{    
	GPIO_LCD_init();
		
    LCD_Write(0,0x30);  					//8 位介面,基本指令集
	LCD_Write(0,0x0c);  					//显示打开,光标关,反白关
	LCD_Write(0,0x01);  					//清屏,将DDRAM的地址计数器归零  

    LCD_Write(0,0x01);             		//清屏
	LCD_Dly(10);                			//延时是为了等待处理完毕
}

/***********************************************************************************************
** 函数名称:Write_to_LCD()
** 函数功能:在LCD上写字
** 入口参数:LCD的第几行(1~4),char *data 显示的数字的字符串首地址(字符串长度为16个ASCII)
** 出口参数:无
***********************************************************************************************/
void Write_to_LCD(int Which_Line,char *data)
{
	int i = 0;

	switch (Which_Line)
	{
		case 1:
		{
			for(i=0; i<16; i++)
			{
				data1[i] = data[i];
			}
		}break;
		case 2:
		{
			for(i=0; i<16; i++)
			{
				data2[i] = data[i];
			}
		}break;
		case 3:
		{
			for(i=0; i<16; i++)
			{
				data3[i] = data[i];
			}
		}break;
		case 4:
		{
			for(i=0; i<16; i++)
			{
				data4[i] = data[i];
			}
		}break;
	}
	
	LCD_Write(0,0x80);            		//设置第一行显示地址000000
    LCD_Dly(10);
    for (i=0;i<16;i++)
        LCD_Write(1,data1[i]);
    LCD_Dly(10);


    LCD_Write(0,0x90);             		//设置第二行显示地址010000
    LCD_Dly(10);
    for (i=0;i<16;i++)
        LCD_Write(1,data2[i]);
    LCD_Dly(10);

    LCD_Write(0,0x88);              		//设置第三行显示地址001000
    LCD_Dly(10);
    for (i=0;i<16;i++)
        LCD_Write(1,data3[i]);
    LCD_Dly(10);

    LCD_Write(0,0x98);                	//设置第四行显示地址011000
    LCD_Dly(10);
    for (i=0;i<16;i++)
        LCD_Write(1,data4[i]);
    LCD_Dly(10);
}
#define LCD_H
#endif

//ARM_AD ,P0.11为AD输入引脚

#ifndef ARM_AD_H

#define BURST   0                                                       /*  AD BURST模式选择            */

INT32U  ADCFlag;
uint32 ulADCBuf=0;

void Slow_1000ms()
{
	//N_AD_aver = ;
}
void Fast_125ms()
{
	
}
/*********************************************************************************************************
** Function name:       ADCInit
** Descriptions:        ADC初始化
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void ADCInit (void)
{
    PDRUNCFG      &= ~(0x01 << 4);                                      /*  ADC模块上电                 */
    SYSAHBCLKCTRL |=  (0x01 << 13);                                     /*  使能ADC模块时钟             */
    
    IOCON_PIO0_11 &= ~0xBF;                                             /*  配置PIO0_11为模拟输入模式   */
    IOCON_PIO0_11 |=  0x02;                                             /*  PIO0_11模拟输入通道0        */
 
    AD0CR = ( 0x01 << 0 ) |                                             /*  SEL=1,选择ADC0              */
            (( FAHBCLK / 880000 - 1 ) << 8 ) |                         /*  转换时钟880kHz             */
            ( 0 << 16 ) |                                               /*  BURST=1,使用Burst模式       */
            ( 0 << 17 ) |                                               /*  使用11 clocks转换           */
            ( 0 << 24 ) |                                               /*  ADC转换停止                 */
            ( 0 << 27 );                                                /*  直接启动ADC转换,此位无效   */

    AD0INTEN = (1 << 0);                                                /*  通道0中断使能               */
}
/*********************************************************************************************************
* Function Name:        adc0Isr
* Description:          ADC通道0中断处理函数
* Input:                无
* Output:               无
* Return:               无
*********************************************************************************************************/
void adc0Isr(void)
{
    ulADCBuf = AD0DR0;                                                  /*  读取通道0的值               */
    ulADCBuf = (ulADCBuf >> 6) & 0x3ff;
    ADCFlag  = 1;                                                       /*  置标志位                    */
}

#define ARM_AD_H
#endif

#include <stdio.h>
#include <math.h>

#define NO_BTN_DOWN 	-1

#define Warming_LED		(1<<9)		//P0.9

#define Btn_0			(1<<2)		//P2.2
#define Btn_1			(1<<9)		//p2.9
#define Btn_2			(1<<6)		//p0.6
#define Btn_3 			(1<<5)		//p2.5

#define Btn_0_dwon	(0==(GPIO2DATA & Btn_0))
#define Btn_1_dwon	(0==(GPIO2DATA & Btn_1))
#define Btn_2_dwon	(0==(GPIO0DATA & Btn_2))
#define Btn_3_dwon	(0==(GPIO2DATA & Btn_3))

INT32U  HIGH_LIMIT=100,LOW_LIMIT=40;//超限报警的上下限
float A_VALUE_now= 10, TAIL_VALUE_now=14;	//log函数式的参数
float A_VALUE_L= 10, TAIL_VALUE_L=15;	//log函数式的参数
float A_VALUE_H= 10, TAIL_VALUE_H=13;	//log函数式的参数
float A_VALUE_A= 10, TAIL_VALUE_A=14;	//log函数式的参数
float DB;
INT32U	MAX=0,MIN=0;
INT8U   show_amp= 0;
int i_DB=-1;//第几个校准数据,0~5共6个
INT8U DB_input[4]={39,39,39,39};	//输入的校准DB值
INT32U Amp[4] = {0,0,0,0};			//AD的振幅,=MAX - MIN
INT32U Amp_temp = 0;
INT8U getmax = 0;
float MAX_DB=0;

void KeyDelay (INT32U ulTime)
{
    INT32U i;
    
    i = 0;
    while (ulTime--)
	{
		for(i = 0; i < 5000; i++);
    }
}

void Warming_LED_Init()
{
	GPIO0DIR = GPIO0DIR | Warming_LED;
}

void Warming_LED_Shine()//或者换成 蜂鸣器
{
	static int Warming_LED_tip = 0;		// tip
	static int aver_time=0;
	if(DB > HIGH_LIMIT)//超上限报警
	{
		aver_time = aver_time + 1;
		if (aver_time >10)//防止瞬时误报超限
		{
			Warming_LED_tip = 8;
			Write_to_LCD(3,"噪声:        dB");
			Write_to_LCD(4,"    分贝过高    ");
		}
	}
	else if(DB < LOW_LIMIT)//超下限报警
		{
		aver_time = aver_time + 1;
		if (aver_time >10)
		{
			Warming_LED_tip = 2;
			Write_to_LCD(3,"噪声:        dB");
			Write_to_LCD(4,"    分贝过低    ");
		}
	}
	else
	{
		aver_time = 0;
	}
	//------------------------------------------------------
	if(Warming_LED_tip > 0)
	{
		GPIO0DATA = GPIO0DATA | Warming_LED;//灯开
	}
	else if(Warming_LED_tip == 0)//亮灯x tip后停止
	{
		GPIO0DATA = GPIO0DATA & (~Warming_LED);//灯关
		Write_to_LCD(4,"                ");
	}
	//------------------------------------------------------
	if(Warming_LED_tip >= 0)
	{
		Warming_LED_tip--;
	}
}

//修改报警上下限
void KeyDown_deal_limit()
{
	char item[16]="";
	Write_to_LCD(1,"      设置      ");
	Write_to_LCD(2,"                ");
			
	sprintf(item,"报警上限: %3d  ",HIGH_LIMIT);
	Write_to_LCD(3,item);
			
	sprintf(item,"报警下限: %3d  ",LOW_LIMIT);
	Write_to_LCD(4,item);
	while(1)
	{
		if(0==(GPIO2DATA & Btn_0))//Btn_0按下
		{
			Write_to_LCD(1,"      设置      ");
			Write_to_LCD(2,"                ");
			
			HIGH_LIMIT = (HIGH_LIMIT+1)%101;
			sprintf(item,"报警上限: %3d  ",HIGH_LIMIT);
			Write_to_LCD(3,item);
			
			sprintf(item,"报警下限: %3d  ",LOW_LIMIT);
			Write_to_LCD(4,item);
		}
		if(0==(GPIO2DATA & Btn_1))//Btn_1按下
		{
			Write_to_LCD(1,"      设置      ");
			Write_to_LCD(2,"                ");
			
			sprintf(item,"报警上限: %3d  ",HIGH_LIMIT);
			Write_to_LCD(3,item);
			
			LOW_LIMIT=(LOW_LIMIT+1)%101;
			sprintf(item,"报警下限: %3d  ",LOW_LIMIT);
			Write_to_LCD(4,item);
		}
		if(0==(GPIO2DATA & Btn_3))//Btn_3按下
		{
			if(HIGH_LIMIT < LOW_LIMIT)
			{
				Write_to_LCD(1,"      错误      ");
				Write_to_LCD(2,"err:下限高于上限");
				Write_to_LCD(3,"请重新修改上下限");
				Write_to_LCD(4,"                ");
			}
			else
			{
				Write_to_LCD(1,"    噪声测量    ");
				Write_to_LCD(2,"                ");
				Write_to_LCD(3,"                ");
				Write_to_LCD(4,"                ");
				KeyDelay(100);
				break;//return();
			}
		}
	}
}

//高低分贝分段测试
void HighLow_test()
{
	INT8U HighLow_part=0;//0全段,1低段,2高段
	char LCD_item[16]="";
	
	Write_to_LCD(1,"    分段设置    ");
	Write_to_LCD(2,"                ");
	Write_to_LCD(3,"                ");
	Write_to_LCD(4,"                ");
	while(1)
	{
		if(0==(GPIO2DATA & Btn_3))//Btn_3按下,分段测试切换分段
		{
			KeyDelay(50);
			HighLow_part = (HighLow_part+1)%4;//段选择:0全段,1低段,2高段, 3原始
		}
		switch(HighLow_part)
		{
			case 0:
			{
				A_VALUE_now = A_VALUE_A;
				TAIL_VALUE_now = TAIL_VALUE_A;
				Write_to_LCD(2,"当前段:全分贝段");
				sprintf(LCD_item," log系数:%2.2f  ",A_VALUE_now);
				Write_to_LCD(3,LCD_item);
				sprintf(LCD_item,"尾加参数:%2.2f  ",TAIL_VALUE_now);
				Write_to_LCD(4,LCD_item);
				break;
			}
			case 1:
			{
				A_VALUE_L = A_VALUE_A;
				TAIL_VALUE_L = TAIL_VALUE_A-0.5;
				A_VALUE_now = A_VALUE_L;
				TAIL_VALUE_now = TAIL_VALUE_L;
				Write_to_LCD(2,"当前段:低分贝段");
				sprintf(LCD_item," log系数:%2.2f  ",A_VALUE_now);
				Write_to_LCD(3,LCD_item);
				sprintf(LCD_item,"尾加参数:%2.2f  ",TAIL_VALUE_now);
				Write_to_LCD(4,LCD_item);
				break;
			}
			case 2:
			{
				A_VALUE_H = A_VALUE_A;
				TAIL_VALUE_H = TAIL_VALUE_A - 1.5;
				A_VALUE_now = A_VALUE_H;
				TAIL_VALUE_now = TAIL_VALUE_H;
				Write_to_LCD(2,"当前段:高分贝段");
				sprintf(LCD_item," log系数:%2.2f  ",A_VALUE_now);
				Write_to_LCD(3,LCD_item);
				sprintf(LCD_item,"尾加参数:%2.2f  ",TAIL_VALUE_now);
				Write_to_LCD(4,LCD_item);
				break;
			}
			case 3 :
			{
				A_VALUE_now = 10;
				TAIL_VALUE_now = 14;
				Write_to_LCD(2,"当前段:  预设  ");
				sprintf(LCD_item," log系数:%2.2f  ",A_VALUE_now);
				Write_to_LCD(3,LCD_item);
				sprintf(LCD_item,"尾加参数:%2.2f  ",TAIL_VALUE_now);
				Write_to_LCD(4,LCD_item);
			}
			default:
			{
				//return;
			}
		}
		if(0==(GPIO0DATA & Btn_2))//Btn_2按下,退出
		{
			Write_to_LCD(1,"    噪声测量    ");
			Write_to_LCD(2,"                ");
			Write_to_LCD(3,"                ");
			Write_to_LCD(4,"                ");
			KeyDelay(100);
			break;
		}
	}
}
//校正分贝曲线
Correct_DB(INT32U Amp_temp)
{
	char  LCD_item[16]="";
	float A_VALUE_temp[3]={0,0,0};
	
	Write_to_LCD(1,"      校准      ");
	i_DB = (i_DB + 1) % 4;
	sprintf(LCD_item,"第 %1d个校准数据值",i_DB);
	Write_to_LCD(2,LCD_item);
	sprintf(LCD_item,"分贝校准:%3d dB",DB_input[i_DB]);
	Write_to_LCD(3,LCD_item);
	if(i_DB !=0 ) DB_input[i_DB] = DB_input[i_DB-1];
	sprintf(LCD_item,"振幅:%4d %4dmV",Amp[i_DB],Amp_temp);
	Write_to_LCD(4,LCD_item);
	
	
	while(1)
	{
		if(Btn_1_dwon)//输入标准分贝值
		{
			KeyDelay(200);
			
			DB_input[i_DB] = (DB_input[i_DB] + 1) % 101;
			if(DB_input[i_DB] < 40)
			{
				DB_input[i_DB] = 40;
			}
			sprintf(LCD_item,"分贝校准:%3d dB",DB_input[i_DB]);
			Write_to_LCD(3,LCD_item);
			
		}
		if(Btn_2_dwon)//当前幅值清0
		{
			Amp[i_DB] = Amp_temp;
			sprintf(LCD_item,"振幅:%4d %4dmV",Amp[i_DB],Amp_temp);
			Write_to_LCD(4,LCD_item);
		}
		if(Btn_3_dwon)//最终确定
		{
			A_VALUE_temp[0] = (DB_input[3] - DB_input[1]) / log(1.0*Amp[3]/Amp[1]*1.0);
			A_VALUE_temp[1] = (DB_input[2] - DB_input[0]) / log(1.0*Amp[2]/Amp[0]*1.0);
			
			A_VALUE_A    = (A_VALUE_temp[0]+A_VALUE_temp[1])/2;
			TAIL_VALUE_A = DB_input[2] - A_VALUE_A*log(Amp[2]);
			sprintf(LCD_item," log系数:%2.2f  ",A_VALUE_A);
			Write_to_LCD(3,LCD_item);
			sprintf(LCD_item,"尾加参数:%2.2f  ",TAIL_VALUE_A);
			Write_to_LCD(4,LCD_item);
			A_VALUE_now = A_VALUE_A;
			TAIL_VALUE_now = TAIL_VALUE_A;
		}
		if(Btn_0_dwon)//退出
		{
			Write_to_LCD(1,"    噪声测量    ");
			Write_to_LCD(2,"                ");
			Write_to_LCD(3,"                ");
			Write_to_LCD(4,"                ");
			KeyDelay(100);
			break;
		}
	}
}
//监控按键
void watch_key()
{
	if(0==(GPIO0DATA & Btn_2))//Btn_2按下
	{
		A_VALUE_now = 10;
		TAIL_VALUE_now = 14;
		HighLow_test();//分段测试
	}
	if(0==(GPIO2DATA & Btn_3))//Btn_3按下
	{
		KeyDelay(100);
		KeyDown_deal_limit();//进入上下限修改
	}
	if(0==(GPIO2DATA & Btn_0))//Btn_0按下
	{
		KeyDelay(100);
		show_amp= (show_amp+1)%2;// ==1显示振幅
		if(show_amp == 0)
		{
			Write_to_LCD(4,"                ");
		}
	}
	if(0==(GPIO2DATA & Btn_1))//Btn_1按下,  锁定最大值
	{
		KeyDelay(200);
		getmax= (getmax+1)%2;
		
		if(getmax == 0)
		{
			MAX_DB = 0;
			Write_to_LCD(4,"                ");
		}
		
	}
}

void Key_init()
{
	GPIO2DIR = GPIO2DIR & (~Btn_0);
	GPIO2DIR = GPIO2DIR & (~Btn_1);
	GPIO0DIR = GPIO0DIR & (~Btn_2);
	GPIO2DIR = GPIO2DIR & (~Btn_3);
	/* 
	btn[0].pFun_Button = Btn0_deal_fun;
	btn[1].pFun_Button = Btn1_deal_fun;
	btn[2].pFun_Button = Btn2_deal_fun;
	btn[3].pFun_Button = Btn3_deal_fun; */
}

#ifndef __AD7822_H
#define __AD7822_H


#define OE        	(1ul << 7)				//P2.7片选
#define OE_OFF()    GPIO2DATA |=  OE                              	/*  高,关                    */
#define OE_ON()    	GPIO2DATA &= ~OE                              	/*  低,开                    */
 


#define CLK        	(1ul << 8)				//P2.8时钟
#define CLKON()    	GPIO2DATA |=  CLK                              	/*  高                    */
#define CLKOFF()  	GPIO2DATA &= ~CLK                          		/*  低                    */

#define AD_bit		(1<<3)
#define newBit		((GPIO0DATA & AD_bit) >>3)	//P0.3读入AD的12位串行数据,newBit为最新独到的 1 bit数据
#define NUM_AD		128				//连续AD的次数,然后求平均值

INT32U AD_value[NUM_AD] = {0};		//存储AD结果
INT32U This_AD = 0;					//当前AD是NUM_AD的第几次AD


void GPIO_AD_INIT()
{
	GPIO2DIR |= OE;
	GPIO2DIR |= CLK;
	GPIO0DIR &= ~(AD_bit);
	
}
void AD7822Int(void)
{
	GPIO_AD_INIT();
	OE_OFF();		//片选关
	CLKOFF();		//时钟低
}

void Read_AD_value(void)
{
	int i=0;
	
	OE_ON();			//片选开
	for(i=0; i<3; i++)	//每次读取数据前的3个空时钟周期
	{
		CLKON();		//时钟高
		CLKOFF();	//时钟低
		
	}
	for(i=0; i<12; i++)		//读取12位串行结果
	{
		CLKON();	//时钟高
		CLKOFF();//时钟低,完成下降沿
		AD_value[This_AD] = (AD_value[This_AD] << 1);
		AD_value[This_AD] =  AD_value[This_AD] | newBit;	//读一位数据
		
	}
	AD_value[This_AD] = AD_value[This_AD] / 4096 *5000;
	OE_OFF();	//片选关
	
	This_AD = (This_AD + 1) % NUM_AD;
}

#endif


/*********************************************************************************************************
  宏定义和全局变量
*********************************************************************************************************/
//uint32 ad[200];

/*********************************************************************************
宏
*********************************************************************************/
#define DATAIN     (1ul << 2)				//3.2
#define DATAIN_INIT()  GPIO3DIR |= DATAIN    
#define DATAINOFF()   GPIO3DATA |= DATAIN 
#define DATAINON()    GPIO3DATA &= ~DATAIN


#define DATAOUT     (1ul << 5)				//1.5
#define DATAOUT_INIT()  GPIO1DIR  &= ~ DATAOUT
#define DATAOUTOFF()    GPIO1DATA |=  DATAOUT
#define DATAOUTON()     GPIO1DATA &= ~DATAOUT

#define OE        (1ul << 7)				//1.7
#define OE_INIT()  GPIO1DIR  |=  OE
#define OEOFF()    GPIO1DATA |=  OE
#define OEON()     GPIO1DATA &= ~OE
 


#define CLK_2543        (1ul << 6)				//2.6
#define CLK_2543_INIT()  GPIO2DIR  |=  CLK_2543
#define CLK_2543OFF()    GPIO2DATA |=  CLK_2543
#define CLK_2543ON()     GPIO2DATA &= ~CLK_2543


void myDelay2(int i)
{
	for(i=0; i<5000;i++);
	
}
/*********************************************************************************************************
** Function name:       timer0Init
** Descriptions:        16位定时器0初始化函数
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
INT32U read2543()
{
	uint32 ad1=0;
	INT32U i=0;
	OEON();//先低电平 
	CLK_2543ON();//先低电平 
	 for(i=0;i<12;i++)
	{
		if((GPIO2DATA & DATAOUT)) 
		ad1|=0x01; 
		DATAINON();
		CLK_2543OFF(); 
		myDelay2(1);
		CLK_2543ON(); 
		myDelay2(1);
		ad1<<=1;
	}
	OEOFF();
	ad1>>=1;
	return(ad1);
}
void TLC2543_Drive_INIT(void)
{
	SYSAHBCLKCTRL |= (1ul << 6);                                        /*  使能GPIO模块时钟            */
	DATAIN_INIT() ;
	DATAOUT_INIT();
	OE_INIT();
	OEOFF();
	CLK_2543_INIT();
}


  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值