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

📄 ds18v20.c

📁 在EASY_ARM 2103上调试通过的DS18B20温度传感器
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Shandong University ISE School.
**                                      ISE  MCU LAB
**                                 http://www.ise.sdu.edu.cn
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2008-08-22
** Last Version:		2.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			bailiang 
** Created date:		2008-08-21
** Version:				2.0
** Descriptions:		The original version
**
********************************************************************************************************/
#include "config.h"

#define DAOUT_1 IO0SET=(1<<3);         // 设置连接的I/O为P0.25,不同的连接方式需要修改
#define DAOUT_0 IO0CLR=(1<<3);         // 设置连接的I/O为P0.25,不同的连接方式需要修改
#define DAIN    IO0PIN                  // 读数的口,其实只是为了读P0.25这位,在后面对其它位进行了屏蔽

uint8 TEMP0;                            // 温度的小数点位,已经转化后为十进制数
uint8 TEMP1;                            // 温度的个位,已经转化后为十进制数
uint8 TEMP_Flag;                        // 温度的符号位
uint8 uiRcvData;                    /*  串口接收数据         */

void delay_5us(unsigned int count);    //表示延时5us的函数,不用晶震可以在Keil软件仿真下重新测试改写使其达到延时5us
void delay_1us(unsigned long int t);   //表示延时1us的函数,不用晶震可以在Keil软件仿真下重新测试改写使其达到延时1us
void tmreset (void);                   //DS18B20重新启动
int tmpread (void);                    //表示读一位,不是一个字节
unsigned char tmpread2 (void);         //表示读一个字节,由tmpread循环构成
void tmpwrite (unsigned char dat);     //表示写地址一个字节
void tmpchange(void);                  //表示启动DS18B20转化
void tmp (void);                       //表示开始读DS18B20

/*********************************************************************************************************
** Function name:		DelayNS
** Descriptions:		延时函数
** input parameters:    uiDly   值越大,延时时间越长
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void DelayNS (uint32 uiDly)
{
    uint32 i;
    
    for (; uiDly > 0; uiDly--){
        for(i = 0; i < 50000; i++);
    }
}

void gettemper(void)
{
    PINSEL0 = PINSEL0 & (~0x0F);                                        
    PINSEL0 = PINSEL0 | 0x05;                                           /*  设置I/O连接到UART           */

    //U0FCR = 0x81;                                                       /*  使能FIFO,设置8个字节触发点 */
    //U0IER = 0x01;                                                       /*  使能接收中断                */
    
      tmpchange();      // 开始温度转换
      delay_5us(200);
      delay_5us(200);
      delay_5us(200);
      delay_5us(200);  
      delay_5us(200);
      delay_5us(200);           // 读取延时
      tmp();          //读取温度      

}

void delay_5us(unsigned int count)      //在keil下测试该程序的延时时间大约在5us左右 
{         
  unsigned int i;  
  while (count) 
  {
    i =32;
    while (i>0) i--;
    count--;
    }
  }
                                    
  void delay_1us(unsigned long int t)    //在keil下测试该程序的延时时间大约在1us左右 
    {
    unsigned long int i;
    unsigned long int j;
    j=11059200/1000000*t;
    for(i = 0; i < j; i++);
    }

void tmreset (void)      // 发送复位和初始化
{
  char presence=1;
  while(presence)
  {
   while(presence)
   {
   IO0DIR=(1<<3);              //I/O口P0.25引脚为输出引脚
   DAOUT_1;
   delay_1us(2);                //延时2us左右
   DAOUT_0;
   delay_5us(110);              //延时550us左右
   DAOUT_1;
   delay_5us(12);               //延时60us左右
   IO0DIR=IO0DIR&(~(1<<3));    //I/O口P0.25引脚为输入引脚,不用的连接口需要重新修改
   presence=DAIN;
   presence=presence&(1<<3);    //不用的连接口需要重新修改,修改25这个数
   }
   delay_5us(100);              //延时500us
   IO0DIR=IO0DIR&(~(1<<3));    //I/O口P0.25引脚为输入引脚,不用的连接口需要重新修改
   presence=DAIN;
   presence=~presence;
   presence=presence&(1<<3);   //不用的连接口需要重新修改,修改25这个数
   }
}

int tmpread (void)      // 读取数据的一位
{
  int dat;
  dat = 0;
  IO0DIR=(1<<3);                       //I/O口P0.25引脚为输出引脚,不用的连接口需要重新修改
  DAOUT_1;
  delay_1us(2); 
  DAOUT_0;
  delay_1us(3);
  DAOUT_1;
  delay_1us(3); 
  IO0DIR=IO0DIR&(~(1<<3));             //I/O口P0.25引脚为输入引脚,不用的连接口需要重新修改                                
  dat = DAIN; 
  delay_5us(12);                        //延时60us左右
  return (dat);
}

unsigned char tmpread2 (void)       //读一个字节
{
  unsigned char i,dat;
  int j=0; 
  dat = 0; 
  for (i=1;i<=8;i++)
  {
    j = tmpread (); 
    j = (j>>3)&0x01;                    //不用的连接口需要重新修改,修改25这个数
    dat = (j<<7) | (dat >> 1);
  }
  IO0DIR=(1<<3);                        //I/O口P0.25引脚为输出引脚,不用的连接口需要重新修改
  DAOUT_1;
  return (dat);
} 

void tmpwrite (unsigned char dat)    //写一个字节
{  
  unsigned char j;
  int testb;
  IO0DIR=(1<<3);                         //I/O口P0.25引脚为输出引脚,不用的连接口需要重新修改
  for (j=1;j<=8;j++)
   {  
     testb = dat & 0x01;
     dat = dat >> 1; 
     if (testb)
      { 
         DAOUT_1;    // 整个函数为 写1
         delay_1us(2);          // 延时2us
         DAOUT_0;
         delay_1us(4);          // 延时4us
         DAOUT_1;   
         delay_5us(14);         //延时70us
      }
        else 
          {
           DAOUT_1;    // 整个函数为 写0
           delay_1us(2);        // 延时2us
           DAOUT_0;
           delay_1us(4);        // 延时4us
           DAOUT_0;   
           delay_5us(14);         //延时70us;
          }
      }
      DAOUT_1; 
      delay_1us(1);             //延时1us
}

void tmpchange(void)      // ds1820 开始转换
{ 
  tmreset ();       // 复位
  tmpwrite (0xcc);      // 跳过序列号命令
  tmpwrite (0x44);       // 发转换命令 44H, 
  }

void tmp (void)       // 读取温度
{
  unsigned char a,b;
  tmreset ();       // 复位
  tmpwrite (0xcc);       // 跳过序列号命令
  tmpwrite (0xbe);       // 发送读取命令
  a = tmpread2 ();      // 读取低位温度 
  b = tmpread2 ();          //读取高位温度 
  if(b>127)
  {
    a =256-a;
    b =256-b;
    TEMP_Flag =1;                       //为负数时,将TEMP_Flag =1
  }
  else
  {
    TEMP_Flag =0;                       //为正数时,将TEMP_Flag =0
  }
  TEMP0=a & 0x0f;                       //存放小数部分
  TEMP1=((a>>4)& 0x0f)|((b & 0x07)<<4); //存放整数部分,并将整数移位后变成10进制数
}    


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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