Chinaunix首页 | 论坛 | 博客
  • 博客访问: 126707
  • 博文数量: 14
  • 博客积分: 736
  • 博客等级: 军士长
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-27 21:10
文章分类

全部博文(14)

文章存档

2012年(1)

2011年(2)

2009年(11)

我的朋友

分类:

2009-11-05 20:26:50

电路实物图如下图所示:

电路原理图如下图所示:

 

C语言程序如下所示:

/********************************************************************

* 程序名;  基于DS18B20的测温系统

*   能: 实时测量温度,超过上下限报警,报警温度可手动调整。K1是用来

* 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限

* 调节模式。在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动

* 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;在调节上下限

* 温度模式下,K2是实现加1功能,K1是实现减1功能,K3是用来设定上下限温

* 度正负的。         

* 编程者:ZPZ

* 编程时间:2009/10/2                  

*********************************************************************/

#include

#include

#define uint unsigned int        

#define uchar unsigned char

 

uchar max_int=0x00,max_dot=0x00,min_int=0x00,min_dot=0x00;

 

bit   s=0,s1=0;

                    

#include"ds18b20.h"

#include"keyscan.h"

#include"display.h"

 

/***********************主函数************************/

void main()

{

          beer=0;

          led=1;

          IT1=1;

          EX1=0;

          EA=1;

          timer1_init(0);

          get_temperature(1);   

          while(1)

          {    

                    keyscan();

                    get_temperature(0);

                    keyscan();

                    display(temp,temp_d*0.625);

                    alarm();

                    keyscan();                           

          }

}  

/********************************************************************

* 程序名;  __ds18b20_h__

*   能: DS18B20c51编程头文件        

* 编程者:ZPZ

* 编程时间:2009/10/2

*   明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d

* (测得的温度小数部分),标志位f(测量温度的标志位0表示正温度”‘1

* 负温度),标志位f_max(上限温度的标志位0表示正温度1

* 负温度),标志位f_min(下限温度的标志位0表示正温度1

* 负温度),标志位w(报警标志位1启动报警0关闭报警)                 

*********************************************************************/

#ifndef __ds18b20_h__

#define __ds18b20_h__

 

#define uint unsigned int        

#define uchar unsigned char

 

sbit    DQ= P2^3;

sbit    beer=P3^0;                                

sbit    led=P3^1;

uchar   temp=0;                              //温度的整数部分

uchar   temp_d=0;                   //温度的小数部

uchar   n;

bit    f=0,f_max=0,f_min=0;w=0;

/***********************延时子函数************************/

void ds18b20_delayus(uint t)

{

   while(t--);

}

 

void ds18b20_delayms(uint t)

{

         uint i,j;

         for(i=t;i>0;i--)

    for(j=120;j>0;j--);

}

/******************ds18b20初始化函数*********((*********/

void ds18b20_init()                                           // DS18B20初始化

{

         DQ=1;

         DQ=0;                                                          //控制器向DS18B20发低电平脉冲

         ds18b20_delayus(30);               //延时480μs

         DQ=1;                                                               //控制器拉高总线,

         while(DQ);                                                     //等待DS18B20拉低总线,在60-240μs之间

         ds18b20_delayus(20);                    //延时,等待上拉电阻拉高总线

         DQ=1;                                                               //提升数据线,准备数据传输;

}

 

/******************ds18b20字节读函数******************/

uchar ds18b20_read()                                      //DS18B20 字节读取

{

         uchar i;

         uchar d = 0;

         DQ = 1;                                                             //准备读;

         for(i=8;i>0;i--)

         {      

             d >>= 1;                    //低位先发;

                   DQ = 0;                                                                               

                   _nop_();

                   _nop_();

                   _nop_();                                

                   DQ = 1;                                                    //必须写1,否则读出来的将是不预期的数据;

                   if(DQ)                                                      //12us处读取数据;

                            d |= 0x80;

                   ds18b20_delayus(10);          

                   }

         return d;    

}

 

/******************ds18b20字节写函数******************/

void ds18b20_write(uchar d)                                      // ds18b20字节写

{

     uchar  i;

     for(i=8;i>0;i--)

     {       

                     DQ=0;

                     _nop_();

                     _nop_();

                     _nop_();

                     DQ=d&0x01;

                     ds18b20_delayus(5);

                     DQ=1;  

                    d >>= 1;        

     }

}

 

......

 

完整程序,请参看附件:

 

 
文件: 基于DS18B20传感器的数字温度计设计.rar
大小: 222KB
下载: 下载
阅读(2820) | 评论(6) | 转发(0) |
给主人留下些什么吧!~~

韩东旭19882012-05-27 09:06:24

请问,key4,v,v1,v2起到什么作用?谢谢

chinaunix网友2011-05-11 09:18:07

程序是以前做的课程设计,有BUG但在实物上是可以运行的,该程序在仿真中不能用。把#ifndef __ds18b20_h__到#endif部分重新复制到一个ds18b20.h,同样把#ifndef __keyscan_h__到#endif部分重新复制到一个keyscan.h,同样把#ifndef __display_h__到#endif部分重新复制到一个display.h。不要把所有的程序复制到一个.c文件中,这样编译肯定出错。

chinaunix网友2011-05-09 09:16:35

程序怎么有错阿?

chinaunix网友2011-02-15 11:57:14

s和s1是全局的位变量。在程序中做标志位来用,当s,s1等于0或等于1时,会分别执行不同条件下的程序。谢谢你关注我的博客,欢迎交流学习。呵呵

chinaunix网友2010-12-27 20:29:04

请问一下,你程序中的S和s1分别代表什么含义?