基于STC89C52和DS18B20的温度检测装置设计 下载本文

读出温度子程序 读出温度子程序的主要功能是读出RAM中的9字节。在读出时须进行CRC校验,校验有错时不进行温度数据的改写。 流程图如下:

温度转换命令子程序 温度转换命令子程序主要是发温度转换开始命令。当采用12位分辨率时,转换时间约为750ms。在本程序设计中,采用1s显示程序延时法等待转换的完成。 流程图如下:

8

DS18B20温度采集、转换程序:

#include #include \#include\#define uchar unsigned char #define uint unsigned int

sbit DS=P1^0; //定义接口 uint temp; //温度变量 uchar flag1; //接收标志位 extern delay_nms(uint nms);

//*********************************** //功能:串行口初始化,波特率9600,方式1

void Init_Com(void) {

TMOD = 0x20; //设定T1定时器的工作方式2 PCON = 0x00; //波特率不加倍 TH1 = 0xFd; //T1定时器装初值 TL1 = 0xFd;

TR1 = 1; //启动T1定时器

9

REN=1; //允许接受串行口

SM0=0; //设定串口工作方式1 即8位异步通讯 SM1=1;

tmpchange(); //读一次温度,防止运行程序时读出85摄氏度 delay_nms(400); //85度不显示(用延时跳过) }

//*********************************** //DS18B20复位,初始化函数

void dsreset(void) { uint i;

DS=0; //数据线拉到低电平0

i=103; //延时850us(该时间范围可以在480~960us) while(i>0) i--;

DS=1; //数据线拉到高电平1

i=4; //延时等待(如果初始化成功则在15—60ms内产生一个由DS18B20返回的低电平0,据该状态可以确定它的存在) while(i>0) i--; }

//*********************************** //读1位数据函数

bit tmpreadbit(void) { uint i;

bit dat; //设置一位数据 DS=0;

i++; //i++ 起延时作用 DS=1; i++;i++;

10

dat=DS; i=8;while(i>0)i--; return (dat); }

//*********************************** //读1字节函数

uchar tmpread(void) {

uchar i,j,dat; dat=0;

for(i=1;i<=8;i++) {

j=tmpreadbit();

dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里 }

return(dat); }

//*********************************** //向DS18B20写一个字节数据函数

void tmpwritebyte(uchar dat) { uint i; uchar j; bit testb; for(j=1;j<=8;j++) {

testb=dat&0x01; dat=dat>>1; if(testb) //写 1 { DS=0;

11