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

📄 test108.c

📁 采用LPC935控制的一个项目
💻 C
字号:
#include <REG935.H>
#include"..\SOURCE\general.h"
#include <STRING.H>
//#include <stdio.h>
BYTE STATE;
DWORD DISTANCE,DISTANCENA,DISTANCEPA1,DISTANCEPA2;
BYTE PREDATA=100;
bit OVERFLOW=0;
/*********************************************************************************************************
* 函数名称: X9C104  
*
* 功能描述: 数字电位器X9C104控制程序。
*
* 入口参数: X9C104DATA 数字电位器的中心抽头的位置数值
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: delay
*
* 作    者: 刘贤曙
* 创建时间: 2006年1月10日
********************************************************************************************************/
void x9c104(BYTE X9C104DATA)
{
	 signed int i;
	 UD=0;
	 INC=0;
	 i=	X9C104DATA-PREDATA;
	 if (i>0)
	 {
	 	i=X9C104DATA-PREDATA;
		UD=1;
		do
		{
			INC=1;
			_nop_();
			INC=0;
			i--;
		}while (i>0);
	 }else if (i<0)
	 {
	 	i=PREDATA-X9C104DATA;
		UD=0;
		do
		{
			INC=1;
			_nop_();
			INC=0;
			i--;
		}while (i>0);	
	 }
	 PREDATA=X9C104DATA;

}
/*********************************************************************************************************
* 函数名称: pulse  
*
* 功能描述: 发送脉冲,并选择脉冲宽度
*
* 入口参数: ABC=0 范围参数
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: 无
*
* 作    者: 汪帆
* 创建时间: 2006年1月10日
********************************************************************************************************/
void pulse(BYTE ENSEL10)
{
	CLR=0;
	LOAD=0;			      //LOAD为脉冲下降沿有效
	switch (ENSEL10)	  //CLKDIV为选种3分频
	{
		case 1:   EN=0;SEL1=0;SEL0=0;ENNP=0;CLKDIV=0;break;		//1000米	
		case 2:   EN=1;SEL1=0;SEL0=0;ENNP=0;CLKDIV=0;break;	  	//2000米
		case 3:   EN=1;SEL1=0;SEL0=1;ENNP=0;CLKDIV=0;break;	  	//4000米
		case 4:   EN=1;SEL1=1;SEL0=0;ENNP=1;CLKDIV=0;break;	  	//8000米
		case 5:   EN=1;SEL1=1;SEL0=1;ENNP=1;CLKDIV=0;break;	  	//16000米
		default:	break;
	}
	DCLK=0;
	CLR=1;
}
/*********************************************************************************************************
* 函数名称: rdpulse  
*
* 功能描述: 读一次测试数据的值
*
* 入口参数: 
*
* 出口参数: DISTANCE 一次测试后的记数值	
*
* 全局变量: 无
*
* 调用模块: 无
*
* 作    者: 汪帆
* 创建时间: 2006年1月10日
********************************************************************************************************/
DWORD rdNAPA(void)
{
	BYTE i,l;
	for(l=0;l<255;l++)
	{
		_nop_();
		_nop_();
	}
	P2=P2|0x18;
	_nop_();
	P2=P2&0xe7;
	DISTANCE=0;
    	DCLK=0;	
		LOAD=0;	
		LOAD=1;	
		DCLK=1;
		LOAD=0;
		DCLK=0;
	for (i=0;i<10;i++)
	{
		DCLK=0;
		
		
		for(l=0;l<255;l++)
	{
		_nop_();
		_nop_();
	}


		if(SD==1)
		  DISTANCE|=1;
	   	if(i<9) 
		  DISTANCE<<=1;
		DCLK=1;

		for(l=0;l<255;l++)
	{
		_nop_();
		_nop_();
	}


	 }
	 DCLK=0;
	 //DISTANCE=1688;
	 return(DISTANCE);	
}			                
/*********************************************************************************************************
* 函数名称: gainDISTANCE  
*
* 功能描述: 自动测试程序
*
* 入口参数: 无
*
* 出口参数: DISTANCE 一次测试后的记数值	;RANGE 完成测试时的范围
*			当DISTANCE=0x0fff,RANGE=7时说明测试距离过长,超出测试范围。
*
* 全局变量: 无
*
* 调用模块: 无
*
* 作    者: 刘贤曙
* 创建时间: 2006年1月10日
********************************************************************************************************/
DWORD gainDISTANCE(void)
{ 
BYTE i,k=255;
do
	{
	 	//i=0;
		CCU_init(i*36);
		delay(3);
		DA(k);		 //数模转换,从AD03(P2.0)输出模拟电压,为PA,NA检测提供基准电压
		_nop_();
		_nop_();
		_nop_();

	do
		{	
			i=2;//++;
			if(i==6) 
			  break;	
			pulse(i);  
	        delay(5);			
			DISTANCE=rdNAPA();	
		}while(DISTANCE==0x03ff);
		k=k-5;
		//m=140/i;
		if (k<100) 
		   {
			OVERFLOW=1;
			break;
		   }
	}while(DISTANCE==0x03ff);
	if (i==2)
	DISTANCE=DISTANCE*2;
	else if (i==3)
	DISTANCE=DISTANCE*4; 
	else if (i==4)
	DISTANCE=DISTANCE*8;
	else if (i==5)
	DISTANCE=DISTANCE*16; 
    return(DISTANCE);
}
void autotest()
{	
	bit j;
	char xdata str1[50],*str2; 
		
	D1=0;
	D0=0;		    //选中PA1事件测的数据
	DISTANCEPA1=gainDISTANCE();		
	D1=0;
	D0=1;		    //选中PA2事件测的数据
	DISTANCEPA2=gainDISTANCE();
	D1=1;		    //选中NA事件测的数据
	DISTANCENA=gainDISTANCE();
	j=0;//PAS;
	if(j==0)
	{
		strcpy(str1,"断线距离。");
		if (DISTANCEPA2==0x03ff)
		    DISTANCE=DISTANCEPA1;
		else   
		    DISTANCE=DISTANCEPA2;	
	}
	else
	{
		strcpy(str1,"混线距离。");
	}
   	numtostr(str1,DISTANCE);
	if(OVERFLOW)
	  str2=strcat("测试距离太长","超范围。");
	else
	  str2=strcat(str1,"米");
	xf3011text(str2);
	delay(255);	
	delay(255);
	delay(255);	
	/*strcpy(str1,"混线距离。");
  	numtostr(str1,DISTANCENA);
	if(OVERFLOW)
	  str2=("测试距离太长超范围。");
	else
	str2=strcat(str1,"米");
	xf3011text(str2);
	delay(255);
	delay(255);	
	delay(255);*/
}  
void DA(BYTE da_val)
{
	DWORD xdata i;
	ADINS=0x08;				//开转换通道3
	ADMODA=0x02;			//设置转换模式
	ADMODB=0x44;			//设置ADC模块,0.5Mhz<ADC CLK<3.3Mhz,使能DAC0
	ADCON0=0x04;			//开启DAC0模块

	//ADCON0&=0x7F;			//清AD/DA转换完成标志位
	AD0DAT3=da_val;			//AD0DAT3的值为DAC0输出的控制量
	for(i=0;i<=1000;i++);
	ADCON0=0x05;			//启动DA转换,立即启动方式
}

⌨️ 快捷键说明

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