📄 test4div1.c
字号:
#include <REG935.H>
#include"..\SOURCE\general.h"
#include <STRING.H>
//#include <stdio.h>
BYTE STATE;
DWORD DISTANCE,DISTANCENA,DISTANCEPA1,DISTANCEPA2;
BYTE PREDATA=100,j=0;
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)
{
//START=0;
CLR=0;
delay(2);
LOAD=0; //LOAD为脉冲下降沿有效
switch (ENSEL10)
{
case 1: EN=0;SEL1=0;SEL0=0;ENNP=0;break; //200米
case 2: EN=0;SEL1=0;SEL0=1;ENNP=0;break; //1000米
case 3: EN=0;SEL1=1;SEL0=0;ENNP=0;break; //4000米
case 4: EN=0;SEL1=1;SEL0=1;ENNP=0;break; //8000米
case 5: EN=1;SEL1=0;SEL0=0;ENNP=1;break; //
case 6: EN=1;SEL1=0;SEL0=0;ENNP=1;break; //
case 7: EN=1;SEL1=1;SEL0=0;ENNP=1;break; //
case 8: EN=1;SEL1=1;SEL0=0;ENNP=1;break; //
default: break;
}
DCLK=0;
//START=1;
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;
for (i=0;i<10;i++)
{
DCLK=1;
if(SD==1)
DISTANCE|=1;
if(i<9)
DISTANCE<<=1;
DCLK=0;
}
DCLK=0;
//DISTANCE=1688;
return(DISTANCE);
}
/*********************************************************************************************************
* 函数名称: gainDISTANCE
*
* 功能描述: 自动测试程序
*
* 入口参数: 无
*
* 出口参数: DISTANCE 一次测试后的记数值 ;RANGE 完成测试时的范围
* 当DISTANCE=0x0fff,RANGE=7时说明测试距离过长,超出测试范围。
*
* 全局变量: 无
*
* 调用模块: 无
*
* 作 者: 汪帆
* 创建时间: 2006年1月10日
********************************************************************************************************/
DWORD gainDISTANCE(void)
{
BYTE k=255;
do
{
j=0;
CCU_init(j*36);
delay(5);
DA(k); //数模转换,从AD03(P2.0)输出模拟电压,为PA,NA检测提供基准电压
_nop_();
_nop_();
_nop_();
do
{
j++;
if(j==9)
break;
pulse(j);
DISTANCE=rdNAPA();
}while(DISTANCE==0x03ff);
k=k-2;
if (k>10)
OVERFLOW=0;
else
{
OVERFLOW=1;
break;
}
}while(DISTANCE==0x03ff);
if ((j==1)||(j==2))
{
DISTANCE=(DISTANCE)*2;
}
else if ((j==3)||(j==4))
{
DISTANCE=(DISTANCE)*4;
}
else if ((j==5)||(j==6))
{
DISTANCE=(DISTANCE)*8;
}
else if ((j==7)||(j==8))
DISTANCE=(DISTANCE)*16;
return(DISTANCE);
}
void autotest()
{
char xdata str1[50],*str2;
/*unsigned char i=0; //测试
while(1)
{
CCU_init(1*36);
delay(5);
DA(255); //数模转换,从AD03(P2.0)输出模拟电压,为PA,NA检测提供基准电压
_nop_();
_nop_();
_nop_();
i++;
i%=5;
pulse(2);
delay(20);
}*/
D1=0;
D0=0; //选中PA1事件测的数据
DISTANCEPA1=gainDISTANCE();
D1=0;
D0=1; //选中PA2事件测的数据
DISTANCEPA2=gainDISTANCE();
D1=1; //选中NA事件测的数据
DISTANCENA=gainDISTANCE();
/*PAS;
if(PAS==0)
{
strcpy(str1,"断线距离。");
if (DISTANCEPA2==0x03ff)
DISTANCE=DISTANCEPA1;
else
DISTANCE=DISTANCEPA2;
}
else
{
strcpy(str1,"混线距离。");
}
strcpy(str1,"断线距离第一次。");
numtostr(str1,DISTANCEPA1);
if(OVERFLOW)
str2=strcat("测试距离太长超范围。");
else
str2=strcat(str1,"米");
xf3011text(str2);
delay(255);
delay(255); */
if ((DISTANCEPA1)==0x03ff)
DISTANCE=DISTANCEPA2;
else
DISTANCE=DISTANCEPA1;
/*if ((j==1)||(j==2))
{
DISTANCE=(DISTANCE)*2;
DISTANCENA=(DISTANCENA)*2;
}
else if ((j==3)||(j==4))
{
DISTANCE=(DISTANCE)*4;
DISTANCENA=(DISTANCENA)*4;
}
else if ((j==5)||(j==6))
{
DISTANCE=(DISTANCE)*8;
DISTANCENA=(DISTANCENA)*8;
}
else if ((j==7)||(j==8))
{
DISTANCE=(DISTANCE)*16;
DISTANCENA=(DISTANCENA)*16;
}*/
DISTANCE=DISTANCE-8;
DISTANCENA=DISTANCENA-10;
//DISTANCE=(DISTANCE)*7;
//DISTANCE=(DISTANCE)/8; ;
//DISTANCE=(DISTANCE)*9;
//DISTANCE=(DISTANCE)/10;
if(DISTANCENA>DISTANCE)
{
strcpy(str1,"断线距离。");
numtostr(str1,DISTANCE);
if(OVERFLOW)
str2=strcat("测试距离太长超范围。");
else
str2=strcat(str1,"米");
xf3011text(str2);
delay(255);
delay(255);
}
else
{
strcpy(str1,"短路距离。");
numtostr(str1,DISTANCENA);
if(OVERFLOW)
str2=("测试距离太长超范围。");
else
str2=strcat(str1,"米");
xf3011text(str2);
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 + -