久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4353|回復: 3
打印 上一主題 下一主題
收起左側

ds18b20單片機溫控程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:77367 發表于 2015-4-19 03:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg51.h>       //調用51單片機的頭文件
#include <Intrins.h>
sbit ds18b20=P3^7;
sbit OK=P3^6;
unsigned char TT,temp1,num,TL=20,TH=27;
unsigned char temp,temp2,key,dat;
unsigned char  code tabcc[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};//共陰極
unsigned char  code tabca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00};//共陽極
//---------------------------------------
//名稱:復位DS18B20函數
//---------------------
void delay(int ms)
{
  int i;
  while(ms--)
   for(i=0;i<120;i++);
}
//---------------------------------------
//名稱:復位DS18B20函數
//---------------------
bit Reset(void)
{
   unsigned int i;
   bit k;
   ds18b20=0;            //拉低DQ總線開始復位
   i=95;          //保持DQ低大約870uS,符合不低于48US的要求
   while(i--);        //保持DQ低大約870uS,符合不低于48US的要求
                     //保持DQ低大約870uS,符合不低于48US的要求     
   ds18b20=1;        //拉高準備接收數據   
   i=9;         //大約80uS后
   while(i--);        //大約80uS后
                //大約80uS后
   k=ds18b20;          //讀出數據并保存   
   i=55;          //維持約490US,符合總讀時隙不低于480US的要求
   while(i--);        //維持約400US,符合總讀時隙不低于480US的要求
                 //維持約400US,符合總讀時隙不低于480US的要求
   return k;               //k=0為復位成功,k=1為復位失敗
}
//---------------------------------------
//名稱:讀一字節函數
//---------------------------------------
unsigned char ReadByte(void)
{
unsigned int i;
   unsigned char j,buf=0;
   for(j=0;j<8;j++)   //接收8次還原一個字節數據
   {
  buf=buf>>1;     //接收前,想將接收緩沖區右移
  ds18b20=0;     //拉低      
        _nop_();         //維持2US,符合大于1US小于15US的規范
        _nop_();         //維持2US,符合大于1US小于15US的規范        
        ds18b20=1;      //拉高,為讀數據做準備
  _nop_();         //維持6US,符合大于1US小于15US的規范
        _nop_();         //維持6US,符合大于1US小于15US的規范
        _nop_();         //維持6US,符合大于1US小于15US的規范
     _nop_();         //維持6US,符合大于1US小于15US的規范
  _nop_();         //維持6US,符合大于1US小于15US的規范
        _nop_();         //維持6US,符合大于1US小于15US的規范
        _nop_();         //維持6US,符合大于1US小于15US的規范   
  if(ds18b20==1)
       buf|=0x80;  //讀出1位數據保存于buf中
    i=7;       //維持約52US,符合總讀時隙不低于60US的要求
          while(i--);     //維持約52US,符合總讀時隙不低于60US的要求
                   //維持約52US,符合總讀時隙不低于60US的要求
}
   return buf;             //退出的同時將接收緩沖區參數返回
}
//---------------------------------------
//名稱:寫一字節函數
//---------------------------------------
void WriteByte(unsigned char dat)
{
unsigned int i;
    unsigned char j;
    for(j=0;j<8;j++)
     {            
  if(dat&0x01)   //如果寫1
         {      
      ds18b20=0;    //拉低      
            _nop_();        //維持2US,符合大于1US小于15US的規范
            _nop_();        //維持2US,符合大于1US小于15US的規范
            ds18b20=1;     //拉高        
            i=7;      //維持約63US,符合不低于60US的要求
            while(i--);    //維持約63US,符合不低于60US的要求         
      }
      else      //如果寫0
         {            
   ds18b20=0;    //拉低         
            i=7;     //維持約63US,符合不低于60US的要求
            while(i--);   //維持約63US,符合不低于60US的要求               
            ds18b20=1;    //拉高         
            _nop_();        //維持2US,符合大于1US的規范
            _nop_();        //維持2US,符合大于1US的規范         
         }
   dat=dat>>1;    //寫入字節右移1位
}
}
//---------------------------------------
//名稱:DS18B20溫度轉換函數
//---------------------------------------
bit Convert(void)
{   
if(Reset()==0)          //復位DS18B20成功
   {  
     WriteByte(0xcc);  //寫入跳過序列號命令字 Skip Rom
        WriteByte(0x44);  //寫入溫度轉換命令字 Convert T  
    return 1;            //啟動溫度轉換成功
   }
else                    //失敗
   {   
    return 0;            //啟動溫度轉換失敗
   }
}
//---------------------------------------
//名稱:轉換結束處理函數
//---------------------------------------
void ReadFlash(void)
{   
unsigned char Lsb,Msb;
    if(Reset()==0)          //復位DS18B20成功
    {
        WriteByte(0xcc);  //寫入跳過序列號命令字 Skip Rom
        WriteByte(0xbe);  //寫入讀取數據令字 Read Scratchpad
        Lsb=ReadByte();  //讀出第一個字節暫存于LSB
        Msb=ReadByte();  //讀出第二個字節暫存于MSB
    temp1=Lsb;  //temp1內裝溫度參數的小數部分
        temp2=Msb;//>>4)|(Lsb<<4);//temp2內裝溫度參數的整數部分   
    }
else
    {
  temp1=0;     //如果復位失敗,溫度參數清零
        temp2=0;     //如果復位失敗,溫度參數清零
    }
}
//---------------------------------------
void display(unsigned char ddd)
{
  P2=0x80;
  P0=0xbf;
  delay(2);
  P0=0xff;
  delay(1);
  P2=0x20;
  P0=0xbf;
  delay(2);
  P0=0xff;
  delay(1);
  
  P2=0x40;
  P0=0x7f;
  delay(2);
  P0=tabca[num]&0x7f;
  delay(1);
  P2=0x02;
  P0=tabca[ddd/10];
  delay(2);
  P0=0xff;
  delay(1);
  P2=0x01;
  P0=tabca[ddd%10];
  delay(2);
  P0=0xff;
  delay(1);
}
void keyboard()
{

}
void main(void)            //主函數,單片機開機后就是從這個函數開始運行
{
   unsigned char TT;
   EA=1;
   EX0=1;
  
   while(1)               //死循環,單片機初始化后,將一直運行這個死循環
   {     
      if(Convert()==1)       //啟動轉換
  {      
      ReadFlash();                //讀取溫度
            TT=(temp2<<4)|(temp1>>4);
   if(TT<TL)
              num=0;
   if((TT>=TL)&(TT<=TH))
     num=1;
   if(TT>TH)
     num=2;
    display(TT);
         
     }   
    }
}




