//给你一个LPC2103的,修改一下即可,12M晶体.主频60M
#include "LPC2103.h"
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef unsigned int BOOL;
//------------------------------------------------------------------
//参数设置区
//------------------------------------------------------------------
#define DQ 1 << 7 // P0.7 控制 读取温度
//函 数: delay1u
//功 能: 延时t uS
//输 入: unsigned long t
//输 出: 无
//全局变量: 无
//调用模块: 无
void delay1u(unsigned long t)
{
T1PR = 0x00000000; //Load prescaler
T1TCR = 0x00000003; //Reset counter and prescaler
T1MCR = 0x00000003; //On match reset the counter and generate an interrupt
T1MR0 = t*0x0f; //Set the cycle time
T1TCR = 0x00000001; //enable timer
while((T1IR & 0x01) == 0);
T1IR = 0x01;
T1TCR = 0x00000000;
}
//-------------------------------------------------
// DS18B20温度读取部分
//-------------------------------------------------
//函 数: Init_DS18B20
//功 能: DS18B20初始化设置
//输 入: 无
//输 出: 无
//全局变量: 无
//调用模块: 无
BYTE Init_DS18B20(void)
{
IODIR |= DQ;
IOSET = DQ;
delay1u(48); //稍做延时
IOCLR = DQ; //将DQ拉低
delay1u(650); //精确延时 大于 480us 480
IODIR = IODIR&(~DQ); //拉高总线输入
delay1u(80); //64
//num = IOPIN&DQ; //稍做延时后 如果x!=0则初始化失败 x=0则初始化成功
if(IOPIN&DQ==0)
{
num=0;
}
else
{
num=1;
}
delay1u(200); //300
return num;
}
//函 数: WriteOneChar
//功 能: 向DS18B20写一个字节
//输 入: BYTE dat
//输 出: 无
//全局变量: 无
//调用模块: 无
void WriteOneChar(BYTE dat)
{
BYTE i=0;
for (i=8; i>0; i--)
{
IODIR |= DQ; //改回输出
IOCLR = DQ;
delay1u(2);
if(dat&0x01)
{
IODIR &= (~DQ); //释放总线
}
else
{
IOCLR = DQ;
}
delay1u(60);
IODIR &= (~DQ); //改回输入
delay1u(2);
dat>>=1;
}
}
//函 数: ReadOneChar
//功 能: 从DS18B20读一个字节
//输 入: 无
//输 出: BYTE dat
//全局变量: 无
//调用模块: 无
BYTE ReadOneChar(void)
{
BYTE i=0;
BYTE dat = 0;
for (i=8;i>0;i--)
{
dat>>=1;
IODIR |= DQ; //改回输出
IOCLR = DQ; // 给脉冲信号
delay1u(2);
IODIR = IODIR&(~DQ); // 拉高总线输入
delay1u(12);
if(IOPIN&DQ)
dat|=0x80;
delay1u(60);
}
return dat;
}
//函 数: read_temp
//功 能: 读温度值
//输 入: 无
//输 出: 无
//全局变量: 无
//调用模块: 无
//****延时中不能一直处于等待中断中间不能做任何事情***/
unsinged int Get_Temp(void)
{
unsigned int temp;
unsigned char num1;
unsigned char a=0; //温度值低位
unsigned char b=0; //温度值高位
num0 = Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay1u(900000); // 延时0.9S
num1 = Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0xBE); // 读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
temp=(b<<4)|(a>>4);
return(temp);
}
int main(void)
{
unsigned int Temp_Data;
Temp_Data=Get_Temp();
}
}
|