| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 548 人关注过本帖
标题:湿度传感器
只看楼主 加入收藏
蓝色雨396
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-5-14
结帖率:0
收藏
 问题点数:0 回复次数:3 
湿度传感器
菜鸟明知不该在此地求高手帮忙写程序,只是被逼无耐,不求一定能够解决,但求能有路过的大侠闲暇之余稍费心神,感激不尽。
 在下想写程序实现单片机C52,湿度传感器应用。
搜索更多相关主题的帖子: 传感器 单片机 
2011-06-05 12:09
若水随缘
Rank: 2
等 级:论坛游民
帖 子:7
专家分:20
注 册:2011-6-9
收藏
得分:0 
#include<reg52.h>
#include<7279.h>

#define uchar unsigned char
#define uint unsigned int
//---------------------------------------------
sbit DQ=P1^5;  //DS18b20数据端
bit tx_flag;
unsigned char c;    //温度低 四位 小数位
unsigned int tmpr = 0;
//---------------------------------------------------
uchar data_buff[10]={0,1,2,3,4,5,6,7,8,9};
uchar rx_buff[5];
uchar data_send[8]={0,1,2,3,4,5,6,7};//数据发送缓冲区
uchar data_receive[5]={4,3,2,1,0};    //数据接收缓冲区
//-----------------------------------------------------
/***************************************************************/
unsigned char seg[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char flag,tem0,tem1,count,num,temp0,temp1;
int f;                                                 //频率计数
void int_scom(void) //初始化:       //串口初始化
{

 TMOD = 0X25;                              //定时器1工作方式1
 SCON = 0X50;  //8位UART,波特率为T1溢出率

 TH1 = 0XFA;                                 //波特率设定
 TL1 = 0XFA;
 TR1 = 1;                                       //开启定时器1
 ES = 1;                                           //串口中断打开
 ET1 = 0;                                         
 EA = 1;                                             //总中断打开
}
//------------------------------------------------------
void T2_init(void)                         //定时器初始化
{
 RCAP2H=(65536-62500)/256;   //重装载计数器赋初值
 RCAP2L=(65536-62500)%256;
 TH2=65536/256;                        //T2赋初值
 TH2=65536%256;
 TMOD=0x25;                            //工作方式设定
 TL0=0x00;               
 TH0=0x00;
 ET2=1;          //开定时器2中断
 EA=1;             //开总中断
 TR2=1;          //开启定时器,并设置为自动重装载模式
 ET0=1;                        
 TR0=1;                    
}
//-------------------------------------------------------
void delay(unsigned int i)  //延时程序
{   while(i--);
 }

/*18b20初始化函数*/
void Init_DS18B20(void)
{
  unsigned char x=0;
  DQ = 1;    //DQ复位
  delay(8);  //稍做延时
  DQ = 0;    //单片机将DQ拉低
  delay(80); //精确延时 大于 480us
  DQ = 1;    //拉高总线
  delay(10);
  x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  delay(5);
}
//--------------------------------------------------------
//
//
//
//--------------------------------------------------------

/*DS18B20读一个字节函数*/
unsigned char ReadOneChar(void)
{
 unsigned char i=0;
 unsigned char dat = 0;
 for (i=8;i>0;i--)
  {
    DQ = 0; // 给脉冲信号
    dat>>=1;
    DQ = 1; // 给脉冲信号
    if(DQ)
     dat|=0x80;
    delay(5);
  }
  return(dat);
}

/*DS18B20写一个字节函数*/
void WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for (i=8; i>0; i--)
  {
    DQ = 0;
    DQ = dat&0x01;
    delay(5);
    DQ = 1;
    dat>>=1;
  }
  delay(5);
}

/*DS18B20读取温度函数*/
unsigned char ReadTemperature(void)
{
 unsigned char a=0;
 unsigned char b=0;
 unsigned char t=0;
 Init_DS18B20();
 WriteOneChar(0xCC); // 跳过读序号列号的操作
 WriteOneChar(0x44); // 启动温度转换
 delay(200);
 Init_DS18B20();
 WriteOneChar(0xCC); //跳过读序号列号的操作
 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
 a=ReadOneChar();    //a为温度的低8位
 b=ReadOneChar();    //b为温度的高4位兼4位符号位
 c=a;                           
 c=c&0x0f;                   //小数位的数值
 b<<=4;
 b+=(a&0xf0)>>4;        
 t=b;
 return(t);
}
//--------------------------------------------------------
//
//
//
//
//-频率换算成湿度----------------------------------------
void tran(void)
{
  f=tem1;
  f=(f<<8)|tem0;
  f=f*16;                //这里f的值是最终读到的频率,不同频率对于不同相对湿度。
  if((5423<=f)&&(f<=6652))         //相对湿度在有效范围内(0%--100%)
  {if((6534<f)&&(f<= 6652))
     {temp0=0;temp1=(6652-f)*10/118;}
              if((6418<f)&&(f<=6534))
                     {temp0=1;temp1=(6534-f)*10/116;}
              if((6303<f)&&(f<=6418))
                     {temp0=2;temp1=(6418-f)*10/115;}
              if((6188<f)&&(f<=6303))
                     {temp0=3;temp1=(6303-f)*10/115;}
              if((6071<f)&&(f<=6188))
                     {temp0=4;temp1=(6188-f)*10/117;}
              if((5952<f)&&(f<=6071))
                     {temp0=5;temp1=(6071-f)*10/119;}
              if((5829<f)&&(f<=5952))
                     {temp0=6;temp1=(5952-f)*10/123;}
              if((5701<f)&&(f<=5829))
                     {temp0=7;temp1=(5829-f)*10/128;}
              if((5566<f)&&(f<=5701))
                     {temp0=8; temp1=(5701-f)*10/135;}
              if((5423<f)&&(f<=5566))
                     {temp0=9; temp1=(5566-f)*10/143;}
            }
       else
       {
         temp0 = 0; temp1 = 0;
       }
      write7279(DECODE0+5,temp1);
      write7279(DECODE0+6,temp0);
   write7279(UNDECODE+4,0x37);

}
//-------------------------------------------------------
void send_comm_1(uchar tmp)//串口发送函数:
{

  TI = 0;
  SBUF = tmp;
  while(!TI);
  TI = 0;
}
void send_comm (uchar *tmp)//发送函数:
{
 uchar i;
 ET0 = 0;
 ET2 = 0;
 for(i = 0; i < 8; i++)
 {
  TI = 0;
  SBUF = *(tmp++);
  while(!TI);
  TI = 0;
 //  write7279(0xc8+i,*tmp);  //0X90为最右边数码管

 }
 ET0 = 1;
 ET2 = 1;
 
}


void Receive(void) interrupt 4 using 2//接收中断:
{
  uchar i = 0;
 if(RI == 1)
 {
  rx_buff[i++] = SBUF;
  if(i > 5)
  {
   i = 0;
  }
  RI = 0;
 }
}
//-------------------------------------------------------------
//
//
//
//
//----------------------------------------------------------------
void Timer0() interrupt 1 //T0中断函数
{
  EA =0;                 
  TR2=0;                     
  TR0=0;                        
  TH2=65536/256;            
  TH1=65536%256;           
  TL0=0x00;                           
  TH0=0x00;
  TR2=1;
  TR0=1;
  EA=1;
}
//---------------------------------------------------------------
void Timer2() interrupt 5    //调用定时器2,自动重装载模式
{
 TF2=0;//定时器2的中断标志要软件清0
 EA =0;
 TR0=0;        
 tem0=TL0;
 tem1=TH0;
 TL0=0x00;
 TH0=0x00;
 num++;          //计数标志自加1
 if(num==16)          //判断是否到5s
 {
            
  flag=1;
  count++;
  if(count==10) count=0;
  num=0;
 }
 TR0=1;
 EA=1;

}
//--------------------------------------------------------------
void chuli_data(void)
{
 data_send[0]= tmpr%10;
    data_send[1]= tmpr%100/10;
    data_send[2]= tmpr%1000/100;

 data_send[3]= 0;
    data_send[4]= 0x37;
    data_send[5]= temp1;
 data_send[6]= temp0;
    data_send[7]= 1;
   
}
//--------------------------------------------------------------
void main(void)
{

 int_scom();
 int_7279();
 T2_init();

 while(1)
 {
   tmpr = ReadTemperature();
   tmpr = tmpr*10+c*6/10;
   if(flag==1)  
        {
    flag = 0;
    tran();
    Disp(tmpr);
    chuli_data();
    send_comm(data_send);
    }
  // Disp(tmpr);
   
   if(!key)
     {
     switch(Key_Scan())
     {
      case 0:
       {
        
        break;
       }
      case 1:
       {
        
        send_comm(data_receive);
        break;
       }
      case 2:break;
      case 3:break;
      case 4:break;
      case 5:break;
                  case 6:break;
                  case 7:break;
      case 8:break;
     }
      
      }
  
 }
}
2011-06-14 11:19
若水随缘
Rank: 2
等 级:论坛游民
帖 子:7
专家分:20
注 册:2011-6-9
收藏
得分:0 
温度传感器采用DS18B20,精度为12位(0.0625℃),使用寄生电源式接法;湿度传感器为HS1101(湿敏电容),采用555定时器,输出一个谐波信号,通过T0口取得当前频率,并换算得到对应的湿度;将得到的温湿度数据通过串行方式定时发送给上位机。T2为定时器,T1为波特率发生方式,T0为计数器。
2011-06-14 11:20
蓝色雨396
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-5-14
收藏
得分:0 
非常感谢
2011-06-26 16:07
快速回复:湿度传感器
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049500 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved