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

📄 main.c

📁 SHT10资料和C例程
💻 C
📖 第 1 页 / 共 3 页
字号:


//#include "18b20.h"
//#include "LCD128_64.h"
/****************************************************
1、 光照宏 
****************************************************/
char data[];
#include "ioCC2430.h"
//float num;
#define uint unsigned int
#define    DATA     P0_2
#define    SCK     P0_3
#define   LIGHTADRR   0x89
#define    LIGHTADRW   0x88
////////////////////////////////////////////////////////////////////////////////////////////

/****************************************************
2、 空气温度湿度宏 
****************************************************/

enum {TEMP,HUMI};



#define noACK 0
#define ACK   1
                            //adr  command  r/w
#define STATUS_REG_W 0x06   //000   0011    0
#define STATUS_REG_R 0x07   //000   0011    1
#define MEASURE_TEMP 0x03   //000   0001    1
#define MEASURE_HUMI 0x05   //000   0010    1
#define RESET        0x1e   //000   1111 


//#include "hal.h"
/****************************************************
3、 土壤温度宏 
****************************************************/
#define CL_DQ  P1_2=0
#define SET_DQ P1_2=1 
#define SET_OUT P1DIR|=0x04
#define SET_IN  P1DIR&=~0x04
#define IN_DQ  P1_2
#define uint16 unsigned int 
#define BYTE unsigned char



/****************************************************
4、 土壤水分宏 
****************************************************/








/****************************************************
1、 土壤温度函数 
****************************************************/
 //void Delay_1us(void); 
 void Delay_nus(uint16 n) ;
 void write_1820(unsigned char x) ; 
 unsigned char read_1820(void);  
 unsigned char init_1820(void) ; 
 char read_data(void);

unsigned char id[8];
unsigned char sensor_data_value[2];
unsigned char flag; 

void Delay_nus(uint16 s) {
  while (s--)
  {
    asm("NOP");
    asm("NOP");
    asm("NOP");
    
   
    
  }
}
BYTE init_1820(void) 
{
   unsigned int pp;
  //cli(); 
  SET_OUT; 
  SET_DQ;//输出1
  CL_DQ; 
  Delay_nus(550);//拉低一段时间 
  SET_DQ;//释放 
  SET_IN;//输入 
  Delay_nus(40); //释放总线后等待15-60us
  pp=IN_DQ;
  //while(IN_DQ)  {;}//等待回复 
  if(pp)
  {
  data[12]=0xFF;
  data[13]=0xFF;
  return 0;
  }
  Delay_nus(240);//回复的低电平在60到240us  
  SET_OUT; 
  SET_DQ;//回到初始DQ=1;
  return 1;
 }
void write_1820(unsigned char x)  
{  unsigned char m;    
    SET_OUT;
    for(m=0;m<8;m++)  
    {  
       CL_DQ;
       if(x&(1<<m))    //写数据,从低位开始  
       SET_DQ; 
       else  
       CL_DQ;  
       Delay_nus(40);   //15~60us  
       SET_DQ;  
    }
    //SET_OUT;
    SET_DQ;  
}  
unsigned char read_1820()  
{   unsigned char temp,k,n;    
    temp=0;  
    for(n=0;n<8;n++)  
       {  
      CL_DQ;     
      SET_DQ; 
      SET_IN;  
      k=IN_DQ;    //读数据,从低位开始  
      if(k)  
      temp|=(1<<n);  
      else  
      temp&=~(1<<n);  
      Delay_nus(70); //60~120us      
      SET_OUT;

   }  
   return (temp);  
}  
//搜索ID

 
 char read_data(void)
 {
    unsigned int j,k; 
    unsigned char temh,teml; 
    unsigned char a,b,c;
 
    k=init_1820();  //复位18b20 
    if(k)
    {
      write_1820(0xcc);   // 发出转换命令 搜索器件 
    write_1820(0x44);     //启动 
    for(j=20;j>1;j--)  
    Delay_nus(50000);
    init_1820();  
    write_1820(0xcc);
    //match_rom(serial);   //匹配
    write_1820(0xbe); 
         
    data[13]=read_1820();  //读数据  
    data[12]=read_1820(); 
    return 1;
    }
    else
      return 0;
    
 }


/****************************************************************/









/****************************************************
2、 光照函数 
****************************************************/
void DELAY(uint n)
{
    uint tt;
    for(tt = 0;tt<n;tt++);
        for(tt = 0;tt<n;tt++);
    for(tt = 0;tt<n;tt++);
        for(tt = 0;tt<n;tt++);
        for(tt = 0;tt<n;tt++);
    for(tt = 0;tt<n;tt++);
        for(tt = 0;tt<n;tt++);
        for(tt = 0;tt<n;tt++);
    for(tt = 0;tt<n;tt++);
}
void light_start(void)
{
        
        //P1DIR=0x02;//将P0_0和P1_1设置为输出
        //P0DIR=0x01;
        P0DIR=0x0c;
        DATA=1;
        SCK=1;
        asm("NOP");asm("NOP");asm("NOP");
        asm("NOP");asm("NOP");asm("NOP");
        DATA=0;
        asm("NOP");asm("NOP");asm("NOP");
        asm("NOP");asm("NOP");asm("NOP");
        SCK=0;
        asm("NOP");asm("NOP");asm("NOP");
        asm("NOP");asm("NOP");asm("NOP");
        
}
void light_stop(void)
{
        //P1DIR=0x02;//将P0_0和P1_1设置为输出
        //P0DIR=0x01;
        P0DIR=0x0c;
        DATA=0;
        SCK=0;
        asm("NOP");asm("NOP");asm("NOP");
        asm("NOP");asm("NOP");asm("NOP");
        SCK=1;
        asm("NOP");asm("NOP");asm("NOP");
        asm("NOP");asm("NOP");asm("NOP");
        DATA=1;
        
}
void  light_writebyte(unsigned char ch)

