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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

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

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年08月16日   【字體:


仿真圖:

仿真文件和完整源碼的下載地址:http://m.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內部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 )       //用于液晶顯示的延時函數
{
   int i ;
   while(ms--)
   {
        for(i=0 ;i<5 ;i++ )  ;

   }
}

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

void Write_LCD_Zhilin(uchar zl)     //液晶顯示寫指令函數
{
 LCD_Busy_Wait();
 RS=0;RW=0;
 EN=0;
 P0=zl;
 EN=1;
 delay(1);
 EN=0; 
}
void Write_LCD_shuju(uchar date)      //液晶顯示寫數據函數
{
  LCD_Busy_Wait();
 RS=1;RW=0;
 EN=0;
 P0=date;
 EN=1;
 delay(1);
 EN=0; 
}
 void LCD_INIT()    //液晶顯示初始化
{
    Write_LCD_Zhilin(0x38);   // 顯示模式設置
 delay(1);     
 Write_LCD_Zhilin(0x01);   // 顯示清屏
 delay(1);    
 Write_LCD_Zhilin(0x06);   // 光標移動設置
 delay(1);
 Write_LCD_Zhilin(0x0c);   // 開及光標設置
 delay(1);
}
 void Display_LCD_String(uchar p,uchar *s)    //液晶顯示寫入函數
{
  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的延時函數
{ 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寫函數
{
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函數
{
 unsigned char i;
 rst();         //初始化
 write(0x55);       //匹配ROM
 for(i=8;i>0;i--)
 {
          write(*(rom+i-1));
 }

}
unsigned int read(void)     //DS18B20讀函數,每次讀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) //讀取對應溫度值并轉換函數
{
     int temperature ;
    unsigned int tp;
    unsigned int lsb;
    rst();      //初始化
    write(0xCC);    //跳過RAM
 write(0x44);    //溫度轉換
 rst();      //再次初始化
 write(0xCC);
 match_rom(seria);    //匹配ROM函數調用
   write(0xBE);  //讀取存儲器指令
 tp=read();    //讀取溫度值
 if((tp&0xf800)==0xf800)  //判斷正負數
     {
       fushu=1 ;
        tp=~tp+1 ;
      lsb=(unsigned int)(tp*6.25);
   dian=lsb%100;    //取小數部分
  
       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)       //判斷是第幾個的數據
    {
        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);  //加入小數部分
        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);
    }

    }

  
  }
}

 

關閉窗口

相關文章

主站蜘蛛池模板: 亚洲网站在线播放 | 国产精品久久精品 | 先锋资源网站 | 国产精品久久久久久久久久妇女 | 日韩在线观看视频一区 | 亚洲精品无 | 国产一区二区三区四区五区3d | 精品国产区 | av在线免费观看不卡 | 特级毛片 | 一区二区在线免费观看视频 | 性视频一区 | 五月天激情综合网 | 久久精品视频免费看 | 91精品国产色综合久久 | 91极品尤物在线播放国产 | 欧美激情久久久 | 性高朝久久久久久久3小时 av一区二区三区四区 | 国产在线精品一区二区 | 一级片免费视频 | 激情小视频 | 国产成人精品亚洲日本在线观看 | 四虎免费视频 | 欧美日韩在线一区二区三区 | 99久久免费观看 | 久久精品a级毛片 | 另类专区成人 | 亚洲一一在线 | 五月天天色 | 91精品欧美久久久久久久 | 中文字幕亚洲一区二区三区 | 久久99久久98精品免观看软件 | 九九热在线视频观看这里只有精品 | 日韩欧美国产精品 | 免费看a| 综合五月| 久久久国产一区二区三区 | 免费观看一级黄色录像 | 污片在线免费观看 | 国产精品视频免费观看 | 欧美日韩视频在线第一区 |