#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sfr AUXR=0x8e;
sfr ADC_DATA=0xC6;
sfr ADC_LOW2=0xBE;
sfr ADC_CONTR=0xC5;
sfr P1M0=0x91;
sfr P1M1=0x92;
sfr P3M0=0xB1;
sfr P3M1=0xB2;
sbit temp=P1^0;
sbit lw=P3^2;
sbit hw=P3^3;
sbit lout=P1^6;
sbit lin=P1^2;
sbit led=P1^7;
sbit khot=P3^4;
sbit kair=P3^5;
sbit tw=P3^7;
sbit rx=P3^0;
sbit tx=P3^1;
//========================================================================
// Function name: average
// Description: 对AD采样数据软件滤波,先对整个数组的三十个值进行从小到大的排列, 再去掉最大5个和最小5个再求平均值;函数返回temp值
// Parameter:
// Return:
// Other: 算术平均算法
//========================================================================
uint average(uint buffer[30])
{
uchar i,j;
uint temp1;
for(i=1; i<30; i++)
for(j=29; j>=i; --j)
{
if(buffer[j-1] > buffer[j])
{
temp1 = buffer[j-1];
buffer[j-1] = buffer[j];
buffer[j] = temp1;
}
}
temp1 = 0;
for(i=5; i<25; i++)
{
temp1 += buffer[i];
}
temp1 = (uint)(((float)temp1) / 20 + 0.5);
return(temp1);
}
//========================================================================
// Function name: AD
// Description: 入口:
// Parameter: 出口:
// Return:
// Other:
//========================================================================
uint AD()
{
char i;
uint nv,result,m;
uint temp_buf[30]={0};
result = 2;
for(i=0;i<30;i++)
{
ADC_DATA = 0x00; //ADC的数据存储器清零
ADC_CONTR |=0x80; //开启转换电源
_nop_(); //延时4个时钟周期
_nop_();
_nop_();
_nop_();
ADC_CONTR|=0x08; //启动AD转换
do
{
result--;
for(m=0;m<1;m++);
if(result < 1)
break;
}while((ADC_CONTR&0x10)==0);
ADC_CONTR &=0xe7; //清除标志
temp_buf[i]=ADC_DATA; //取出数值到temp_buf
}
nv = average(temp_buf); //采样30次后的数据代入处理函数处理后返回处理后的数值,待检测用
return(nv);
}
//========================================================================
// Function name: Adc
// Description: 入口:通道号;
// Parameter: 出口:AD转换结果
// Return:
// Other:
//========================================================================
uint Adc(uchar channel)
{
uint ADResult;
switch(channel)
{
case 0:
P1M0|=0x01; P1M1|=0x01; //设置P1.0位为开漏
ADC_CONTR|=0xA0; //选AD通道,SPEED1,SPEED0为01,即每个周期采样810次
ADResult=AD(); //调用AD转换函数
break;
}
return(ADResult); //返回滤波后采样处理结果
}
//========================================================================
// Function name: TEST_nv1
// Description: 检测采集到的温度对应的电压值
// Parameter:
// Return:
// Other:
//========================================================================
/*uchar TEST_nv1()
{
uint voltage0; //定义电压变量
uchar v_ok; //v_ok为二进制变量,只能取0、1两个值
voltage0=Adc(0); //取回精度控制的采样值
if((voltage0>=16)&&(voltage0<=184)) //判断温度T是否在[5°,100°] ,15.872=16;184.32=184
{
v_ok=1; //温度T在[5°,100°],水温大于5°,小于100°,加热继电器不工作
}
else
{
if((voltage0>185)&&(voltage0<=240)) //判断温度T是否在[-30°,5°),184.32=184改为195,也即0度,240.128=240
{
v_ok=0; //水温小于5°,加热继电器工作
}
else
{
v_ok=1;
}
}
return(v_ok);
} */