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

專注電子技術(shù)學(xué)習與研究
當前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

51單片機多路DS18B20溫度測量程序

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2013年08月16日   【字體:


仿真圖:

仿真文件和完整源碼的下載地址:http://www.zg4o1577.cn/bbs/dpj-20600-1.html
源代碼:
#include<reg51.h>
#include<intrins.h>
#include <string.h>
#include <stdio.h>
#define uchar unsigned char
#define uint  unsigned int

sbit RS=  P2^0  ;       //液晶顯示引腳定義
sbit RW=  P2^1  ;
sbit EN=  P2^2  ;
uint  t=0,dian=0;
uchar LCD_LINE_ONE[16]={"tp1:           "};  //定義顯示屏幕
uchar LCD_LINE_TWO[16]={"tp2:           "};
//uchar LCD_LINE_THR[16]={"                "};

int Tm;
int  fushu=0 ;
sbit DQ= P3^3;            
static unsigned char get_serial[]={    //獲取的八個DS18B20內(nèi)部RAM64位序列號
   224, 0,0,0,  184,  197, 50, 40,
   215, 0,0,0,  184,  197, 51, 40
  //  82, 0,0,0,  184,  197, 52, 40
 // 101, 0,0,0,  184,  197,  53,40,
  //60, 0,0,0,  184,  197,  54,40,
   //11, 0,0,0,  184,  197,  55,40,
    //47, 0,0,0,  184,  197,  56,40,
  //185, 0,0,0,  184,  197,  49,40,
 };
void delay( ms )       //用于液晶顯示的延時函數(shù)
{
   int i ;
   while(ms--)
   {
        for(i=0 ;i<5 ;i++ )  ;

   }
}

uchar Read_LCD_State()      //讀取液晶顯示的狀態(tài)
{
  uchar state;
 RS=0;RW=1;EN=1;delay(1);
 state=P0;
 EN = 0;delay(1);
 return state;
}
void LCD_Busy_Wait()     //如果忙則等待函數(shù)
{
  while((Read_LCD_State()&0x80)==0x80);
 delay(5);
}

