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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4327|回復(fù): 3
收起左側(cè)

ds18b20單片機(jī)溫控程序

[復(fù)制鏈接]
ID:77367 發(fā)表于 2015-4-19 03:19 | 顯示全部樓層 |閱讀模式
#include <reg51.h>       //調(diào)用51單片機(jī)的頭文件
#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};//共陽極
//---------------------------------------
//名稱:復(fù)位DS18B20函數(shù)
//---------------------
void delay(int ms)
{
  int i;
  while(ms--)
   for(i=0;i<120;i++);
}
//---------------------------------------
//名稱:復(fù)位DS18B20函數(shù)
//---------------------
bit Reset(void)
{
   unsigned int i;
   bit k;
   ds18b20=0;            //拉低DQ總線開始復(fù)位
   i=95;          //保持DQ低大約870uS,符合不低于48US的要求
   while(i--);        //保持DQ低大約870uS,符合不低于48US的要求
                     //保持DQ低大約870uS,符合不低于48US的要求     
   ds18b20=1;        //拉高準(zhǔn)備接收數(shù)據(jù)   
   i=9;         //大約80uS后
   while(i--);        //大約80uS后
                //大約80uS后
   k=ds18b20;          //讀出數(shù)據(jù)并保存   
   i=55;          //維持約490US,符合總讀時(shí)隙不低于480US的要求
   while(i--);        //維持約400US,符合總讀時(shí)隙不低于480US的要求
                 //維持約400US,符合總讀時(shí)隙不低于480US的要求
   return k;               //k=0為復(fù)位成功,k=1為復(fù)位失敗
}
//---------------------------------------
//名稱:讀一字節(jié)函數(shù)
//---------------------------------------
unsigned char ReadByte(void)
{
unsigned int i;
   unsigned char j,buf=0;
   for(j=0;j<8;j++)   //接收8次還原一個(gè)字節(jié)數(shù)據(jù)
   {
  buf=buf>>1;     //接收前,想將接收緩沖區(qū)右移
  ds18b20=0;     //拉低      
        _nop_();         //維持2US,符合大于1US小于15US的規(guī)范
        _nop_();         //維持2US,符合大于1US小于15US的規(guī)范        
        ds18b20=1;      //拉高,為讀數(shù)據(jù)做準(zhǔn)備
  _nop_();         //維持6US,符合大于1US小于15US的規(guī)范
        _nop_();         //維持6US,符合大于1US小于15US的規(guī)范
        _nop_();         //維持6US,符合大于1US小于15US的規(guī)范
     _nop_();         //維持6US,符合大于1US小于15US的規(guī)范
  _nop_();         //維持6US,符合大于1US小于15US的規(guī)范
        _nop_();         //維持6US,符合大于1US小于15US的規(guī)范
        _nop_();         //維持6US,符合大于1US小于15US的規(guī)范   
  if(ds18b20==1)
       buf|=0x80;  //讀出1位數(shù)據(jù)保存于buf中
    i=7;       //維持約52US,符合總讀時(shí)隙不低于60US的要求
          while(i--);     //維持約52US,符合總讀時(shí)隙不低于60US的要求
                   //維持約52US,符合總讀時(shí)隙不低于60US的要求
}
   return buf;             //退出的同時(shí)將接收緩沖區(qū)參數(shù)返回
}
//---------------------------------------
//名稱:寫一字節(jié)函數(shù)
//---------------------------------------
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的規(guī)范
            _nop_();        //維持2US,符合大于1US小于15US的規(guī)范
            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的規(guī)范
            _nop_();        //維持2US,符合大于1US的規(guī)范         
         }
   dat=dat>>1;    //寫入字節(jié)右移1位
}
}
//---------------------------------------
//名稱:DS18B20溫度轉(zhuǎn)換函數(shù)
//---------------------------------------
bit Convert(void)
{   
if(Reset()==0)          //復(fù)位DS18B20成功
   {  
     WriteByte(0xcc);  //寫入跳過序列號(hào)命令字 Skip Rom
        WriteByte(0x44);  //寫入溫度轉(zhuǎn)換命令字 Convert T  
    return 1;            //啟動(dòng)溫度轉(zhuǎn)換成功
   }
else                    //失敗
   {   
    return 0;            //啟動(dòng)溫度轉(zhuǎn)換失敗
   }
}
//---------------------------------------
//名稱:轉(zhuǎn)換結(jié)束處理函數(shù)
//---------------------------------------
void ReadFlash(void)
{   
unsigned char Lsb,Msb;
    if(Reset()==0)          //復(fù)位DS18B20成功
    {
        WriteByte(0xcc);  //寫入跳過序列號(hào)命令字 Skip Rom
        WriteByte(0xbe);  //寫入讀取數(shù)據(jù)令字 Read Scratchpad
        Lsb=ReadByte();  //讀出第一個(gè)字節(jié)暫存于LSB
        Msb=ReadByte();  //讀出第二個(gè)字節(jié)暫存于MSB
    temp1=Lsb;  //temp1內(nèi)裝溫度參數(shù)的小數(shù)部分
        temp2=Msb;//>>4)|(Lsb<<4);//temp2內(nèi)裝溫度參數(shù)的整數(shù)部分   
    }
else
    {
  temp1=0;     //如果復(fù)位失敗,溫度參數(shù)清零
        temp2=0;     //如果復(fù)位失敗,溫度參數(shù)清零
    }
}
//---------------------------------------
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)            //主函數(shù),單片機(jī)開機(jī)后就是從這個(gè)函數(shù)開始運(yùn)行
{
   unsigned char TT;
   EA=1;
   EX0=1;
  
   while(1)               //死循環(huán),單片機(jī)初始化后,將一直運(yùn)行這個(gè)死循環(huán)
   {     
      if(Convert()==1)       //啟動(dòng)轉(zhuǎn)換
  {      
      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>       //調(diào)用51單片機(jī)的頭文件
#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};//共陽極
//---------------------------------------
//名稱:復(fù)位DS18B20函數(shù)
//---------------------
void delay(int ms)
{
  int i;
  while(ms--)
   for(i=0;i<120;i++);
}
//---------------------------------------
//名稱:復(fù)位DS18B20函數(shù)
//---------------------
bit Reset(void)
{
   unsigned int i;
   bit k;
   ds18b20=0;            //拉低DQ總線開始復(fù)位
   i=95;          //保持DQ低大約870uS,符合不低于48US的要求
   while(i--);        //保持DQ低大約870uS,符合不低于48US的要求
                     //保持DQ低大約870uS,符合不低于48US的要求     
   ds18b20=1;        //拉高準(zhǔn)備接收數(shù)據(jù)   
   i=9;         //大約80uS后
   while(i--);        //大約80uS后
                //大約80uS后
   k=ds18b20;          //讀出數(shù)據(jù)并保存   
   i=55;          //維持約490US,符合總讀時(shí)隙不低于480US的要求
   while(i--);        //維持約400US,符合總讀時(shí)隙不低于480US的要求
                 //維持約400US,符合總讀時(shí)隙不低于480US的要求
   return k;               //k=0為復(fù)位成功,k=1為復(fù)位失敗
}
//---------------------------------------
//名稱:讀一字節(jié)函數(shù)
//---------------------------------------
unsigned char ReadByte(void)
{
unsigned int i;
   unsigned char j,buf=0;
   for(j=0;j<8;j++)   //接收8次還原一個(gè)字節(jié)數(shù)據(jù)
   {
  buf=buf>>1;     //接收前,想將接收緩沖區(qū)右移
  ds18b20=0;     //拉低      
        _nop_();         //維持2US,符合大于1US小于15US的規(guī)范
        _nop_();         //維持2US,符合大于1US小于15US的規(guī)范        
        ds18b20=1;      //拉高,為讀數(shù)據(jù)做準(zhǔn)備
  _nop_();         //維持6US,符合大于1US小于15US的規(guī)范
        _nop_();         //維持6US,符合大于1US小于15US的規(guī)范
        _nop_();         //維持6US,符合大于1US小于15US的規(guī)范
     _nop_();         //維持6US,符合大于1US小于15US的規(guī)范
  _nop_();         //維持6US,符合大于1US小于15US的規(guī)范
        _nop_();         //維持6US,符合大于1US小于15US的規(guī)范
        _nop_();         //維持6US,符合大于1US小于15US的規(guī)范   
  if(ds18b20==1)
       buf|=0x80;  //讀出1位數(shù)據(jù)保存于buf中
    i=7;       //維持約52US,符合總讀時(shí)隙不低于60US的要求
          while(i--);     //維持約52US,符合總讀時(shí)隙不低于60US的要求
                   //維持約52US,符合總讀時(shí)隙不低于60US的要求
}
   return buf;             //退出的同時(shí)將接收緩沖區(qū)參數(shù)返回
}
//---------------------------------------
//名稱:寫一字節(jié)函數(shù)
//---------------------------------------
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的規(guī)范
            _nop_();        //維持2US,符合大于1US小于15US的規(guī)范
            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的規(guī)范
            _nop_();        //維持2US,符合大于1US的規(guī)范         
         }
   dat=dat>>1;    //寫入字節(jié)右移1位
}
}
//---------------------------------------
//名稱:DS18B20溫度轉(zhuǎn)換函數(shù)
//---------------------------------------
bit Convert(void)
{   
if(Reset()==0)          //復(fù)位DS18B20成功
   {  
     WriteByte(0xcc);  //寫入跳過序列號(hào)命令字 Skip Rom
        WriteByte(0x44);  //寫入溫度轉(zhuǎn)換命令字 Convert T  
    return 1;            //啟動(dòng)溫度轉(zhuǎn)換成功
   }
else                    //失敗
   {   
    return 0;            //啟動(dòng)溫度轉(zhuǎn)換失敗
   }
}
//---------------------------------------
//名稱:轉(zhuǎn)換結(jié)束處理函數(shù)
//---------------------------------------
void ReadFlash(void)
{   
unsigned char Lsb,Msb;
    if(Reset()==0)          //復(fù)位DS18B20成功
    {
        WriteByte(0xcc);  //寫入跳過序列號(hào)命令字 Skip Rom
        WriteByte(0xbe);  //寫入讀取數(shù)據(jù)令字 Read Scratchpad
        Lsb=ReadByte();  //讀出第一個(gè)字節(jié)暫存于LSB
        Msb=ReadByte();  //讀出第二個(gè)字節(jié)暫存于MSB
    temp1=Lsb;  //temp1內(nèi)裝溫度參數(shù)的小數(shù)部分
        temp2=Msb;//>>4)|(Lsb<<4);//temp2內(nèi)裝溫度參數(shù)的整數(shù)部分   
    }
else
    {
  temp1=0;     //如果復(fù)位失敗,溫度參數(shù)清零
        temp2=0;     //如果復(fù)位失敗,溫度參數(shù)清零
    }
}
//---------------------------------------
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];//兩杠中間顯示區(qū)間編號(hào)
  delay(2);
  P0=0xff;
  delay(1);
  P2=0x02;
  P0=tabca[ddd/10];//顯示溫度十位
  delay(2);
  P0=0xff;
  delay(1);
  P2=0x01;
  P0=tabca[ddd%10];//顯示溫度個(gè)位
  delay(2);
  P0=0xff;
  delay(1);
}
void desplay(void)//調(diào)試顯示
{
  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)       //啟動(dòng)轉(zhuǎn)換
  {      
      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)            //主函數(shù),單片機(jī)開機(jī)后就是從這個(gè)函數(shù)開始運(yùn)行
{
   bit ss;
   ss=P2^3;
   EA=1;
   EX0=1;
   EX1=1;
   IT1=1;
   IT0=1;
   PX0=1;
   PX1=0;
   OK=0;
   
   while(1)               //死循環(huán),單片機(jī)初始化后,將一直運(yùn)行這個(gè)死循環(huán)
   {      
      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;
}  
}



