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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS18B20多點測溫(讀序列,匹配序列,51單片機C程序,1602顯示)

[復制鏈接]
跳轉到指定樓層
樓主
ID:439612 發表于 2018-12-4 21:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
DS18B20多點測溫(讀序列,匹配序列,51 C程序,1602顯示)
程序一:單個讀序列號。程序二,匹配并且讀兩個DS18B20,當然,讀多個與讀兩個基本原理一樣,只要加上其序列號等即可。本程序所有顯示都是用LCD1602顯示。
程序一:度序列號,并用1602顯示,1602從左到右分別是低到高位。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7;//ds18b20與單片機連接口
sbit RS=P2^4;
sbit RW=P2^5;
sbit EN=P2^6;
uchar fCode[8];//序列號
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延時1毫秒(不夠精確的)
{unsigned int i,j;
   for(i=0;i<ms;i++)
    for(j=0;j<100;j++);
}
void wr_com(unsigned char com)  //寫指令
{ delay1ms(1);
   RS=0;
   RW=0;
   EN=0;
   P0=com;
   delay1ms(1);
   EN=1;
   delay1ms(1);
   EN=0;
}
void wr_dat(unsigned char dat)  //寫數據
{ delay1ms(1);;
   RS=1;
   RW=0;
   EN=0;
   P0=dat;
   delay1ms(1);
   EN=1;
   delay1ms(1);
   EN=0;
}
void lcd_init()//初始化設置//
{delay1ms(15);
  wr_com(0x38);delay1ms(5);
  wr_com(0x08);delay1ms(5);
  wr_com(0x01);delay1ms(5);
  wr_com(0x06);delay1ms(5);
  wr_com(0x0c);delay1ms(5);
}
/******************************ds1820 *********************/
void delay_18B20(unsigned int i)//延時1微秒
{
   while(i--);
}
void ds1820rst() //ds1820復位
{ uchar x=0;
DQ = 1;          //DQ復位,總線拉高
delay_18B20(4); //延時
DQ = 0;          //DQ拉低
delay_18B20(100); //精確延時大于480us
DQ = 1;          //拉高
delay_18B20(40);
   }
uchar ds1820rd()  //讀數據
{ uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{   DQ = 0; //給脈沖信號
    dat>>=1;
    DQ = 1; //給脈沖信號
    if(DQ)
    dat|=0x80;
    delay_18B20(10);
}
   return(dat);
}
void ds1820wr(uchar wdata)//寫數據
{uchar i=0;
    for (i=8; i>0; i--)
   { DQ = 0;
     DQ = wdata&0x01;
     delay_18B20(10);
     DQ = 1;
     wdata>>=1;
   }
}
void DispCode()//把序列號顯示出來
{
unsigned char i,temp;
  ds1820rst();
  ds1820wr(0x33);//讀序列號
   for (i=0;i<8;i++)
{
  fCode[ i]=ds1820rd();//64位
}
wr_com(0x80+0x40);
for (i=0;i<8;i++)
  {
    temp = fCode[ i]>>4; //顯示高四位
   if (temp<10)
    wr_dat(temp + 0x30);//轉化為0~9的字符顯示
  else
    wr_dat(temp + 0x37);//將值轉化為大寫字母顯示
  temp = fCode[ i]&0x0f;//顯示低四位
  if (temp<10)
    wr_dat(temp+ 0x30);
  else
    wr_dat(temp + 0x37);
  }
}

/********************主程序***********************************/
void main()
{
        init_init();//初始化顯示
        DispCode();          //系列號顯示
        delay1ms(1000);
     while(1);
}
程序二:匹配序列號,并讀溫度。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^4;
sbit RW=P2^5;
sbit EN=P2^6;
sbit DQ=P3^7;        
uchar code str1[]={0x28,0x08,0xA7,0xBA,0x02,0x00,0x00,0x18};        //ROM 1
uchar code str2[]={0x28,0x0C,0xBA,0xBA,0x02,0x00,0x00,0x54};        //ROM2
uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};        // 攝氏溫度符號
uchar data disdata[5];
uint tvalue;//溫度值
uchar tflag;//溫度正負標志

