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