单片机温湿度采集C51程序Word格式文档下载.docx
《单片机温湿度采集C51程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机温湿度采集C51程序Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
#defineData_0_time4
//unsignedchari;
//----------------------------------------------//
//----------------IO口定义区--------------------//
sbitP2_0=P1^2;
/*sbitP2_1=P2^1;
sbitP2_2=P2^2;
sbitP2_3=P2^3;
*/
//----------------定义区--------------------//
U8U8FLAG,k;
U8U8count,U8temp;
U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8U8comdata;
U8outdata[5];
//定义发送的字节数
U8indata[5];
U8count,count_r=0;
//U8str[5]={"
RS232"
};
U16U16temp1,U16temp2;
voiddelay1(unsignedintz)
{
unsignedintx,y;
for(x=0;
x<
z;
x++)
for(y=0;
y<
115;
y++);
}
voiddelay()
unsignedcharx;
10;
x++);
/*voidDelay(U16j)
{
U8i;
for(;
j>
0;
j--)
{
for(i=0;
i<
27;
i++);
}
voidDelay_10us(void)
i--;
}*/
voidCOM(void)
for(i=0;
8;
i++)
{
U8FLAG=2;
while((!
P2_0)&
&
U8FLAG++);
/*for(i=0;
i++)
{
Delay_10us();
}*/
delay();
U8temp=0;
if(P2_0)U8temp=1;
while((P2_0)&
//超时则跳出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;
Delay_10us();
}*/
delay();
//主机设为输入判断从机响应信号
//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
if(!
P2_0)//T!
//判断从机是否发出80us的低电平响应信号是否结束
//判断从机是否发出80us的高电平,如发出则进入数据接收状态
//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;
U8RH_data_L_temp=U8comdata;
U8T_data_H_temp=U8comdata;
U8T_data_L_temp=U8comdata;
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;
//----------------------
//----------------------
//----------------------------------------------
//main()功能描述:
AT89C51串口发
//送温湿度数据,波特率9600
//voidmain()
//{
//U8i,j;
//ucharstr[6]={"
/*系统初始化*/
//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)\
=~0x7;
ADC_CONTR|=CHS(x);
#defineADC_ON()ADC_CONTR|=(1<
7);
#defineADC_OFF()ADC_CONTR&
=~(1<
#defineADC_STAR()ADC_CONTR|=(1<
3);
4);
#defineADC_STOP()ADC_CONTR&
#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<
N;
count++)
sum+=GetADC(0x00);
//delay1
(1);
return(unsignedlongint)(sum/N);
/**********************************
消抖滤波法
**********************************/
/*#defineN12
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;
P2=seg[a%1000/100];
P3=0xfd;
P2=seg[a%100/10];
P3=0xfb;
P2=seg[a%10];
P3=0xf7;
voidmain()
while
(1)
RH();
a=U8RH_data_H;
a<
=8;
a|=U8RH_data_L;
xianshi();