湿度传感器

设为主页 加入收藏繁體中文

湿敏电阻应用程序

 //HIH-6000 样品测量(MCU: 89C52, LCD: 1602);

 
#include
sbit rs=P2^0;                                    //P2.0 与LCD RS脚 相连
sbit rw=P2^1;                                    //P2.1 与LCD RW脚 相连
sbit ep=P2^2;                                    //P2.2 与LCD E脚 相连
sbit sda=P3^4;                                   //P3.4 与i2c 传感器SDA 相连
sbit scl=P3^3;                                   //P3.3 与i2c 传感器SCL 相连
unsigned char code table1[]="RH =        %RH";    //定义LCD 显示湿度字符
unsigned char code table2[]="T  =       DEGC";    //定义LCD 显示温度字符
unsigned char code digit[]={"0123456789"};        //定义字符数组显示数字
void lcd_wcmd(unsigned char cmd);                 //写命令给液晶
void lcd_wdat(unsigned char dat);                 //写数据给液晶
void lcd_init();                                  //液晶初始化
void lcd_pos(unsigned char pos);         //液晶显示位置
void lcd_displayCHA();                    //液晶显示字符
void i2c_start();      // i2c 通讯启动
void i2c_stop();                                   //i2c 通讯停止
void i2c_ack(); //i2c Master 响应
void i2c_readack();                                //i2c Master接受响应
void i2c_nack();                                   //i2c Master不响应
void i2c_write(unsigned char addr);                //i2c Master发送地址
unsigned char i2c_read();                          //i2c master 接受数据 
void delay(unsigned char c);                       //短延时 
void longdelay();                             //长延时
 
 
void lcd_displayCHA()
 {
   unsigned char num;
   lcd_init();
   delay(200);          
   lcd_pos(1);
for(num=0; num<15; num++)
     { 
       lcd_wdat(table1[num]);
       delay(100);
     }
lcd_pos(0x41);
for(num=0; num<15; num++)
 { 
       lcd_wdat(table2[num]);
       delay(100);
     }
 }
 
void lcd_init()
 {
   lcd_wcmd(0x38);
   delay(100);
   lcd_wcmd(0x0C);
   delay(100);
   lcd_wcmd(0x06);
   delay(100);
   lcd_wcmd(0x01);
   delay(100);
 }
 
void lcd_wcmd(unsigned char cmd)
 {
   rs=0;
   rw=0;
   ep=0;
   delay(1);
   P0=cmd;
   delay(1);
   ep=1;
   delay(1);
   ep=0;
 }
 
void lcd_wdat(unsigned char dat)
 {
  rs=1;
  rw=0;
  ep=0;
  P0=dat;
  delay(1);
  ep=1;
  delay(1);
  ep=0;
 }
 
void lcd_pos(unsigned char pos)
 {
  lcd_wcmd(pos | 0x80);
 }
 
void delay(unsigned char c)
 {
   unsigned char x,y;
   for(x=c; x>0; x--)
   for(y=5; y>0; y--)
   ;
 }
 
void longdelay()
 {
   unsigned char x,y,z;
   for(x=10; x>0; x--)
   for(y=100; y>0; y--)
   for(z=100;z>0;z--)
;
 }
 
 
void i2c_start()
 {
  sda=1;
  delay(1);
  scl=1;
  delay(1);
  sda=0;
  delay(1);
  scl=0;
  delay(1);
 }
 
 
void i2c_stop()
 {
  sda=0;
  delay(1);
  scl=1;
  delay(1);
  sda=1;
 }
 
void i2c_ack()
 {
  sda=0;
  delay(1);
  scl=1;
  delay(1);
  scl=0;
  sda=1;
 
 }
 
void i2c_nack()
 {
  sda=1;
  scl=1;
  delay(1);
  scl=0;
  sda=0;
 }
 
void i2c_readack()
 {
  unsigned char i;
  scl=1;
  delay(1);
  while ((sda==1)&&i<250) i++;
  scl=0;
  delay(1);
 }
 
void i2c_write(unsigned char addr)     //i2c通讯写传感器地址。7位地址 + 1读写位
 {
  unsigned char i;
  unsigned char writedata;
  writedata=addr;
  for(i=0; i<8; i++)                   
   {
    scl=0;
    delay(1);
    writedata=writedata<<1;
    sda=CY;
    delay(1);
    scl=1;
    delay(1);
    scl=0;
    delay(1);       
    }
  sda=1;
  delay(1);
 }
 
