📄 ds18v20.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 + -