/*************************lcd1602程序**************************/
void delay1ms(uint ms)//延時1毫秒(不夠精確的)
{  uint i,j;
   for(i=0;i<ms;i++)
    for(j=0;j<100;j++);
}

void wr_com(uchar com)  //寫指令
{ delay1ms(1);
   RS=0;
   RW=0;
   EN=0;
   P0=com;
   delay1ms(1);
   EN=1;
   delay1ms(1);
   EN=0;
}

void wr_dat(uchar dat)//寫數據//
{ delay1ms(1);;
   RS=1;
   RW=0;
   EN=0;
   P0=dat;
   delay1ms(1);
   EN=1;
   delay1ms(1);
   EN=0;
}
void wr_new()                   //寫新字符
{
        uchar i;
        wr_com(0x40);
        for(i=0;i<8;i++)
        {
                wr_dat(table[ i]);
        }
}
void lcd_init()//初始化設置//
{        delay1ms(15);
        wr_com(0x38);delay1ms(5);
        wr_com(0x08);delay1ms(5);
        wr_com(0x01);delay1ms(5);
         wr_com(0x06);delay1ms(5);
        wr_com(0x0c);delay1ms(5);
        wr_new();
        wr_com(0x80);
    wr_dat('A');
        wr_com(0x81);
    wr_dat(':');
          wr_com(0x89);
    wr_dat(0x00);
        wr_com(0x8a);
    wr_dat('C');
        wr_com(0xc9);
    wr_dat(0x00);                        //攝氏溫度字符
        wr_com(0xca);
    wr_dat('C');
        wr_com(0xc0);
    wr_dat('B');
        wr_com(0xc1);
    wr_dat(':');
}

/******************************ds1820程序***************************************/
void delay_18B20(uint i)//延時1微秒
{
   while(i--);
}



void ds1820rst()/*ds1820復位*/
{   uchar x=0;
        DQ = 1;          //DQ復位
        delay_18B20(4); //延時
        DQ = 0;          //DQ拉低
        delay_18B20(100); //精確延時大于480us
        DQ = 1;          //拉高
        delay_18B20(40);
}

uchar ds1820rd()/*讀數據*/
{ uchar i=0;
  uchar dat = 0;
  for (i=0;i<8;i++)
        {   DQ = 0; //給脈沖信號
    dat>>=1;
    DQ = 1; //給脈沖信號
    if(DQ)
    dat|=0x80;
    delay_18B20(10);
        }
   return(dat);
}
void ds1820wr(uchar dat)/*寫數據*/
{         uchar i=0;
    for (i=0; i<8; i++)
                   { DQ = 0;
              DQ = dat&0x01;
              delay_18B20(10);
              DQ = 1;
              dat>>=1;
                   }
}
void b20_Matchrom(uchar a)         //匹配ROM
{
        char j;
        ds1820wr(0x55);           //發送匹配ROM命令
        if(a==1)
        {
        for(j=0;j<8;j++)
                ds1820wr(str1[j]);                //發送18B20的序列號,先發送低字節
        }
        if(a==2)
        {
        for(j=0;j<8;j++)
                ds1820wr(str2[j]);                //發送18B20的序列號,先發送低字節
        }

}
read_temp(uchar z)/*讀取溫度值并轉換*/
{        uchar a,b;
        float tt;
        ds1820rst();   
        ds1820wr(0xcc);                        //讀序列號
        ds1820rst();
        if(z==1)
        {
                b20_Matchrom(1);                 //匹配ROM 1
        }
        if(z==2)
        {
                b20_Matchrom(2);                 //匹配ROM         2
        }
        ds1820wr(0x44);//啟動溫度轉換
        delay1ms(5);
        ds1820rst();   
        ds1820wr(0xcc);                                //讀序列號
        ds1820rst();
        if(z==1)
        {
                b20_Matchrom(1);                            //匹配ROM 1
        }
        if(z==2)
        {
                b20_Matchrom(2);                                //匹配ROM         2
        }
        ds1820wr(0xbe);//讀取溫度
        a=ds1820rd();
        b=ds1820rd();
        tvalue=b;
        tvalue<<=8;
        tvalue=tvalue|a;
    if(tvalue<0x0fff)
    tflag=0;
    else
                   {        tvalue=~tvalue+1;
                tflag=1;
                 }
        tt=tvalue*0.0625;
        tvalue=tt*10;
        return(tvalue);
}