unsigned char i2c_read()             //i2c 通讯读取一个字节。
 {
   unsigned char i;
unsigned char readbit;
unsigned char readbyte;
   scl=0;
   delay(1); 
   sda=1;
   delay(1);
   for(i=0; i<8; i++)                
    {
     scl=1;
     delay(1);
     readbit=sda;
     readbyte=(readbyte<<1)|readbit;
     scl=0;
     delay(1);
    }
   return readbyte;
 }
 
void main()
{
  
 
 
 
 
     
 lcd_init();                    //将液晶初始化
   delay(2);                        //延时3ms给硬件一点反应时间
   lcd_displayCHA();                //LCD显示湿度和温度相关字符
longdelay();
while (1)
  {
           unsigned char data_byte1, data_byte2, data_byte3, data_byte4;
  unsigned char status_bits;
           long int humidity_bytes, temperature_bytes;
  long int RH, T;
  unsigned char A1, A2, A3, B1, B2, B3;
          longdelay();
 i2c_start();                                         //进入MR 模式
          i2c_write(0x4e);                                     //写i2c传感器地址+0"写"位到SDA数据线
 i2c_readack();    
   i2c_stop();
     delay(100);
 
          i2c_start();
         i2c_write(0x4f);                                     //写i2c传感器地址+1"读"位到SDA数据线
 i2c_readack();
 delay(1);
          data_byte1=i2c_read();                    //接收第一个字节
 i2c_ack();                                         
 data_byte2=i2c_read();                               //接收第二个字节                   
 i2c_ack();
          data_byte3=i2c_read();                               //接收第三个字节
   i2c_ack();
          data_byte4=i2c_read();                              //接收第四个字节
 delay(1);
 i2c_nack();
 delay(1);
 i2c_stop();
 status_bits=data_byte1&0xc0;                        //取出第一字节的前两位状态位
 if(status_bits==0)                                  //当第一字节的前两位状态位都为0时,数据有效
   {
     humidity_bytes=(data_byte1&0x3F)*256+data_byte2;   //前两个字节组合成湿度结果
     RH=(humidity_bytes*10*100)/16383;
              temperature_bytes=(data_byte3*256+data_byte4)>>2; //后两个字节合成温度结果
     T=(temperature_bytes*10*165)/16383-40*10; 
       A1=RH/100;      //计算湿度值十位数字
A2=(RH%100)/10;                  //计算湿度值个位数字
A3=RH%10;                      //计算湿度值小数第一位  
lcd_pos(7);                              //定义湿度值十位显示地址
lcd_wdat(digit[A1]);                      //将湿度值十位数字写入LCD
                lcd_pos(8);                                 //定义湿度值个位显示地址
       lcd_wdat(digit[A2]);                    //将湿度值个位数字写入LCD
lcd_pos(9);                    //定义湿度值小数点显示位置
lcd_wdat('.');                 //写湿度值小数点
           lcd_pos(0x0a);                        //小数点后第一位数字显示地址
             lcd_wdat(digit[A3]);                 //将小数部分的第一位数字字符常量写入LCD
       B1=T/100;     //计算温度值十位数字
B2=(T%100)/10;                //计算温度值个位数字  
    B3=(T%10);          //计算温度值小数点后一数字  
       lcd_pos(0x47);                        //温度值十位显示地址
       lcd_wdat(digit[B1]);                  //将温度值十位数字写入LCD
                lcd_pos(0x48);                        //温度值个位显示地址
       lcd_wdat(digit[B2]);                  //将温度值个位数字写入LCD
lcd_pos(0x49);       //定义温度值小数点位置
lcd_wdat('.');       //将温度值小数点写入LCD
           lcd_pos(0x4a);                        //定义温度值小数点第一位显示位置
             lcd_wdat(digit[B3]);                  //将小温度值的第一位写入LC
    }
      else
;
}
}
 
 
 

TAG:
评论加载中...
内容:
评论者: 验证码:
  
产品咨询
点击这里给我发消息
销售代表:
点击这里给我发消息
销售代表:
点击这里给我发消息