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

📄 max134.c

📁 数字万用表芯片MAX134的驱动,包括一些资料,知识源于网络
💻 C
📖 第 1 页 / 共 2 页
字号:
/*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 + -