• PUDN用户
    了解作者
  • C/C++
    开发工具
  • 4KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 41
    下载次数
  • 2009-05-17 11:49
    上传日期
ds18b20的keil c 编程 实现了温度的采集 并用数码管显示 有温度报警功能
ds18b20.rar
  • ds18b20的驱动.txt
    11.7KB
内容介绍
温度传感器DS18B20驱动upsd单片机的C51源程序 By 西谱单片机 发表于 2006-4-20 19:10:13 #i nclude "upsd3200.h" #i nclude"intrins.h" sbit DQ= P1^7; char WEN_ZERO=0; bit flag; //DS18B20器件是否正常标志 extern uint wendu; ///////////////延时////////////////// void delay (uint us) { while (us--); } //////////////DS18B20初始化--外部调用////////// void init_18b20 (void) { DQ=1; _nop_(); DQ=0; delay(90); //delay 530 uS DQ=1; delay(6); //delay 100 uS if(DQ==0) flag=1; //detect 1820 success! else flag=0; //detect 1820 fail! delay(20); DQ=1; } /////////////DS18B20写////////////// void write (uchar wr) { uchar i; for (i=0;i<8;i++) { DQ=0; _nop_(); DQ=wr&0x01; delay(5); //delay 45 uS DQ=1; wr>>=1; } } /////////////DS18B20读///////////////// uint read_word (void) { uchar i; uint u=0; for(i=0;i<16;i++) { DQ=0; u>>=1; DQ=1; if(DQ==1) u|=0x8000; delay (4); } return(u); } /* ///////DS18B20寄存器配置--外部调用/////////// void config (void) { if(flag) { write (0xcc); //跳过ROM命令 write (0x4e); //写暂存存储器 write (0x19); //TH=0 write (0x1a); //TL=0 write (0x7f); //set 11 bit (0.125) init_18b20(); write (0xcc); //跳过ROM命令 write (0x48); //复制暂存存储器,在发出此命令之后,主机必须等待6ms,以待复制操作的完成 init_18b20(); write (0xcc); //跳过ROM命令 write (0xb8); //recall delay (254); delay (250); init_18b20(); write (0xcc); write (0xbe); //读暂存存储器命令 one=read_word(); two=read_word(); three=read_word(); } } */ ///////////读取温度--外部调用//////////////// void get_wendu (void) { uint bdata tem; init_18b20(); if (flag) { write (0xcc); //跳过ROM命令 write (0x44); //启动温度转换 init_18b20 (); write (0xcc); //跳过ROM命令 write (0xbe); //读暂存存储器命令 tem=read_word(); //读取温度 if(tem<0x8000) { wendu=tem*6.25; //温度大于0; WEN_ZERO=0; } else { wendu=tem*(-0.0625); //温度小于0; WEN_ZERO=1; } //write (0xec); //search alarm } } 3.驱动程序 /********************数码管显示DS18B20 温度与报警控制****************** *作者:☆华仔☆ QQ:656037228 欢迎交流 *时间:2008年12月04日 *更新时间:2008年12月15日晚 ----------------------------------------------- *主要功能: 正常的温度显示、报警控制。 ----------------------------------------------- *显示格式: 102.8°C 或 -21.3°C ----------------------------------------------------------------------- *电路连接: 采用STC12C2052单片机,24兆赫晶振(其他频率晶振,只要修改延时就可以了), 用5位8段数码显示管, 4位显示温度(包括显示零下温度符号“-”),1位用作符号“°C”(倒放) ----------------------------------------------------------------------- *DS18B20 端口位定义: DQ → P3^5 ; 数据传送总线 ----------------------------------------------- BEEP → P3^7 ;蜂鸣器 PORT → P1 ;数码管数据总线 ----------------------------------------------- *显示方式: 数码管动态扫描 ---------------------------------------------------------------- *报警方式: 在DS18B20检测出错或超出规定的温度范围报警, 报警时数码管闪动显示数字,在DS18B20检测出错时闪动显示ERROR ---------------------------------------------------------------- *****************下面是C51源程序********************/ //#include < reg51.h > //8051头文件 #include "STC12C2052AD.h"//2051头文件 //#include < intrins.h > #define uchar unsigned char; #define uint unsigned int; typedef bit BOOL; #define PORT P1 //数码管显示数据总线 sbit DQ = P3^5; //DS18B20数据总线 sbit BEEP=P3^7 ; //蜂鸣控制端 BOOL FLAG ;//初始化标志 BOOL ZF_FLGE; void NoTemp();//DS18B20出错 uchar code DISData[12] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};//共阳数码管编码表*/ /*uchar code DISData[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //共阴数码管编码表*/ uchar data temp_data[2] = {0x00,0x00};//温度数据寄存,存放格式【低位,高位】 uchar data display[5] = {0x00,0x00,0x00,0x00,0x00};//存放编辑,存放格式【小数位,个位,十位,百位,编辑位】 uchar code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05, 0x05,0x06,0x07,0x07,0x08,0x08,0x09,0x09};//小数值 sbit DIN = P1^7;//小数点 BOOL flash=0;//显示开关标记 /******************************************************** *名称:Delay() *功能:微妙级延时 *********************************************************/ void Delay(unsigned int Dtime)//延时函数 { while( --Dtime ); } /******************************************************** *名称:Delayms() *功能:毫秒级延时 *********************************************************/ void Delayms(unsigned int Dtime) { unsigned char j; for (; Dtime>0; Dtime--) { for (j=0; j<125; j++){;;} } } /******************************************************** *名称:beep() *功能:蜂鸣 *********************************************************/ void beep() { BEEP=0; //BEEP取反 Delayms(500); BEEP=1; //关闭蜂鸣器 } /******************************************************** *名称:Init_DS18B20() *功能:初始化DS18B20, *调用:Delay(); *返回值:FLAG *********************************************************/ Init_DS18B20(void)//初始化ds1820 { DQ = 1; //DQ复位 Delay(20);//稍做延时 DQ = 0;//单片机将DQ拉低 Delay(200); //精确延时 大于 480us DQ = 1; //拉高总线 Delay(20); FLAG = DQ; //如果=0则初始化成功 =1则初始化失败 Delay(240); DQ = 1; return(FLAG); //返回信号,等于0初始化成功,等于1则初始化失败 } /******************************************************** *名称:ReadOneByte() *功能:从DS18B20读出1字节数据 *调用:Delay(); *返回值:dat *********************************************************/ ReadOneByte(void)//读一个字节 { unsigned char i = 0; unsigned char dat = 0; for (i = 0; i < 8; i++) { DQ = 0; // 脉冲信号 dat = dat>>1; DQ = 1; // 脉冲信号 if(DQ) dat |= 0x80; Delay(10); } return (dat); } /******************************************************** *名称:WriteOneByte() *功能:往DS18B20写入1字节数据 *调用:Delay(); *返回值:无 *********************************************************/ void WriteOneByte(unsigned char dat)//写一个字节 { unsigned char i = 0; for (i = 8; i > 0; i--) { DQ = 0;// 脉冲信号 DQ = dat&0x01;//LSB在前 Delay(12); DQ = 1;// 脉冲信号 dat>>=1; } } /******************************************************** *名称:Read_Temp() *功能:读取DS18B20温度数据 *调用:Init_DS18B20(); WriteOneByte(); ReadOneByte(); *返回值:无 *********************************************************/ Read_Temp(void)//读取温度 { Init_DS18B20();//初始化DS18B20 if(FLAG==1) //等于1初始化失败 { //beep();//DS18B20不正常,蜂鸣器报警 flash=1;//返回不正常标志 } else { flash=0;//返回显示标志 WriteOneByte(0xCC); // 跳过ROM匹配操作 WriteOneByte(0x44); // 启动温度转换 Init_DS18B20();//读温度前先复位 WriteOneByte(0xCC); //跳过ROM匹配操作 WriteOneByte(0xBE); //读取温度寄存器 temp_data[0] = ReadOneByte(); //温度低8位 temp_data[1] = ReadOneByte(); //温度高8位 } } /********************************************************* *名称:Edit_bit() *�
评论
    相关推荐