回復(fù)

使用道具 舉報(bào)

ID:65232 發(fā)表于 2015-4-19 10:12 | 顯示全部樓層
做個(gè)記號(hào)
回復(fù)

使用道具 舉報(bào)

ID:65916 發(fā)表于 2015-4-19 10:55 | 顯示全部樓層
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:121305 發(fā)表于 2016-5-24 18:19 | 顯示全部樓層
感謝感謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本羞羞影院 | 国产一区二区欧美 | 午夜影晥 | 欧美一区二区三区免费电影 | 国产污视频在线 | 7777久久 | 91久久精品一区二区二区 | 亚洲一区二区欧美 | 青青久久| 精品美女久久久久久免费 | 国产欧美一区二区精品久导航 | 日本三级电影在线看 | 91 中文字幕 | 国产女人与拘做受视频 | 国产专区视频 | 天天操天天干天天曰 | 欧美精品一区二区三区四区 在线 | 久久狠狠 | 久久精品国产一区二区电影 | 亚洲视频在线看 | 精品视频在线观看 | www.五月天婷婷.com | 久久99精品久久久久久国产越南 | 91久久久久| 欧美高清视频 | 国产一区二区激情视频 | 免费福利视频一区二区三区 | 久久久影院| 最新国产精品视频 | 国产一区二区三区四区区 | 一区二区三区精品 | 亚洲视频一区 | 青青草在线视频免费观看 | 青青草一区 | 最近日韩中文字幕 | 男人天堂国产 | 精品国产欧美一区二区三区成人 | 视频一区二区三区在线观看 | 黄色毛片免费视频 | 久久久精品视频免费 | 久久精品 |