📄 test108.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 + -