📄 max134.c
字号:
/*the main programe structure*/
/*****************************************
*硬件连接定义:
*MCU >>>>MAX134
*P1.0>>>>A0
*P1.1>>>>A1
*P1.2>>>>A2
*P1.3>>>>RD
*P1.4>>>>D0
*P1.5>>>>D1
*P1.6>>>>D2
*P1.7>>>>D3
*P3.7>>>>WR
*P3.3>>>>EOC
************************************/
#include <stdio.h>
#include <reg51.h>
#include <math.h>
#include "system_hssm.h"
unsigned char ge,shi, bai, qian, jiaozhun,cr0,cr1,cr2,cr3,cr4,FSCode=3,RangeCode=1;
unsigned char FSCodeM=0,RangeCodeM=0;
char RangeM,sp3;
char SelectF=0,SelectR=0;/*ControlCode=22;/*31;*/
int Y=0,eoc=0,temp=0,i=0,j=0,Rref,Radjust,ling_py;
bit pyfh,zong_fh;
int Rx=0;
void rcm(),dcvm(),readbcd(),zeroc();
sbit WR_134 = P3^7;
void delay(void);
//void delay1(void);
void delay50ms();
void EOCR();
void MVF();
void MRF();
void MCF();
void MDF();
void MIF();
void test_setting(void);
void test_task(void);
/*************************************
*涵数名:test_setting();
*涵数功能:根据键盘输入设置测试参数
*并进行显示
*KEY1 = TEST_FUNCTION -
*KEY2 = TEST_FUNCTION +
*KEY3 = TEST_RANGECODE-
*KEY3 = TEST_RANGECODE+
**************************************/
void test_setting(void)
{
byte key;
key=key_task();
if(key!=0)
{
switch(key)
{
case 1:
if(FSCode!=1)
{
FSCode--;
RangeCode=1;
}
break;
case 2:
if(FSCode!=7)
{
FSCode++;
RangeCode=1;
}
break;
case 3:
if(RangeCode!=1)
{
RangeCode--;
}
break;
case 4:
if(RangeCode!=6)
{
RangeCode++;
}
break;
default:
break;
}
sx_test_FS(); //UPdate disp
}
}
/*************************************
*涵数名:test_task();
*涵数功能:根据设置的参数进行相应的测量
*并并进行显示
**************************************/
void test_task(void)
{
P3&=0X7F; //P3.7置零,写控制信号WD有效
P1=0X68; //在零地址写入6:开蜂鸣器,并将蜂鸣器的频率选择为4096HZ
delay(); //延时
P1=0X00; //写入地址.开读并将地址和数据都设置成零,此是读写信号都有效 ???
delay(); //延时
if(FSCode==1||FSCode==2) //检测现在要执行的功能代号如果等于功能1和功能2就执行电压测量
{
//P3=0XF0; //控制继电器,形成电压测试电路
MVF(); //调用电压测量涵数
P1=0X3C; //将读零操作置有效
delay1();
WR_134=0;
delay1();
WR_134=1;
delay1(); //以上均为置读操作有效
EOCR(); //读零转换结果
if(Y>=6000)//如果读取的零偏移是负数
{
Y=10000-Y; //解析出负数的绝对值
Y=65536-Y; //将数据纠正成有符号的INT数据型的表示方法。
}
ling_py=Y; //储存正确的零偏移量
P1=0X1C; //将读零操作置无效
delay1();
WR_134=0;
delay1();
WR_134=1;
delay1(); //以上为取消读零转换的操作,使其读输入的实际值
//EOCR();
EOCR(); //读取转换数据
if(Y>=6000) //检测读出的数据是不是负数,如果是负的数,就解析对应的绝对值并表示成INT类型的有符号数
{
Y=10000-Y;
Y=65536-Y; //将数据纠正成有符号INT数据型的表示方法。
}
Y=Y-ling_py;
if(Y<0)
{
zong_fh=1;
Y=65536-Y; //将有符号数据转换成无符号数据以便于后面的显示转换。
}
else
zong_fh=0;
}
//----------------------------------------------------------------------------------------------
else if(FSCode==3)
{
//P3=0XF9; //前端形成电阻测量电路//
//P3=0XE9;
//delay();
MRF(); //设置并写入电阻测量相应的控制字节
EOCR(); //读取转换结果//
if(Y>4500 && Y<5500) //检测转换结果,如果转换结果在大于4500并小于5500的区间范围内
{
Y=Y-4952; //可以省去,说明输入为空,资料给定值也为49520//
Rx=0;
}
else
{
Y=Y+Radjust; //数据结果处理 待补//
if(RangeCode==1)
{
Rx=Y*10;
}
else
{
Rx=Y*Rref;
}
Rx=Rx/5; //转换代码到结果的转换公式//
}
//Rx=Rx+0;
Y=Rx;
if(Y>=10000||Y<0)//纠正错误数据
Y=0;
//Y=4952;
}
//-------------------------------------------------------------------------------------------------
else if(FSCode==4||FSCode==5)
{
P3=0XF3; //前端形成电流测量电路//
//LPI1:
MIF();
//LPI2:
EOCR(); //读取转换结果//
//数据结果处理 待补//
//if(FSCodeM==FSCode&&RangeCodeM==RangeCode) goto LPI2;
//if(!RangeCodeM==RangeCode) goto LPI1;
//else break; //
}
//-------------------------------------------------------------------------------------------------
else if(FSCode==6)
{
//P3=0XF1; //前端形成通断测试电路//
//P3=0XE1;
MCF();
//LPC:
EOCR(); //读取转换结果//
Rx=Y+20; //校正由于串连PTC而引起的误差。数据结果处理 待补//
Rx=Rx*Rref;
Rx=Rx/5; //转换代码到结果的转换公式//
if(Rx>-50&&Rx<50) //test continuity, if less than 50 OHM, mesn the circuit is shorten//
{
P3&=0X7F; //写控制有效//
P1=0X28; // beeper on//
delay50ms();
P1=0X08;
P3|=0X80; //关写控制//
//cr0=0X06; //set the information of beeper on//
}
if(Y>4500&&Y<5500)
{
Y=Y-4952; //说明输入为空,资料给定值也为49520//
Rx=0;
}
Rx=Rx+0;
//if(FSCodeM==FSCode) goto LPC;
//else break; //
}
//--------------------------------------------------------------------------------------------------
else if(FSCode==7)
{
//P3=0XF5; //前端形成二极管测试电路//
//P3=0XF9; //前端形成电阻测量电路,需在电阻模式下完成//
MDF();
// LPD:
EOCR(); //读取转换结果//
//数据结果处理 应该除以2才得到正确结果 待补//
Y=Y+0;
//
//if(FSCode==7) goto LPD;
//else break; //
}
// else
// {
// goto RESTAR;
// }
sx_data_disp();
}
/******************************************
* 涵数名: void delay(void)
*
*
* 涵数功能: 延时
*******************************************/
void delay(void)
{
;
}
/******************************************
* 涵数名: void delay1(void)
*
*
* 涵数功能: 延时
*******************************************/
void delay1(void)
{
for(j=0;j<3000;j++){;}
}
/******************************************
* 涵数名: void delay50MS(void)
*
*
* 涵数功能: 延时
*******************************************/
void delay50ms()
{
for(j=0;j<5000;j++){;}
}
/******************************************
* 涵数名: void EOCR()
*
*
* 涵数功能: 从MAX134读取结果
* 备注:P3=控制口;P1=数据口
******************************************/
void EOCR() /*转换结果读取函数*/
{ /*extern int Y; */
//等待EOC变为高电平
P1=0X88; //
delay1();
WR_134=0;
delay1();
WR_134=1;
delay1();
LP1: P3|=0X08;/*while(!P3^3); wait EOC,get the ad convertion,*/ //P3.3=EOC-------------------------
delay(); /*need delay??*/
sp3=P3;
sp3&=0X08; //检测是EOC是不是有效
if(sp3==0) //如果是低就标志没有输出有效标志
{
goto LP1; /*test the P3^3 0 or 1*/ //如果没有输出有小信号就返回.
}
else //MAX134输出有效标志
{
//WD=0 //将写信号设置为有效状态.
P3&=0X7F; /*P3.7置零,写控制信号WD有效*/ //P3.7=RD--------------------------------------
} //---------------------------------------------------------------------------
//EOC输出有效信号后,要在21个周期以后.有效数据才会出现,下面输入的一些无效地址是为了延时
P1|=0X0F; //P1低四位送F //送无效地址的同时将读P1.3变成无效状态
delay(); //
P1=0X88; //P1=0X88 RD=0;HOLD=1; ???????????????????????//应该是先置保持模式,在读转换结果
delay();
delay();
P3=0X80; //P3.7=1 //写信号无效
P1&=0XF7; //P1.3=0 //读信号有效
delay(); /*delay*/ /*Tacc=3.25us*/
delay();
P1=0XF0; //写入地址零并对数据口清零
P1|=0XF0; /*先对p1高四位数据口置1*/
delay();
jiaozhun=P1;
P1=0X01; /*个位寄存器地址=1*/
P1|=0XF0;
delay();
ge=P1;
P1=0X02; /*十位寄存器地址=2*/
P1|=0XF0; /*先对p1高四位数据口置1*/
delay();
shi=P1; /*保存十位数据,应右移四位*/
P1=0X03; /*百位寄存器地址=3*/
P1|=0XF0; /*先对p1高四位数据口置1*/
delay();
bai=P1; /*保存百位数据,应右移四位*/
P1=0X04; /*千位寄存器地址=4*/
P1|=0XF0;
delay();
qian=P1;
ge>>=4; //将数据从高四位还原到低四位
shi>>=4;
bai>>=4;
qian>>=4;
jiaozhun>>=4;
Y=ge;
Y=Y+shi*10;
Y=Y+bai*100;
Y=Y+qian*1000;
P1=0X0C; //将读信号变的无效,并等于地址4 cr4=0;
P3&=0X77; /*P3.7置零,写控制信号WD有效*///将写信号变的有效
P1=0X08; //将读信号变成无效,同时退出HOLD模式
P3&=0X7F; //将写信号变成有效
delay(); //延时
delay();
P3|=0X80; //将写数据信号也变成无效
}
/******************************************
* 涵数名: void WCCF()
*
*
* 涵数功能:往MAX134写控制字
*******************************************/
void WCCF()
{
cr0=cr0*16; /*根据电路要求左移4位**/ //将数据从低四位移到高四位
cr1=cr1*16;
cr2=cr2*16;
cr3=cr3*16;
cr4=cr4*16;
/*P3|=0X80;
delay();*/
P3&=0X7F; /*P3.7置零,写控制信号WD有效*/
delay();
P1|=0X0F; /*P1.3=1,即RD无效,地址=7wu*/
/*P1=0X88; /*HOLD=1,RD无效*/
delay();
P1=0X88; /*HOLD=1,RD无效*/
delay();
P1|=0X0F; /*,RD=1 ,adress=7防止干扰*/
delay();
cr0|=0X08; //将读控制信号和地址信号和数据信号一起合并
P1=cr0; /*由于电路的要求cr0 之前已经左移4位 对寄存器0写入控制字*/
delay();
P1|=0X0F; /*防止不稳定情况*/ //无效地址无效数据
cr1|=0X09;
P1=cr1; /*对寄存器1写入控制字*/
delay();
P1|=0X0F;
cr2|=0X0A;
P1=cr2; /*对寄存器2写入控制字*/
delay();
P1|=0X0F; /*防止不稳定情况*/
cr3|=0X0B;
P1=cr3; /*对寄存器3写入控制字*/
delay();
P1|=0X0F; /*防止不稳定情况*/
cr4|=0X0C;
P1=cr4; /*对寄存器4写入控制字*/
delay();
P1|=0X0F; /*完成对寄存器的写入*/
P1=0X08; /*HOLD=1,RD无效*/ //RD无效,写入地址为零,写入数据为零;------------将一次转换完成后置于保持模式
delay();
P3|=0X80; /*P3.7置1,写控制信号WD无效*/
/*delay();*/
}
/******************************************
* 涵数名: void MVF()
*
*
* 涵数功能: 电压测量函数,装入必要的控制数据到寄存器.
*******************************************/
void MVF() /*电压测量函数FSCode=1 or 2*/
{ //P3=0XF1;
FSCodeM=FSCode;
RangeCodeM=RangeCode;
cr0=0X00; //先初试化相应的控制寄存器,然后根据特殊情况设置对应的控制寄存器
cr4=0X01;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -