原创 WJ-V2.0实验板实验例程十一:DS18B20温度传感器

2009-12-13 22:45 1924 7 7 分类: MCU/ 嵌入式

/*********** (C) COPYRIGHT 2009 http://www.wang1jin.com ************
* 文件名称: main.c
* 程序作者: wish_btn
* 程序版本: V1.0
* 编制日期: 12-13-2009
* 功能描述: 数码管显示温度值
* 编译器:Keil C uVision4
* 芯片:STC89C52,11.0592M晶振
* 技术支持:http://www.wang1jin.com
*
* 提供原创51单片机、PROTEL99SE视频教程下载,欢迎大家前往论坛下载。
* 论坛地址: http://www.wang1jin.com/bbs/
******************** http://www.wang1jin.com **********************/


#include <REGX52.H>


sbit DQ = P1^6; //温度传感器引脚
unsigned char LEDDATA[]={
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0x88,/*A*/
0x83,/*b*/
0xC6,/*C*/
0xA1,/*d*/
0x86,/*E*/
0x8E,/*F*/
};
unsigned char Array_Point[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//小数查表


void Delay(unsigned int uiCount); //延时函数
void DisplayOneCharOnAddr(unsigned char Data,unsigned char Addr); //在指定的位置上显示一个数字
void DS18B20_Init(void); //DS18B20初始化
unsigned char DS18B20_ReadOneChar(void); //读取一个数据
void DS18B20_WriteOneChar(unsigned char dat); //写入一个数据
unsigned int DS18B20_ReadTemperature(void); //读取温度


/******************* http://www.wang1jin.com **********************
* 函数名称: main
* 功能描述: main函数,程序入口
* 输入参数: 无
* 返回参数: 无
**********************************************************************/
void main(void)
{
while(1)
{
DisplayOneCharOnAddr((DS18B20_ReadTemperature() >> 4)/100,1);
DisplayOneCharOnAddr((DS18B20_ReadTemperature() >> 4)/10,2);
DisplayOneCharOnAddr((DS18B20_ReadTemperature() >> 4)%10,3);
DisplayOneCharOnAddr(Array_Point[DS18B20_ReadTemperature() & 0x000F],4);
}
}


/******************* http://www.wang1jin.com **********************
* 函数名称: DS18B20_Init
* 功能描述: 初始化函数
* 输入参数: 无
* 返回参数: 无
**********************************************************************/


void DS18B20_Init(void)
{
unsigned char x="0";
DQ = 1; //DQ复位
Delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
Delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x="1则初始化失败"
Delay(20);
}


/******************* http://www.wang1jin.com **********************
* 函数名称: DS18B20_ReadOneChar
* 功能描述: 读一个字节
* 输入参数: 无
* 返回参数: dat
**********************************************************************/


unsigned char DS18B20_ReadOneChar(void)
{
unsigned char i="0";
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}


/******************* http://www.wang1jin.com **********************
* 函数名称: DS18B20_WriteOneChar
* 功能描述: 写一个字节
* 输入参数: dat
* 返回参数: 无
**********************************************************************/


void DS18B20_WriteOneChar(unsigned char dat)
{
unsigned char i="0";
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}


/******************* http://www.wang1jin.com **********************
* 函数名称: DS18B20_ReadTemperature
* 功能描述: 读取温度
* 输入参数: 无
* 返回参数: t
**********************************************************************/


unsigned int DS18B20_ReadTemperature(void)
{
unsigned char a="0";
unsigned char b="0";
unsigned int t="0";
DS18B20_Init();
DS18B20_WriteOneChar(0xCC); // 跳过读序号列号的操作
DS18B20_WriteOneChar(0x44); // 启动温度转换
DS18B20_Init();
DS18B20_WriteOneChar(0xCC); //跳过读序号列号的操作
DS18B20_WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=DS18B20_ReadOneChar();
b=DS18B20_ReadOneChar();
t=b;
t<<=8;
t=t|a;
//t= t/2; //放大10倍输出并四舍五入---此行没用
return(t);
}


/******************* http://www.wang1jin.com **********************
* 函数名称: DisplayOneCharOnAddr
* 功能描述: 在指定的位置上显示一个数字
* 输入参数: Data:指定显示的数据;Addr:指定的位置
* 返回参数: 无
**********************************************************************/
void DisplayOneCharOnAddr(unsigned char Data,unsigned char Addr)
{
switch (Addr)
{
case 1:
P1 = 0xFE;break;
case 2:
P1 = 0xFD;break;
case 3:
P1 = 0xFB;break;
case 4:
P1 = 0xF7;break;
default:
break;
}
if(Addr != 3)
P0 = LEDDATA[Data];
else
P0 = LEDDATA[Data] & 0x7F;
Delay(100);
}


/******************* http://www.wang1jin.com **********************
* 函数名称: Delay
* 功能描述: 延时函数
* 输入参数: uiCount
* 返回参数: 无
**********************************************************************/
void Delay(unsigned int uiCount)
{
while(uiCount--);
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条