/*****************顯示函數******************************/
void ds1820disp(uchar z)//溫度值顯示
{    uchar flagdat;
     disdata[0]=tvalue/1000+0x30;//百位數
     disdata[1]=tvalue%1000/100+0x30;//十位數
     disdata[2]=tvalue%100/10+0x30;//個位數
     disdata[3]=tvalue%10+0x30;//小數位
   
     if(tflag==0)
     flagdat=0x20;//正溫度不顯示符號
     else
       flagdat=0x2d;//負溫度顯示負號:-

     if(disdata[0]==0x30)
    {disdata[0]=0x20;//如果百位為0,不顯示
   if(disdata[1]==0x30)
    {disdata[1]=0x20;//如果百位為0,十位為0也不顯示
    }
   }
  if(z==1)
    {
    wr_com(0x82);
    wr_dat(flagdat);//顯示符號位
    wr_com(0x83);
    wr_dat(disdata[0]);//顯示百位
    wr_com(0x84);
    wr_dat(disdata[1]);//顯示十位
    wr_com(0x85);
    wr_dat(disdata[2]);//顯示個位
    wr_com(0x86);
    wr_dat(0x2e);//顯示小數點
    wr_com(0x87);
    wr_dat(disdata[3]);//顯示小數位
   }
  if(z==2)
    {
    wr_com(0xc2);
    wr_dat(flagdat);//顯示符號位
    wr_com(0xc3);
    wr_dat(disdata[0]);//顯示百位
    wr_com(0xc4);
    wr_dat(disdata[1]);//顯示十位
    wr_com(0xc5);
    wr_dat(disdata[2]);//顯示個位
    wr_com(0xc6);
    wr_dat(0x2e);//顯示小數點
    wr_com(0xc7);
    wr_dat(disdata[3]);//顯示小數位
   }
}
/********************主程序***********************************/
void main()
{
        lcd_init();//初始化顯示
    while(1)
    {
                 read_temp(1);//讀取溫度
                 ds1820disp(1);//顯示
                read_temp(2);//讀取溫度
                ds1820disp(2);//顯示
//                delay1ms(10000);
  }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:458679 發表于 2019-1-18 19:58 | 只看該作者
感謝分享,很有用
回復

使用道具 舉報

板凳
ID:408809 發表于 2019-12-7 15:38 | 只看該作者
謝謝樓主,你最優秀
回復

使用道具 舉報

地板
ID:778262 發表于 2020-6-15 05:40 來自手機 | 只看該作者
感謝樓主幫我把想法變成現實!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文成人无字幕乱码精品 | 国产成人精品综合 | 特级一级黄色片 | 在线观看免费福利 | 亚洲国产电影 | 久久一区二区三区电影 | 国产www. | 中文字幕一区在线 | 成人在线不卡 | 在线观看成人 | 天天玩天天干天天操 | 在线欧美一区 | 国产精品网址 | 日韩一区二区三区在线 | 国产日韩欧美在线 | 免费毛片网 | 精品国产一区二区三区久久 | caoporn免费在线视频 | 黄色毛片大全 | 免费av在线网站 | 国产精品久久二区 | 香蕉视频久久久 | av一区二区三区四区 | 伊人免费网 | 精品一区二区三区91 | 99精品热视频 | 亚洲码欧美码一区二区三区 | 国产午夜精品一区二区三区嫩草 | 久久亚洲91| 精品一区视频 | 久久久久国产一区二区三区不卡 | 久久久国产精品视频 | 久久久久久久久国产 | 2018国产大陆天天弄 | 日本久久精品视频 | 国产成人精品一区二区三区视频 | 一本一道久久a久久精品综合蜜臀 | 欧美日韩久久精品 | 色婷婷综合久久久中文字幕 | 午夜精品久久久久久久 | 理论片午午伦夜理片影院 |