注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
WG0420的个人空间 https://home.eeworld.com.cn/space-uid-653956.html [收藏] [复制] [分享] [RSS]
日志

tivaware-tmc123gh6pm-ds18b20

已有 1510 次阅读2015-11-21 13:31 |个人分类:TIM4


#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/pin_map.h"
#include "driverlib/gpio.h"
#include "driverlib/ssi.h"
#include "driverlib/sysctl.h"
#include "driverlib/fpu.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "utils/uartstdio.h"
#include "driverlib/interrupt.h"
#include "inc/hw_ints.h"
#include "driverlib/uart.h"

#define DS18B20_PORT_BASE        GPIO_PORTA_BASE
#define DS18B20_PIN              GPIO_PIN_3
#define DS18B20_1                GPIOPinWrite(DS18B20_PORT_BASE,DS18B20_PIN, DS18B20_PIN)
#define DS18B20_0                GPIOPinWrite(DS18B20_PORT_BASE,DS18B20_PIN, 0)
#define DS18B20_Val              GPIOPinRead (DS18B20_PORT_BASE, DS18B20_PIN)
#define DS18B20_Input            GPIOPinTypeGPIOInput(DS18B20_PORT_BASE, DS18B20_PIN)
#define DS18B20_Output           GPIOPinTypeGPIOOutput(DS18B20_PORT_BASE, DS18B20_PIN)


void Delay1ms(unsigned long y)
{
  SysCtlDelay(SysCtlClockGet()/(3000/y));
}

void Delay1us(unsigned long y)
{
   SysCtlDelay(SysCtlClockGet()/(3000000/y));
}

unsigned char DS18B20_Init()
{

    DS18B20_Output;

    unsigned long i=0;
    DS18B20_1;
    Delay1us(15);
    DS18B20_0;    //将总线拉低480us~960us
    Delay1us(600);
    DS18B20_1;   //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
    Delay1us(15);
    DS18B20_Input;
     while(DS18B20_Val) //等待DS18B20拉低总线
    {
     i++;
     if(i>5000)

         {
          // UARTCharPut(UART1_BASE, 'f');
         return 0;//初始化失败
         }
    }
    Delay1us(300);
    DS18B20_Output;
    DS18B20_1;
    Delay1us(2);
   return 1;//初始化成功
}

/*******************************************************************************
* 函数名         : Ds18b20WriteByte
* 函数功能     : 向18B20写入一个字节
* 输入           : com
* 输出           : 无
*******************************************************************************/

void DS18B20_WriteByte(unsigned char dat)
{
 unsigned long j;
        DS18B20_Output;
 for(j=8;j>0;j--)
 {
  DS18B20_0;   //每写入一位数据之前先把总线拉低1us
  Delay1us (3);
  if (dat&0x01)           //然后写入一个数据,从最低位开始
                  DS18B20_1;
                else
                  DS18B20_0;

                Delay1us (65);           //持续时间最少60us

      DS18B20_1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
                Delay1us (2);
                dat>>=1;
 }
}

/*******************************************************************************
* 函数名         : DS18B20_ReadByte
* 函数功能     : 读取一个字节
* 输入           : com
* 输出           : 无
*******************************************************************************/


unsigned char DS18B20_ReadByte()
{
 unsigned char dat=0;
 unsigned long j;

 for(j=8;j>0;j--)
 {


          dat >>= 1;
    DS18B20_0;//先将总线拉低1us
  Delay1us (2);
  DS18B20_1;
    DS18B20_Input; //然后释放总线
  Delay1us (15);//延时等待数据稳定

   if (DS18B20_Val)
  {
      dat |= 0x80;
    }
    Delay1us (45);
    DS18B20_Output;
    DS18B20_1;

 }
 return dat;
}


/*******************************************************************************
* 函数名         : Ds18b20ReadTemp
* 函数功能          : 读取温度
* 输入           : com
* 输出           : 无
*******************************************************************************/

signed long DS18B20_GetTemp()
{
 unsigned long temp=0;
 unsigned char tmh,tml;

        DS18B20_Init();
  Delay1ms(1);
  DS18B20_WriteByte(0xcc);  //跳过ROM操作命令
  DS18B20_WriteByte(0x44);         //温度转换命令
 // Delay1ms(500);     //wait for invertion

  DS18B20_Init();
  Delay1ms(1);
  DS18B20_WriteByte(0xcc);  //跳过ROM操作命令
  DS18B20_WriteByte(0xbe);  //发送读取温度命令

  tml=DS18B20_ReadByte();  //读取温度值共16位,先读低字节
  tmh=DS18B20_ReadByte();  //再读高字节
  temp=tmh;
  temp<<=8;
  temp|=tml;
  return temp;
}
/*
DS18B20在上面已经转化完全,下面部分为ds18B20输出
*/


void UART_init(unsigned temp)//配置通信串口
{


 SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
 GPIOPinConfigure(GPIO_PA0_U0RX);
 GPIOPinConfigure(GPIO_PA1_U0TX);
 GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0|GPIO_PIN_1);
 UARTConfigSetExpClk(UART0_BASE,SysCtlClockGet(),9600,
   (UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE));

 UARTCharPut(UART0_BASE,temp);


}

int DS18B20_OUTPUTdata(float fdat)//输出温度值
{

     char temp=0;
  unsigned char b,l;


     temp=fdat;

  b=temp/10;
  l=temp%10;


   UART_init(b+48);
   UART_init(l+48);
return 0;
}

void UART_Send_Str(unsigned char *s)//输出字符
{
 int i=0;
 while(s[i]!=0)
 {
  UART_init(s[i]);
  i++;
 }

}

void UART_Send_END(void)   //结束符
{
 UART_init(0xFF);
 UART_init(0xFF);
 UART_init(0xFF);
}





void main (void)
   {
 float fdat=0;

    FPULazyStackingEnable();
  SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL |SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);


     SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
     GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_1);
     SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能A口
     //GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1,GPIO_PIN_1);



  while(1)
  {

    fdat=(float)DS18B20_GetTemp()/16;


   UART_Send_Str("t0.txt=");//输出字符
    UART_init(34);//输出引号"ASCLL码34
      DS18B20_OUTPUTdata(fdat);//输出温度值
      UART_init(34);//输出引号"
      UART_Send_END();//结束符
      UART_Send_Str("j0.val=");

            DS18B20_OUTPUTdata(fdat);

            UART_Send_END();
            UART_Send_Str("t2.txt=");//输出字符
                UART_init(34);//输出引号"ASCLL码34
                UART_Send_Str("湖北民族学院科技学院-吴刚");//输出温度值
                  UART_init(34);//输出引号"
                  UART_Send_END();//结束符
      if(fdat>20)
      {
      GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1,GPIO_PIN_1);
      }
      else
      {
         GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1,0);
      }


   }

}

全部作者的其他最新日志
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章