51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机源码 > 详细内容
DS18B20温度显示演示程序(采用C语言编写)
作者:佚名  发布时间:2009/11/27  阅读次数:3040  字体大小: 【】 【】【

开机时对DS18B20进行检测,如果DS18B20检测不正常,蜂鸣器报警,关闭显示。
采用6位数码管显示-用4位数码管显示温度值,2位数码管显示符号。
数码管显示格式:100.8 °C
如果温度值高位为0,将不显示出来。
/******************************************************/
/* ME300B单片机开发系统演示程序 - DS18B20温度显示       */
/* 6位数码管显示                                                                   */
/* 作者: gguoqing                                 */
/*【版权】 www.willar.com     All Rights Reserved                                                         */

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

#include

sbit DQ = P3^3;           //定义DS18B20端口DQ    
sbit BEEP=P3^7 ;

unsigned char presence ;

unsigned char code     LEDData[ ]       = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
                                                                                                                     0x80,0x90,0xff};
unsigned char data     temp_data[2] = {0x00,0x00};
unsigned char data     display[5] =     {0x00,0x00,0x00,0x00,0x00};
unsigned char code     ditab[16] =       {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                                                                                               0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
void beep();
sbit DIN = P0^7;       //小数点
bit     flash=0;                     //显示开关标记

/**********************************************************/
void Delay(unsigned int num)//延时函数
{
     while( --num );
}

/**********************************************************/
Init_DS18B20(void)//初始化ds1820
{
    
           DQ = 1;             //DQ复位
           Delay(8);         //稍做延时

           DQ = 0;             //单片机将DQ拉低
           Delay(90);       //精确延时 大于 480us

           DQ = 1;               //拉高总线
           Delay(8);

           presence = DQ;         //如果=0则初始化成功 =1则初始化失败
           Delay(100);
           DQ = 1;
          
           return(presence); //返回信号,0=presence,1= no presence
}
/**********************************************************/
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);
}

/**********************************************************/
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;
     }
}

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

Read_Temperature(void)//读取温度
{
     Init_DS18B20();
     if(presence==1)                
       { beep();flash=1;}             //DS18B20不正常,蜂鸣器报警
       else
       {
           flash=0;
           WriteOneChar(0xCC);     // 跳过读序号列号的操作
           WriteOneChar(0x44);     // 启动温度转换

           Init_DS18B20();
           WriteOneChar(0xCC);     //跳过读序号列号的操作
           WriteOneChar(0xBE);     //读取温度寄存器

           temp_data[0] = ReadOneChar();       //温度低8位
           temp_data[1] = ReadOneChar();       //温度高8位
       }
}
/*********************************************************/
Disp_Temperature()//显示温度
{
     unsigned char     n=0;

     display[4]=temp_data[0]&0x0f;
     display[0]=ditab[display[4]];           //查表得小数位的值
    
     display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
     display[3]=display[4]/100;
     display[1]=display[4]%100;
     display[2]=display[1]/10;
     display[1]=display[1]%10;

     if(!display[3])                                              //高位为0,不显示

     {
         display[3]=0x0a;                        
         if(!display[2])                                        //次高位为0,不显示
           display[2]=0x0a;
     }

P0 = 0xc6;         //显示 C
P2 = 0x7f;
Delay(300);

P0 = 0x9c;         //显示 °    
P2 = 0xbf;
Delay(300);

P0 =LEDData[display[0]] ;     //显示小数位
P2 = 0xdf;
Delay(300);

P0 =LEDData[display[1]];     //显示个位
DIN = 0;
P2 = 0xef;
Delay(300);

P0 =LEDData[display[2]];     //显示十位
P2 = 0xf7;
Delay(300);

P0 =LEDData[display[3]];     //显示十位
P2 = 0xfb;
Delay(300);

P2 = 0xff;                                                     //关闭显示
}

/*********************************************************/
void beep()
     {
         unsigned char i;
         for (i=0;i<100;i++)
         {
             Delay(60);
             BEEP=!BEEP;                                   //BEEP取反
         }
         BEEP=1;                                                     //关闭蜂鸣器
     }

/*********************************************************/
void main(void)
{
     while(1)
     {
         Read_Temperature();
if(flash==0)                          
{Disp_Temperature();}
else P2 = 0xff ;                       //DS18B20不正常,关闭显示
     }
}

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

  

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号