{
        unsigned char i=8;
        //P1DIR=0x02;//将P0_0和P1_1设置为输出
        //P0DIR=0x01;
        P0DIR=0x0c;
        while(i--)
        {
          SCK=0;
          asm("NOP");asm("NOP");asm("NOP");
          asm("NOP");asm("NOP");asm("NOP");
          asm("NOP");asm("NOP");asm("NOP");
          asm("NOP");asm("NOP");asm("NOP");
          if(ch&0x80)
            DATA=1;
          else
            DATA=0;
          ch<<=1;
          asm("NOP");asm("NOP");asm("NOP");
          asm("NOP");asm("NOP");asm("NOP");
          asm("NOP");asm("NOP");asm("NOP");
          asm("NOP");asm("NOP");asm("NOP");
          SCK=1;
          asm("NOP");asm("NOP");asm("NOP");
          asm("NOP");asm("NOP");asm("NOP");
          asm("NOP");asm("NOP");asm("NOP");
          asm("NOP");asm("NOP");asm("NOP");
        }
        SCK=0;//在地八个时钟后,
        asm("NOP");asm("NOP");asm("NOP");
        asm("NOP");asm("NOP");asm("NOP");
        asm("NOP");asm("NOP");asm("NOP");
        asm("NOP");asm("NOP");asm("NOP");
}
int light_waitack(void)
{
    unsigned char errtime=255;
    unsigned int i;
    //P1DIR=0x02;
    //P0DIR=0x00;
    P0DIR=0x08;
    SCK=0;
    asm("NOP");asm("NOP");asm("NOP");
    asm("NOP");asm("NOP");asm("NOP");
    SCK=1;
    for (i=0;i<65535;i++)
    {
      if(DATA==0) 
        break;
       
    }
     if(DATA) 
    return 0;
    P0DIR=0x0c;//在第九个时钟信号后,lightsensor会释放对SDA的控制,如果不在此时将控制权交给cpu,在第九个时钟信号的高电平后,电源会给P0_0口一个高电压
    SCK=0;
    return 1;
}
int light_waitack2(void)
{
    unsigned char errtime=255;
    unsigned int i;
    //P1DIR=0x02;
    //P0DIR=0x00;
    P0DIR=0x08;
    SCK=0;
    asm("NOP");asm("NOP");asm("NOP");
    asm("NOP");asm("NOP");asm("NOP");
    SCK=1;
    for (i=0;i<65535;i++) if(DATA==0) break;
    //P0DIR=0x01;//在第九个时钟信号后,lightsensor会释放对SDA的控制,如果不在此时将控制权交给cpu,在第九个时钟信号的高电平后,电源会给P0_0口一个高电压
    SCK=0;
    return 1;
}
void notack(void)
{
    //P1DIR=0x02;
    P0DIR=0x08;
    asm("NOP");asm("NOP");asm("NOP");
    asm("NOP");asm("NOP");asm("NOP");
    SCK=1;
    asm("NOP");asm("NOP");asm("NOP");
    asm("NOP");asm("NOP");asm("NOP");
    SCK=0;
    
    //P0DIR=0x01;
    P0DIR=0x0c;
    DATA=0;
}
unsigned char readbyte(void)
{
    //P1DIR=0x02;
    //P0DIR=0x00;
    P0DIR=0x08;
    unsigned char i,val=0;
    for (i=0x80;i>0;i/=2)             //shift bit for masking
    { SCK=1;                          //clk for SENSI-BUS
      if (DATA) val=(val | i);        //read bit  
      SCK=0;        			 
    }
     return val;
}

unsigned char writediagram(unsigned char regadr,unsigned char data)
{
  int x;
  light_start();
  light_writebyte(0x88);//设备地址
  asm("NOP");asm("NOP");asm("NOP");
  asm("NOP");asm("NOP");asm("NOP");
  x=light_waitack(); 
   if(x==0)
     return 0;
   else
    {
      asm("NOP");asm("NOP");asm("NOP");
      asm("NOP");asm("NOP");asm("NOP");
      
      light_writebyte(regadr);//寄存器地址
      asm("NOP");asm("NOP");asm("NOP");
      asm("NOP");asm("NOP");asm("NOP");
      light_waitack();  
      asm("NOP");asm("NOP");asm("NOP");
      asm("NOP");asm("NOP");asm("NOP");
      
      light_writebyte(data);//写的数值
      asm("NOP");asm("NOP");asm("NOP");
      asm("NOP");asm("NOP");asm("NOP");

⌨️ 快捷键说明

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