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

📄 max197.c

📁 基于max197芯片
💻 C
字号:
#include <AT89X52.H>
#include <absacc.h>
#define AD_ADDR XBYTE[0x7F00]//AD芯片地址
sbit AD_INT=P3^2;
sbit AD_HBEN=P1^1;

//热电偶:1℃对应0.039mV
unsigned int code TableV[101]={
0,39,79,119,158,198,238,277,317,357,397,437,477,517,557,597,637,677,718,758,798,838,879,919,
960,1000,1041,1081,1122,1163,1203,1244,1285,1326,1366,1407,1448,1489,1530,1571,1612,1653,1694,
1735,1776,1817,1858,1899,1941,1982,2023,2064,2106,2147,2188,2230,2271,2312,2354,2395,2436,2478,
2519,2561,2602,2644,2685,2727,2768,2810,2851,2893,2934,2976,3017,3059,3100,3142,3184,3225,3267,
3308,3350,3391,3433,3474,3516,3557,3599,3640,3682,3723,3765,3806,3848,3889,3931,3972,4013,4055,
4096};

//热电阻:1℃对应100.39欧姆
unsigned int code TableR[101]={
10000,10039,10078,10117,10156,10195,10234,10273,10312,10351,10390,10429,10468,10507,10546,10585,
10624,10663,10702,10740,10779,10818,10857,10896,10935,10973,11012,11051,11090,11129,11167,11206,
11245,11283,11322,11361,11400,11438,11477,11515,11554,11593,11631,11670,11708,11747,11786,11824,
11863,11901,11940,11978,12017,12055,12094,12132,12171,12209,12247,12286,12324,12363,12401,12439,
12478,12516,12554,12593,12631,12669,12708,12746,12784,12822,12861,12899,12937,12975,13013,13052,
13090,13128,13166,13204,13242,13280,13318,13357,13395,13433,13471,13509,13547,13585,13623,13661,
13699,13737,13775,13813,13851};

unsigned int TableFind(const unsigned int sample,const unsigned int Tables[101])
{
	unsigned char i;
	unsigned long value=Tables[0];
	for(i=0;i<100;i++)
	{
		if((sample>Tables[i])&&(sample<Tables[i+1]))
		{
			value=(sample-Tables[i])*100;
			value=value/(Tables[i+1]-Tables[i])+i*100;
			break;
		}
		else if(sample==Tables[i+1])
		{
			value=(i+1)*100;
			break;
		}
	}
	return(value);//单位1.00℃
}

 signed int MAX197(const unsigned char ch)
// signed long MAX197(const unsigned char ch)
{
    unsigned char i;
	unsigned int result,result1,result2;
	unsigned long temp;
	signed long temp2;
	AD_HBEN=0;  
	AD_ADDR=0x40|ch;//确定第几路
	while(AD_INT==1);
	result=AD_ADDR;//低8位
	AD_HBEN=1;
	result1=(AD_ADDR)&0x0F;//高4位
	result+=result1<<8;
//	result=0x07ff;//debug
	temp=result;
	temp=temp*5000/4095;//转换为AD前电压mV
	switch(ch)
	{
		case 0://热电阻需要从CH1采集V2
				AD_HBEN=0;
				AD_ADDR=0x41;
	         	while(AD_INT==1);
				result2=AD_ADDR;//低8位
				AD_HBEN=1;
				result1=(AD_ADDR)&0x0F;//高4位
				result2+=result1<<8;
		//		result2=0x0;          //debug
                temp2=result-result2*2;
		//		temp2=result-result2*2*5000/4095;
		//		temp2=temp2*5000/4095*120/13.4;
				temp2=temp2*5000/4095/11.515741*100;
         //     temp2=temp2/0.011515741/1000*100;
				temp2=TableFind(temp2,TableR);
				break;
		case 2://热电偶需要从CH3采集PN
				AD_HBEN=0;
				AD_ADDR=0x43;
		    	while(AD_INT==1);
				result2=AD_ADDR;//低8位
				AD_HBEN=1;
				result1=(AD_ADDR)&0x0F;//高4位
				result2+=result1<<8;
				temp2=result2;
			//	temp2=0x0952;//debug
				temp2=temp2*5000/4095/5;//转换为AD前电压mV
				temp2=(628-temp2)*100/2.26;//转换PN温度1.00℃
				i=temp2/100;
				temp2=(TableV[i+1]-TableV[i])*(temp2-i*100)/100+TableV[i];
				temp2+=temp*1000/125;
				temp2=TableFind(temp2,TableV);
				break;
		case 4://线性电压型湿度:0mV~5000mV对应0.0%~100.0%
				temp2=temp/5;
				break;
		case 5://线性电压型温度:0mV~5000mV对应-10.00℃~60.00℃
			//	temp2=temp*105/50-2000;
                temp2=temp*70/50-1000;
				break;
		case 6://线性电流型湿度:1000mV~5000mV对应0.0%~100.0%
				temp2=temp;
				temp2=(temp2-1000)/4;
				break;
		case 7://线性电流型温度:1000mV~5000mV对应-10.00℃~60.00℃
				temp2=temp;
			//	temp2=(temp2-1000)*105/40-2000;
                temp2=(temp2-1000)*70/40-1000;
				break;
	}
	return temp2;//单位1.00℃
}

void main()
{
	unsigned char number[5];
//    unsigned char i;
	unsigned char n;
//	unsigned char r;
	signed int result;
  // signed long result;
    TMOD=0x20;//定时器1工作在模式2(8位自装载)
    TH1=0xfd;//波特率9600
    TL1=0xfd;
    SCON=0x50;//串口工作模式1,10位异步收发(1位起始位,8位数据位,1位停止位),波特率由定时器1控制
    PCON=0x00;//80h时,波特率加倍
    TR1=1;
    //IE=0x90;//采用查询串口方式*/

     n=0;       //debug
     	while(1)//一直在循环吗
	{   
	/*	while(RI==0);
		RI=0;
		n=SBUF;
		n=n-0x30; */
		if(n>=0&&n<8)
	/*	{  
            SBUF=n+0x30;
            while(TI==0);
            TI=0;
            while(RI==0);
            RI=0;
            r=SBUF;
			if(r=='T')
			{  */
	        	result=MAX197(n);        //其中的n代表路数
	 		    if(result<0)
			   {
				 result=-result;
			 	 number[4]=0x31;
				 SBUF=number[4];
				 while(TI==0);
				 TI=0;
		       }
	        	else
			   {
				 number[4]=result/10000;
				 SBUF=number[4]+0x30;
				 while(TI==0);
				 TI=0;
			   }
			    result=result%10000;
			    number[3]=result/1000;
			    result=result%1000;
			    number[2]=result/100;
			    result=result%100;
			    number[1]=result/10;
			    result=result%10;
			    number[0]=result;
	/*		    for(i=4;i>0;i--)         //由高位到低位的顺序传
			  {
				 SBUF=number[i-1]+0x30;
				 while(TI==0);
                 TI=0;
			  }*/
               while(1)              //debug
 		       {}
			 
    /*         SBUF='$';
               while(TI==0);
               TI=0;
		       
       }
		   else                    //发送错误信息(返回的确认命令错误)
              {
			  SBUF='W';
			  while(TI==0);
			  TI=0;
			  }

		}
	else                       //发送错误信息(收到的通道号错误)
		{
			SBUF='F';
			while(TI==0);
			TI=0;
		} */  
	}
}

⌨️ 快捷键说明

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