|
#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);
}
}
}