#include <AT89X52.h>       //調用51單片機的頭文件
#include <Intrins.h>
sbit ds18b20=P3^7;
unsigned char TT,temp1,num,TL=20,TH=27,n,TH;
unsigned char temp,temp2,OK;
unsigned char  code tabcc[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};//共陰極
unsigned char  code tabca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00};//共陽極
//---------------------------------------
//名稱:復位DS18B20函數
//---------------------
void delay(int ms)
{
  int i;
  while(ms--)
   for(i=0;i<120;i++);
}
//---------------------------------------
//名稱:復位DS18B20函數
//---------------------
bit Reset(void)
{
   unsigned int i;
   bit k;
   ds18b20=0;            //拉低DQ總線開始復位
   i=95;          //保持DQ低大約870uS,符合不低于48US的要求
   while(i--);        //保持DQ低大約870uS,符合不低于48US的要求
                     //保持DQ低大約870uS,符合不低于48US的要求     
   ds18b20=1;        //拉高準備接收數據   
   i=9;         //大約80uS后
   while(i--);        //大約80uS后
                //大約80uS后
   k=ds18b20;          //讀出數據并保存   
   i=55;          //維持約490US,符合總讀時隙不低于480US的要求
   while(i--);        //維持約400US,符合總讀時隙不低于480US的要求
                 //維持約400US,符合總讀時隙不低于480US的要求
   return k;               //k=0為復位成功,k=1為復位失敗
}
//---------------------------------------
//名稱:讀一字節函數
//---------------------------------------
unsigned char ReadByte(void)
{
unsigned int i;
   unsigned char j,buf=0;
   for(j=0;j<8;j++)   //接收8次還原一個字節數據
   {
  buf=buf>>1;     //接收前,想將接收緩沖區右移
  ds18b20=0;     //拉低      
        _nop_();         //維持2US,符合大于1US小于15US的規范
        _nop_();         //維持2US,符合大于1US小于15US的規范        
        ds18b20=1;      //拉高,為讀數據做準備
  _nop_();         //維持6US,符合大于1US小于15US的規范
        _nop_();         //維持6US,符合大于1US小于15US的規范
        _nop_();         //維持6US,符合大于1US小于15US的規范
     _nop_();         //維持6US,符合大于1US小于15US的規范
  _nop_();         //維持6US,符合大于1US小于15US的規范
        _nop_();         //維持6US,符合大于1US小于15US的規范
        _nop_();         //維持6US,符合大于1US小于15US的規范   
  if(ds18b20==1)
       buf|=0x80;  //讀出1位數據保存于buf中
    i=7;       //維持約52US,符合總讀時隙不低于60US的要求
          while(i--);     //維持約52US,符合總讀時隙不低于60US的要求
                   //維持約52US,符合總讀時隙不低于60US的要求
}
   return buf;             //退出的同時將接收緩沖區參數返回
}
//---------------------------------------
//名稱:寫一字節函數
//---------------------------------------
void WriteByte(unsigned char dat)
{
unsigned int i;
    unsigned char j;
    for(j=0;j<8;j++)
     {            
  if(dat&0x01)   //如果寫1
         {      
      ds18b20=0;    //拉低      
            _nop_();        //維持2US,符合大于1US小于15US的規范
            _nop_();        //維持2US,符合大于1US小于15US的規范
            ds18b20=1;     //拉高        
            i=7;      //維持約63US,符合不低于60US的要求
            while(i--);    //維持約63US,符合不低于60US的要求         
      }
      else      //如果寫0
         {            
   ds18b20=0;    //拉低         
            i=7;     //維持約63US,符合不低于60US的要求
            while(i--);   //維持約63US,符合不低于60US的要求               
            ds18b20=1;    //拉高         
            _nop_();        //維持2US,符合大于1US的規范
            _nop_();        //維持2US,符合大于1US的規范         
         }
   dat=dat>>1;    //寫入字節右移1位
}
}
//---------------------------------------
//名稱:DS18B20溫度轉換函數
//---------------------------------------
bit Convert(void)
{   
if(Reset()==0)          //復位DS18B20成功
   {  
     WriteByte(0xcc);  //寫入跳過序列號命令字 Skip Rom
        WriteByte(0x44);  //寫入溫度轉換命令字 Convert T  
    return 1;            //啟動溫度轉換成功
   }
else                    //失敗
   {   
    return 0;            //啟動溫度轉換失敗
   }
}
//---------------------------------------
//名稱:轉換結束處理函數
//---------------------------------------
void ReadFlash(void)
{   
unsigned char Lsb,Msb;
    if(Reset()==0)          //復位DS18B20成功
    {
        WriteByte(0xcc);  //寫入跳過序列號命令字 Skip Rom
        WriteByte(0xbe);  //寫入讀取數據令字 Read Scratchpad
        Lsb=ReadByte();  //讀出第一個字節暫存于LSB
        Msb=ReadByte();  //讀出第二個字節暫存于MSB
    temp1=Lsb;  //temp1內裝溫度參數的小數部分
        temp2=Msb;//>>4)|(Lsb<<4);//temp2內裝溫度參數的整數部分   
    }
else
    {
  temp1=0;     //如果復位失敗,溫度參數清零
        temp2=0;     //如果復位失敗,溫度參數清零
    }
}
//---------------------------------------
void display(unsigned char ddd)//顯示
{
  P2=0x80;
  P0=0xbf;
  delay(2);
  P0=0xff;
  delay(1);//左-
  P2=0x20;
  P0=0xbf;
  delay(2);
  P0=0xff;
  delay(1);//右-
  
  P2=0x40;
  P0=tabca[num];//兩杠中間顯示區間編號
  delay(2);
  P0=0xff;
  delay(1);
  P2=0x02;
  P0=tabca[ddd/10];//顯示溫度十位
  delay(2);
  P0=0xff;
  delay(1);
  P2=0x01;
  P0=tabca[ddd%10];//顯示溫度個位
  delay(2);
  P0=0xff;
  delay(1);
}
void desplay(void)//調試顯示
{
  P2=0x80;
  P0=0xbf;
  delay(1);
  P0=0xff;
  _nop_();
  P2=0x40;
  P0=tabca[n];
  delay(1);
  P0=0xff;
  _nop_();
  P2=0x20;
  P0=0xbf;
  delay(1);
  P0=0xff;
  _nop_();
  P2=0x10;
  P0=tabca[TH1];
  delay(1);
  P0=0xff;
  _nop_();
  P2=0x08;
  P0=tabca[TH0];
  delay(1);
  P0=0xff;
  _nop_();
  P2=0x04;
  P0=0xbf;
  delay(1);
  P0=0xff;
  _nop_();
  P2=0x02;
  P0=tabca[TL1];
  delay(1);
  P0=0xff;
  _nop_();
  P2=0x01;
  P0=tabca[TL0];
  delay(1);
  P0=0xff;
  _nop_();
}
void xswd()
{
      if(Convert()==1)       //啟動轉換
  {      
      ReadFlash();                //讀取溫度
            TT=(temp2<<4)|(temp1>>4);
   if(TT<TL)
              num=0;
   if((TT>=TL)&(TT<=TH))
     num=1;
   if(TT>TH)
     num=2;
    display(TT);         
     }   
}
void xssz()
{
  desplay();
}
void main(void)            //主函數,單片機開機后就是從這個函數開始運行
{
   bit ss;
   ss=P2^3;
   EA=1;
   EX0=1;
   EX1=1;
   IT1=1;
   IT0=1;
   PX0=1;
   PX1=0;
   OK=0;
   
   while(1)               //死循環,單片機初始化后,將一直運行這個死循環
   {      
      P1=0xfe;
      delay(2);
      P1=0xfd;
      delay(2);
      P1=0xfb;
      delay(2);
      P1=0xf7;
      delay(2);
     if(OK==0)        
      xswd();
     else
       desplay();      
    }
}
void intsvr0(void) interrupt 0 using 0
{
  unsigned char key;      
  OK++;
  P1=0xfe;
  if(P1_4==0) key=1;
  else if(P1_5==0)key=2;
  else if(P1_6==0)key=3;
  else if(P1_7==0)key=4;

  P1=0xfd;
  if(P1_4==0)key=5;
  else if(P1_5==0)key=6;
  else if(P1_6==0)key=7;
  else if(P1_7==0)key=8;

  P1=0xfb;
  if(P1_4==0)key=9;
  else if(P1_5==0)key=10;
  else if(P1_6==0)key=11;
  else if(P1_7==0)key=12;

  P1=0xf7;
  if(P1_4==0)key=13;
  else if(P1_5==0)key=14;
  else if(P1_6==0)key=15;
  else if(P1_7==0)key=16;
  
  if(n==1)TH1=key;
  if(n==2)TH0=key;
  if(n==3)TL1=key;
  if(n==4)TL0=key;
}
void intsvr2(void) interrupt 2 using 2
{
  OK++;
  n++;
  if(n==5)
   {
    TH=TH1*10+TH0;
    TL=TL1*10+TL0;
   }
  if(n==6)
    {
  OK=0;
  n=0;
}  
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:65232 發表于 2015-4-19 10:12 | 只看該作者
做個記號
回復

使用道具 舉報

板凳
ID:65916 發表于 2015-4-19 10:55 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

地板
ID:121305 發表于 2016-5-24 18:19 | 只看該作者
感謝感謝
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人亚洲| 亚洲综合在线网 | 国产视频线观看永久免费 | 91精品国产91久久久久久吃药 | 国产精品久久久久久久久久久久久 | 91精品成人久久 | 久久精品91久久久久久再现 | 日韩欧美一二三区 | 久久九| 久久午夜视频 | 亚洲黄色成人网 | 成人激情视频网 | 在线国产视频 | 欧美视频1区 | 久久精品国产精品青草 | 一区二区三区四区不卡视频 | 中文字幕视频免费 | 亚洲成人精品国产 | 妖精视频一区二区三区 | 97视频在线观看网站 | 日韩av在线一区二区 | 一级黄色在线 | 国产一区二区在线免费观看 | www.天天操 | 黄色小视频大全 | 精品久| 亚洲色图网址 | 视频一区在线观看 | 亚av在线 | 成人毛片在线观看 | 国产精品久久久久一区二区三区 | 一区二区三区av夏目彩春 | 国产一区二区三区在线 | 中文字幕av在线播放 | 91精品中文字幕一区二区三区 | 天天操综合网站 | 中文字幕11页 | 香蕉视频在线播放 | 久久综合av| 欧美性生活一区二区三区 | av高清毛片|