for(y=0;y<115;y++);
}
voiddelay()
{
unsignedcharx;
for(x=0;x<10;x++);
}
/*voidDelay(U16j)
{
U8i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
voidDelay_10us(void)
{
U8i;
i--;
i--;
i--;
i--;
i--;
i--;
}*/
voidCOM(void)
{
U8i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!
P2_0)&&U8FLAG++);
/*for(i=0;i<8;i++)
{
Delay_10us();
Delay_10us();
Delay_10us();
}*/
delay();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
//如果高电平高过预定0高电平值则数据位为1
U8comdata<<=1;
U8comdata|=U8temp;//0
}//rof
}
//--------------------------------
//-----湿度读取子程序------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位==U8T_data_H------
//----温度低8位==U8T_data_L------
//----湿度高8位==U8RH_data_H-----
//----湿度低8位==U8RH_data_L-----
//----校验8位==U8checkdata-----
//----调用相关子程序如下----------
//----Delay();,Delay_10us();,COM();
//--------------------------------
voidRH(void)
{
//主机拉低1-5ms
P2_0=0;
delay1(6);
P2_0=1;
//总线由上拉电阻拉高主机延时40us
/*for(i=0;i<8;i++)
{
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
}*/
delay();
//主机设为输入判断从机响应信号
P2_0=1;
//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
if(!
P2_0)//T!
{
U8FLAG=2;
//判断从机是否发出80us的低电平响应信号是否结束
while((!
P2_0)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出80us的高电平,如发出则进入数据接收状态
while((P2_0)&&U8FLAG++);
//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
P2_0=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
if
(1)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}//fi
}//fi
}
//----------------------
//P2_1=0;//T
//P2_1=1;//T
//----------------------
//----------------------
//P2_1=0;//T
//P2_1=1;//T
//----------------------
//----------------------------------------------
//main()功能描述:
AT89C51串口发
//送温湿度数据,波特率9600
//----------------------------------------------
//voidmain()
//{
//U8i,j;
//ucharstr[6]={"RS232"};
/*系统初始化*/
//TMOD=0x20;//定时器T1使用工作方式2
//TH1=253;//设置初值
//TL1=253;
//TR1=1;//开始计时
//SCON=0x50;//工作方式1,波特率9600bps,允许接收
//ES=1;
//EA=1;//打开所以中断
//TI=0;
//RI=0;
//SendData(str);//发送到串口
//Delay
(1);//延时100US(12M晶振)
//while
(1)
//{
//------------------------
//调用温湿度读取子程序
//RH();
//串口显示程序
//--------------------------
//str[0]=U8RH_data_H;
//str[1]=U8RH_data_L;
//str[2]=U8T_data_H;
//str[3]=U8T_data_L;
//str[4]=U8checkdata;
//SendData(str);//发送到串口
//读取模块数据周期不易小于2S
//Delay(20000);
//}//elihw
//}//main
/*voidRSINTR()interrupt4using2
{
U8InPut3;
if(TI==1)//发送中断
{
TI=0;
if(count!
=5)//发送完5位数据
{
SBUF=outdata[count];
count++;
}
}
if(RI==1)//接收中断
{
InPut3=SBUF;
indata[count_r]=InPut3;
count_r++;
RI=0;
if(count_r==5)//接收完4位数据
{
//数据接收完毕处理。
count_r=0;
str[0]=indata[0];
str[1]=indata[1];
str[2]=indata[2];
str[3]=indata[3];
str[4]=indata[4];
P0=0xfe;
}
}
}*/
unsignedcharcodeseg[]={
0XC0,0XF9,0XA4,0XB0,0X99,
0X92,0X82,0XF8,0X80,0X90,
0X40,0X79,0X24,0X30,0X19,
0X12,0X02,0X78,0X00,0X10};
unsignedlonginta,b;
#defineSPE(x)(((x&0x3)<<5))
#defineCHS(x)((x&0x7))
#defineSETSPE(x)\
{\
ADC_CONTR&=~0x60;\
ADC_CONTR|=SPE(x);\
}
#defineSETCHS(x)\
{\
ADC_CONTR&=~0x7;\
ADC_CONTR|=CHS(x);\
}
#defineADC_ON()ADC_CONTR|=(1<<7);
#defineADC_OFF()ADC_CONTR&=~(1<<7);
#defineADC_STAR()ADC_CONTR|=(1<<3);ADC_CONTR&=~(1<<4);
#defineADC_STOP()ADC_CONTR&=~(1<<3);
#defineADC_OK(ADC_CONTR&(1<<4))
unsignedintGetADC(unsignedcharin)//ADC输入函数:
{
unsignedinttmp;
if((ADC_CONTR&0x80))//AD电源打开
{
//初始化
ADC_CONTR=0xe0;//速度4(210clk),通道0,没有开始
SETCHS(in);//设置通道
ADC_STAR();//开始转换
while(!
ADC_OK);//等待转换结束
//保存结果
tmp=ADC_DATA;
tmp<<=2;
tmp|=ADC_LOW2;
returntmp;
}
else
{
ADC_ON();
return-1;
}
}
/************************************
平滑滤波
************************************/
#defineN12
unsignedlongintfilter()
{
unsignedcharcount;
unsignedlongintsum=0;
for(count=0;count{
sum+=GetADC(0x00);
//delay1
(1);
}
return(unsignedlongint)(sum/N);
}
/**********************************
消抖滤波法
**********************************/
/*#defineN12
unsignedlongintfilter()
{
charcount=0;
unsignedlongintvalue;
unsignedlongintnew_value;
new_value=GetADC(0x07);
while(value!
=new_value)
{
count++;
if(count>=N)returnnew_value;
//delay1
(1);
new_value=GetADC(0x07);
}
returnvalue;
}*/
/*********************************/
voidxianshi()//显示子程序
{
P3=0xff;
P2=seg[a/1000];
delay1(5);
P3=0xfe;
delay1(5);
P3=0xff;
P2=seg[a%1000/100];
delay1(5);
P3=0xfd;
delay1(5);
P3=0xff;
P2=seg[a%100/10];
delay1(5);
P3=0xfb;
delay1(5);
P3=0xff;
P2=seg[a%10];
delay1(5);
P3=0xf7;
delay1(5);
}
voidmain()
{
while
(1)
{
RH();
a=U8RH_data_H;
a<<=8;
a|=U8RH_data_L;
xianshi();
}
}