void Write_LCD_Zhilin(uchar zl)     //液晶顯示寫指令函數(shù)
{
 LCD_Busy_Wait();
 RS=0;RW=0;
 EN=0;
 P0=zl;
 EN=1;
 delay(1);
 EN=0; 
}
void Write_LCD_shuju(uchar date)      //液晶顯示寫數(shù)據(jù)函數(shù)
{
  LCD_Busy_Wait();
 RS=1;RW=0;
 EN=0;
 P0=date;
 EN=1;
 delay(1);
 EN=0; 
}
 void LCD_INIT()    //液晶顯示初始化
{
    Write_LCD_Zhilin(0x38);   // 顯示模式設(shè)置
 delay(1);     
 Write_LCD_Zhilin(0x01);   // 顯示清屏
 delay(1);    
 Write_LCD_Zhilin(0x06);   // 光標移動設(shè)置
 delay(1);
 Write_LCD_Zhilin(0x0c);   // 開及光標設(shè)置
 delay(1);
}
 void Display_LCD_String(uchar p,uchar *s)    //液晶顯示寫入函數(shù)
{
  uchar i;
 Write_LCD_Zhilin(p|0x80) ;    //寫地址高位為一
 //Write_LCD_Zhilin(0x40|0x80) ;
 for(i=0;i<16;i++)
 {
  Write_LCD_shuju(s[i]);
  delay(1);  
 }
}
/***************************************************************************************/
void delays(int us)        //用于DS18B20的延時函數(shù)
{ int s;
for ( s=0; s<us; s++);
}
void rst(void)      //DS18B20初始化
{
DQ = 1;
delays(2);
DQ = 0;
delays(30); //精確延時 480~960us
DQ = 1;
delays(8);
}
void write(unsigned char ku)  //DS18B20寫函數(shù)
{
int i=0;
     for (i=0;i<8;i++)
    {
  DQ=0;
  DQ =ku&0x01;
  delays(3);
  DQ=1;
  ku>>=1;
    }
}
void match_rom(unsigned char *rom)   //DS18B20匹配ROM函數(shù)
{
 unsigned char i;
 rst();         //初始化
 write(0x55);       //匹配ROM
 for(i=8;i>0;i--)
 {
          write(*(rom+i-1));
 }

}
unsigned int read(void)     //DS18B20讀函數(shù),每次讀16位
{
 int i=0;
 unsigned int u=0;
    for (i=0;i<16;i++)
    {
  DQ=0;
  u>>=1;
  DQ=1;
  if(DQ) u|=0x8000;
  delays(4);
     }
    return (u);
}
int  read0(unsigned char *seria) //讀取對應(yīng)溫度值并轉(zhuǎn)換函數(shù)
{
     int temperature ;
    unsigned int tp;
    unsigned int lsb;
    rst();      //初始化
    write(0xCC);    //跳過RAM
 write(0x44);    //溫度轉(zhuǎn)換
 rst();      //再次初始化
 write(0xCC);
 match_rom(seria);    //匹配ROM函數(shù)調(diào)用
   write(0xBE);  //讀取存儲器指令
 tp=read();    //讀取溫度值
 if((tp&0xf800)==0xf800)  //判斷正負數(shù)
     {
       fushu=1 ;
        tp=~tp+1 ;
      lsb=(unsigned int)(tp*6.25);
   dian=lsb%100;    //取小數(shù)部分
  
       temperature=lsb/100;

  }
     else
     {
      fushu=0;
      lsb=(unsigned int)(tp*6.25);
   dian=lsb%100; 
  
       temperature=lsb/100;

      }
     return(temperature);
}
/*****************************************************************************************/
void main()
{
      uint i ;
   LCD_INIT();
   EA=0 ;   //使用DS18B20禁止任何中斷
   while(1)
  {  
       for(i=0;i<2;i++)
    { 
        Tm=read0(get_serial+i*8);
    if(i==0)       //判斷是第幾個的數(shù)據(jù)
    {
        if(fushu==0)        //判斷是否加負號
             sprintf(LCD_LINE_ONE+5," %d", Tm);
        if(fushu==1)
          sprintf(LCD_LINE_ONE+5,"-%d", Tm);
           sprintf(LCD_LINE_ONE+10,".%d",dian);  //加入小數(shù)部分
        Display_LCD_String(0x00,LCD_LINE_ONE);
     }
    if(i==1)
    { 
           if(fushu==0) 
              sprintf(LCD_LINE_TWO+5," %d", Tm);
        if(fushu==1)
           sprintf(LCD_LINE_TWO+5,"-%d", Tm);
           sprintf(LCD_LINE_TWO+10,".%d",dian);
        Display_LCD_String(0x40,LCD_LINE_TWO);
    }

    }

  
  }
}

 

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 精品国产一区久久 | 99久久久久国产精品免费 | 日韩精品视频网 | 你懂的国产 | 国产欧美一区二区三区在线看 | 国产av毛片 | 中文字幕观看 | 91新视频 | 日韩欧美专区 | 精品久久网 | 超碰人人人人 | 午夜影院毛片 | 国产精品精品视频一区二区三区 | 孰女乱色一区二区三区 | 欧美精品日韩精品国产精品 | 一区二区三区成人 | 国产精品亚洲精品 | 国产精品国产成人国产三级 | 国产欧美精品一区二区三区 | 成人欧美一区二区三区在线观看 | 国产精品日产欧美久久久久 | 天天插日日操 | 日韩中文字幕2019 | 国产综合久久久 | 国产精品三级 | 二区在线观看 | 91成人午夜性a一级毛片 | 丁香一区二区 | 中文字幕在线播放不卡 | 波多野结衣一区二区 | 91久久久久久久久久久 | 在线亚洲一区二区 | 成人亚洲精品久久久久软件 | a级片播放 | 91免费在线| 日韩成人| 亚洲视频中文字幕 | 国产一级影片 | 欧美精品1区2区 | 国精产品一区二区三区 | 欧美精品久久久 |