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

当前位置:首页 > 单片机源码 > 详细内容
DS18B20温度显示演示C程序(6位数码管显示)
发布时间:2009/6/2  阅读次数:1411  字体大小: 【】 【】【
开机时对DS18B20进行检测,如果DS18B20检测不正常,蜂鸣器报警,关闭显示。

采用6位数码管显示-用4位数码管显示温度值,2位数码管显示符号。

数码管显示格式:100.8 °C

如果温度值高位为0,将不显示出来。
#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号