⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 完全编译通过的LPC2131_2141 读写温湿度传感器sht10的程序.
💻 C
字号:

/****************************************************************************
* 文件名:
* 功能:
* 说明:
iic2接SHT10的数据口
12M晶震
****************************************************************************/
#include  "config.h"
#include <math.h>
#define uchar unsigned char
#define uint unsigned int

#define CLK_SHTH   (FIO0SET |= (1 << 11))  
#define CLK_SHTL   (FIO0CLR |= (1 << 11))
#define DAT_SHTH   (FIO0SET |= (1 << 14))  
#define DAT_SHTL   (FIO0CLR |= (1 << 14))

float wendu,shidu;


void delay_nms(int x)
{
 long i,temp;
 temp=(Fcclk/6000)*x;
 for(i=0;i<temp;i++)
  __asm{NOP};

}


void delay(uchar x)
{
  uchar i;
  for(i=0;i<x*2;i++)
   __asm{NOP};
}

void s_transstart(void)
{
   CLK_SHTL;
   DAT_SHTH;
   delay(20);
   CLK_SHTH;
   delay(10);
   DAT_SHTL;
   delay(10);
   CLK_SHTL;
   delay(20);
   CLK_SHTH;
   delay(10);
   DAT_SHTH;
   delay(10);
   CLK_SHTL;
   delay(20);
}

void s_connectionreset(void)
//----------------------------------------------------------------------------------
// 连接复位;
//       _____________________________________________________         ________
// DATA:                                                      |_______|
//          _    _    _    _    _    _    _    _    _        ___     ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______
{  
  unsigned char i; 
  DAT_SHTH; 
  CLK_SHTL;
  delay(10);                   //准备
  for(i=0;i<9;i++)                  //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
  { 
    CLK_SHTH;
    delay(20);
    CLK_SHTL;
	delay(20);
  }
  s_transstart();                   //启动传输
}

long s_write_byte(unsigned char value)
//----------------------------------------------------------------------------------
// 写字节函数 
{ 
  unsigned char i;
  long error=0;  
  for (i=0x80;i>0;i/=2)             //高位为1,循环右移
  { 
    if (i & value) DAT_SHTH;          //和要发送的数相与,结果为发送的位
    else DAT_SHTL;                        
    CLK_SHTH;                          
    delay(20);        
    CLK_SHTL;
	delay(20);
  }
  DAT_SHTH;                          //release DATA-line  
  CLK_SHTH;                          //clk #9 for ack 
  FIO0DIR&=~( 1 << 14);
  delay(20);  
  error=(FIO0PIN & 0X4000);          //check ack (DATA will be pulled down by DHT90),DATA在第9个上升沿将被DHT90自动下拉为低电平。  
  delay(10); 
  CLK_SHTL; 
  delay(10);
  FIO0DIR|=( 1 << 14);
  DAT_SHTH;                           //release DATA-line  
  return error;                     //error=1 in case of no acknowledge //返回:0成功,1失败
}

char s_read_byte(unsigned char ack)   
{   
  unsigned char i,val=0;  
  DAT_SHTH;
  FIO0DIR&=~( 1 << 14);             //release DATA-line  
  for (i=0x80;i>0;i/=2)             //shift bit for masking  
  { 
    CLK_SHTH;                          //clk for SENSI-BUS  
    if (FIO0PIN & 0X4000) val=(val | i);        //read bit    
    delay(20);        //pulswith approx. 3 us 
    CLK_SHTL; 
	delay(20);              
  } 
  FIO0DIR|=( 1 << 14); 
  if(ack==1)DAT_SHTL;                 //in case of "ack==1" pull down DATA-Line  
  else DAT_SHTH;                      //如果是校验(ack==0),读取完后结束通讯 
  delay(20);          //pulswith approx. 3 us  
  CLK_SHTH;                            //clk #9 for ack  
  delay(20);          //pulswith approx. 3 us   
  CLK_SHTL;                  
  delay(20);          //pulswith approx. 3 us  
  DAT_SHTH;                           //release DATA-line  
  return val;  
}



char s_measure()  
{   
  unsigned error=0;
  uchar datal,datah;
  float dcr16;  
  long i; 

   s_transstart();                   //transmission start 
   error+=s_write_byte(0x03);//温度测量   
   FIO0DIR&=~( 1 << 14); 
   for (i=0;i<0xffffffff;i++) 
   if((FIO0PIN & 0X4000)==0) 
   break; //wait until sensor has finished the measurement  
   if(FIO0PIN & 0X4000) error+=1;                // or timeout (~2 sec.) is reached  
   FIO0DIR|=( 1 << 14); 
   datah=s_read_byte(1);    //read the first byte (MSB)
   datal=s_read_byte(1);    //read the second byte (LSB) 
   dcr16=s_read_byte(0);  //read checksum  
   wendu=(datah*256 + datal)*0.01-40;

   s_transstart();                   //transmission start 
   error+=s_write_byte(0x05);//湿度测量   
   FIO0DIR&=~( 1 << 14); 
   for (i=0;i<0xffffffff;i++) 
   if((FIO0PIN & 0X4000)==0) 
   break; //wait until sensor has finished the measurement  
   if(FIO0PIN & 0X4000) error+=1;                // or timeout (~2 sec.) is reached  
   FIO0DIR|=( 1 << 14); 
   datah=s_read_byte(1);    //read the first byte (MSB)
   datal=s_read_byte(1);    //read the second byte (LSB) 
   dcr16=s_read_byte(0);  //read checksum  
   shidu=datah*256 + datal;
   shidu = (wendu-25)*(0.01+0.00008*shidu)+(shidu*shidu*(-0.0000028)+0.0405*shidu-4);
  
  return error;  
}




void McuInit(void)
{	 
     SCS = 0X03;
	 FIO0MASK = 0X0;
	 PINSEL0 = 0;//引脚功能选择寄存器
	 PINSEL1 = 0;
	 //设置为输入的端口
	 FIO0DIR = 0XFFFFFFFF & (~(1 << 15)) & (~(1 << 16)) & (~(1 << 10))
	                      & (~(1 << 17)) & (~(1 << 18)) & (~(1 << 19)) 
						  & (~(1 << 20)) & (~(1 << 21)) & (~(1 << 22));
	 FIO1MASK = 0X0;
	 FIO1DIR = 0XFFFFFFFF & (~(1 << 22));

}						 


int main (void) 
{   
    uchar error;
	McuInit();      
	delay_nms(200);
	s_connectionreset(); 
	delay_nms(200);
	 while(1)  
     { 
	   error=0;  
       error+=s_measure();  //measure humidity  
       if(error!=0) s_connectionreset();                 //in case of an error: connection reset  
	   delay_nms(100);          
     } 
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -