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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2156|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

求助,基于單片機(jī)的2個(gè)DS18B20測溫LCD1602顯示按鍵控制報(bào)警

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P0^0;//ds18b20    與單片機(jī)連接口
sbit DQ2=P0^1;//ds18b20    與單片機(jī)連接口
//sbit DS=P2^0;
  sbit RS=P1^5;
  sbit RW=P1^6;
  sbit EN=P1^7;
  sbit KEY1=P2^0;
  sbit KEY2=P2^1;
  sbit KEY3=P2^2;
  sbit BEEP=P2^3;
  sbit Switch=P2^6;
  uchar code str[]={"Temperature 1:"};
  uchar code str1[]={"TH 1:           "};
  uchar code str2[]={"TL 1:           "};
  uchar code str3[]={"Temperature 2:"};
  uchar code str4[]={"TH 2:           "};
  uchar code str5[]={"TL 2:           "};
  uchar data disdata[5];
  uchar mode=0;
  char  mode2=0;
  char H_temp=35;
  char L_temp=1;
  char H_temp2=40;  
  char L_temp2=20;
  uint tvalue;//溫度值
  uchar tflag;//溫度正負(fù)標(biāo)志
/*****************************lcd1602程序******************************/
void delay1ms(uint ms)//延時(shí)1毫秒(不夠精確的)
{
    uchar i;
    uchar 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;
    P3=com;
    delay1ms(1);
    EN=1;
    delay1ms(1);
    EN=0;
}

void wr_dat(uchar dat)//寫數(shù)據(jù)//
{
    delay1ms(1);
    RS=1;
    RW=0;
    EN=0;
    P3=dat;
    delay1ms(1);
    EN=1;
    delay1ms(1);
    EN=0;
}

void lcd_init()//初始化設(shè)置//
{
    delay1ms(15);
    wr_com(0x38);   //數(shù)據(jù)總線為8位,顯示2行,5*7點(diǎn)陣/每字符
    delay1ms(5);
    wr_com(0x08);   //顯示功能關(guān),無光標(biāo),光標(biāo)不閃爍
    delay1ms(5);
    wr_com(0x01);   //清屏
    delay1ms(5);
    wr_com(0x06);   //寫入新數(shù)據(jù)后光標(biāo)右移,寫入新數(shù)據(jù)顯示屏不移動(dòng)
    delay1ms(5);
    wr_com(0x0c);   //顯示功能開,無光標(biāo),光標(biāo)不閃爍
    delay1ms(5);
}

void display(uchar*p)//顯示
{
    while(*p!='\0')
      {
          wr_dat(*p);
          p++;
          delay1ms(1);
       }
}

void init_play(uchar st)//初始化顯示
{

    wr_com(0x80);
    switch(st)
    {
     case 0:display(str);break;
     case 1:display(str1);break;
     case 2:display(str2);break;
     case 3:display(str3);break;
     case 4:display(str4);break;
     case 5:display(str5);break;
     }
}

/***********************ds1820程序******************************/
void delay_18B20(uint i)//延時(shí)1微秒
{
   while(i--);
}
void ds1820rst(bit flag)/*ds1820復(fù)位*/
{
    uchar x=0;
    if(flag==0)
    {
    DQ=1;     //DQ復(fù)位
    delay_18B20(4);     //延時(shí)
    DQ=0;     //DQ拉低
    delay_18B20(100);   //精確延時(shí)大于480us
    DQ=1;     //DQ拉高
    delay_18B20(40);
    }
    if(flag==1)
    {
    DQ2=1;     //DQ復(fù)位
    delay_18B20(4);     //延時(shí)
    DQ2=0;     //DQ拉低
    delay_18B20(100);   //精確延時(shí)大于480us
    DQ2=1;     //DQ拉高
    delay_18B20(40);
    }
}
/*******************************18B20讀數(shù)據(jù)******************************/
uchar ds1820rd(bit flag)/*讀數(shù)據(jù)*/
{
    uchar i=0;
    uchar dat=0;
    if(flag==00)
    {
      for(i=8;i>0;i--)
     {
         DQ=0;    //給脈沖信號
         dat>>=1;
         DQ=1;    //給脈沖信號
         if(DQ)
         dat|=0x80;
         delay_18B20(10);
      }
     }
     if(flag==1)
     {
      for(i=8;i>0;i--)
      {
         DQ2=0;    //給脈沖信號
         dat>>=1;
         DQ2=1;    //給脈沖信號
         if(DQ2)
         dat|=0x80;
         delay_18B20(10);
       }
      }
           return(dat);
}
/********************************18b20寫數(shù)據(jù)***************************/

void ds1820wr(uchar wdata,bit flag)/*寫數(shù)據(jù)*/
{
     uchar i=0;
     if(flag==0)
     {
      for(i=8;i>0;i--)
     {
         DQ=0;  
         DQ=wdata&0x01;
         delay_18B20(10);
         DQ=1;
         wdata>>=1;
      }
     }
         if(flag==1)
      {
       for(i=8;i>0;i--)
      {
         DQ2=0;  
         DQ2=wdata&0x01;
         delay_18B20(10);
         DQ2=1;
         wdata>>=1;
       }
      }
}
/*********************************讀溫度并轉(zhuǎn)換**************************/

uint read_temp(bit flag)/*讀取溫度值并轉(zhuǎn)換*/
{
    uchar a,b;
    ds1820rst(flag);
    ds1820wr(0xcc,flag);//*跳過讀序列號,跳過讀ROM (ccH)*/
    ds1820wr(0x44,flag);//*啟動(dòng)溫度轉(zhuǎn)換(44H)*/
    ds1820rst(flag);
    ds1820wr(0xcc,flag);//*跳過讀序列號*/
    ds1820wr(0xbe,flag);//*讀取溫度*/
    a=ds1820rd(flag);
    b=ds1820rd(flag);
    tvalue=b;
    tvalue<<=8;
    tvalue=tvalue|a;
   if(tvalue<0x0fff)   //如果為正,最高五位皆為0,只有后十一位可能為1,肯定會(huì)小于0x0fff;若為負(fù),最高5位皆為1,必定大于0x0fff
      tflag=0;
   else                //即使測得溫度為負(fù),tvalue也為正值,但符號位為1.
     {
        tvalue=~tvalue+1;
        tflag=1;
      }
        tvalue=tvalue*(0.625);//溫度值擴(kuò)大10倍,精確到1位小數(shù);此處所乘本該為0.0625
        return(tvalue);
  }
/****************************顯示溫度**********************************/

void ds1820disp()//溫度值在LCD顯示
{
    uchar flagdat;
    disdata[0]=tvalue/1000+0x30;
    disdata[1]=tvalue%1000/100+0x30;//十位數(shù)
    disdata[2]=tvalue%100/10+0x30;//個(gè)位數(shù)
    disdata[3]=tvalue%10+0x30;//小數(shù)位
    if(tflag==0)
        flagdat=0x20;    /*正溫度不顯示符號,0x20對應(yīng)為空白,可以從1602字符代碼表中查找相關(guān)字符所對應(yīng)的數(shù)值*/
      else
        flagdat=0x2d;    //負(fù)溫度顯示負(fù)號:-
      if(disdata[0]==0x30)
      {
        disdata[0]=0x20;//如果百位為0,不顯示
        if(disdata[1]==0x30)
        {
        disdata[0]=0x20;//如果百位為0,十位為0也不顯示
       }
      }
          wr_com(0xc0);    //設(shè)置下一個(gè)要存入數(shù)據(jù)的CGRAM的地址,即40H單元(40H+80H=C0H),即第二行第一個(gè)字節(jié)(每行可以顯示16個(gè)字符,可以顯示兩行,即1602
          wr_dat(flagdat);//顯示符號位
          wr_com(0xc1);    //下一個(gè)數(shù)據(jù)顯示在第二行第二個(gè)字節(jié)
          wr_dat(disdata[0]);//顯示百位
          wr_com(0xc2);    //下一個(gè)數(shù)據(jù)顯示在第二行第三個(gè)字節(jié)
          wr_dat(disdata[1]);//顯示十位
          wr_com(0xc3);    //下一個(gè)數(shù)據(jù)顯示在第二行第四個(gè)字節(jié)
          wr_dat(disdata[2]);//顯示個(gè)位
          wr_com(0xc4);    //下一個(gè)數(shù)據(jù)顯示在第二行第五個(gè)字節(jié)
          wr_dat(0x2e);//顯示小數(shù)點(diǎn)
          wr_com(0xc5);    //下一個(gè)數(shù)據(jù)顯示在第二行第六個(gè)字節(jié)
          wr_dat(disdata[3]);//顯示小數(shù)位
          wr_com(0xc6);   
          wr_dat(0xdf);
          wr_com(0xc7);   
          wr_dat(0x43);
    }
/****************************************掃描按鍵*********************************/
uchar key_scan()
{
    uchar key_back;
     key_back=0;
       if(!KEY1|!KEY2|!KEY3)
        {
            delay1ms(5);
            if(!KEY1|!KEY2|!KEY3)
            {
             if(!KEY1)
                 key_back=1;
             else if(!KEY2)
                 key_back=2;
             else if(!KEY3)
                 key_back=3;
             while(!KEY1|!KEY2|!KEY3);//等待按鍵釋放
             }
         }
         return key_back;
}     
/********************************************函數(shù)功能:按鍵處理***************************/

void key_action(uchar key_back)
{
   if(Switch==0)
{
   if(key_back==1)  
     {mode++;
      if(mode>2)
      mode=0;
      }
      else if(key_back==2)
      {if(mode==1)
         { H_temp++;
            if(H_temp>125)
            H_temp=125;
          }
          else if(mode==2)
          {L_temp++;
              if(L_temp>125)
           L_temp=125;
           }
        }
       else if(key_back==3)
       {if(mode==1)
          {H_temp--;
           if(H_temp<-50)
           H_temp=-50;
           }
           else if(mode==2)
           {L_temp--;
             if(L_temp<-50)
                  L_temp=-50;
            }
          }
      }
      if(Switch==1)
      {
       if(key_back==1)
      { mode2++;
         if(mode2>2)
      mode2=0;
      }
      else if(key_back==2)
      {if(mode2==1)
         { H_temp2++;
          if(H_temp2>125)
            H_temp2=125;
          }
          else if(mode2==2)
          {L_temp++;
              if(L_temp2>125)
           L_temp2=125;
           }
        }
       else if(key_back==3)
       {if(mode2==1)
          {H_temp2--;
           if(H_temp2<-50)
           H_temp2=-50;
           }
           else if(mode2==2)
           {L_temp2--;
             if(L_temp2<-50)
                  L_temp2=-50;
        }
       }
   }
}

/*************************************顯示數(shù)據(jù)處理***************************************/
void dispaly_transaction()
{
    if(Switch==0)/*如果撥動(dòng)開關(guān)關(guān)閉,則調(diào)整顯示傳感器1相關(guān)數(shù)據(jù)*/
     {
       if(mode==0)//模式0,正常 顯示傳感器測得溫度
        {
          init_play(0);
          read_temp(0);//讀取溫度
          ds1820disp();//顯示
         }
         if(mode==1)     //模式1,顯示高溫限值TH1
         {
           init_play(1);
           tvalue=H_temp*10;
           if(H_temp<0)
               tflag=1;
           else
               tflag=0;
           ds1820disp();//顯示
          }
          if(mode==2)    //模式2,顯示低溫限值TH1
          {
            init_play(2);
            tvalue=L_temp*10;
            if(L_temp<0)
                tflag=1;
            else
                tflag=0;
            ds1820disp();//顯示
           }
          }
          else          /*撥動(dòng)開關(guān)開,則顯示溫度傳感器2相關(guān)數(shù)據(jù)*/
          {
           if(mode==0)   //模式0,正常顯示傳感器測得溫度
           {
            init_play(3);
            read_temp(1);//讀取溫度
            ds1820disp();//顯示
            }
            if(mode2==1)//模式1,顯示高溫限值TH1
            {
             init_play(4);
             tvalue=H_temp2*10;
             if(H_temp<0)
                tflag=1;
             else
                tflag=0;
             ds1820disp();//顯示
             }
             if(mode2==2)//模式2,顯示低溫限值TH1
             {
             init_play(5);
             tvalue=L_temp2*10;
             if(L_temp<0)
                 tflag=1;
             else
                  tflag=0;
            ds1820disp();//顯示
            }
         }
}
/**************************************蜂鳴器程序*****************************************/

void beep(void)   //500Hz頻率聲音 T=2ms  方波信號
{
     int i;
     for(i=0;i<100;i++)
       {
         BEEP=0;
         delay1ms(4);
         BEEP=1;
         delay1ms(4);
        }
}
/**************************************函數(shù)功能:檢查報(bào)警**************************************/
void check_alarm(void)
{
              //判斷傳感器1是否報(bào)警
    read_temp(0);//讀取溫度
    if(tflag==0)
    {
      if(((tvalue/10.0)>=H_temp)||((tvalue/10.0)<=L_temp))
       {
          delay1ms(10);
          read_temp(0);
          if(tflag==0)
            {
              if(((tvalue/10.0)>=H_temp)||((tvalue/10.0)<=L_temp))
                    beep();
             }
         }
      }
      if(tflag==1)
      {
      tvalue=-tvalue;
      if(((tvalue/10.0)>=H_temp)||((tvalue/10.0)<=L_temp))
        {
          delay1ms(10);
          read_temp(0);
          if(tflag==1)
         {
           tvalue=-tvalue;
           if(((tvalue/10.0)>=H_temp)||((tvalue/10.0)<=L_temp))
                beep();
          }
       }
     }
              //判斷傳感器2是否報(bào)警
    read_temp(1);//讀取溫度
    if(tflag==0)
    {
      if(((tvalue/10.0)>=H_temp2)||((tvalue/10.0)<=L_temp2))
       {
          delay1ms(10);
          read_temp(1);
          if(tflag==0)
            {
              if(((tvalue/10.0)>=H_temp2)||((tvalue/10.0)<=L_temp2))
                 {  
                  beep();
                  }
              }
         }
     }
     if(tflag==1)
     {
      tvalue=-tvalue;
      if(((tvalue/10.0)>=H_temp2)||((tvalue/10.0)<=L_temp2))
        {
          delay1ms(10);
          read_temp(1);
          if(tflag==1)
         {
           tvalue=-tvalue;
           if(((tvalue/10.0)>=H_temp2)||((tvalue/10.0)<=L_temp2))
             {
                  beep();
          }
         }
       }
     }
}

/*****************************************主程序**********************************************/
void main()
  {
     uchar Key_Back;
     BEEP=0;
     lcd_init();
     while(1)
       {
          Key_Back=key_scan();

          if(Key_Back)
          key_action(Key_Back);

          display_transcation();
          check_alarm();
        }
    }
這是程序,幫忙修改一下

仿真圖.PNG (40.79 KB, 下載次數(shù): 40)

仿真圖

仿真圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:494382 發(fā)表于 2019-4-24 16:55 | 只看該作者
如果是兩個(gè)DS18B20只占用一個(gè)IO口 怎么寫程序呢 在1602上顯示兩個(gè)溫度
回復(fù)

使用道具 舉報(bào)

板凳
ID:518089 發(fā)表于 2019-5-4 21:41 | 只看該作者
樓主解決了嗎,我正在做這個(gè),想請教一下
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 超级碰在线| 国产综合久久 | 久久av一区二区三区 | 精品久久久久久久久久久久 | 99这里只有精品 | 美女视频黄的免费 | 免费看国产a | 亚洲一区中文字幕 | 国产午夜精品一区二区三区嫩草 | 视频一区在线观看 | 一二三区在线 | 国产一二三区电影 | 夜夜夜夜夜夜曰天天天 | 91精品在线观看入口 | 欧美全黄 | 成人一区二区三区在线观看 | av一区二区三区四区 | 一区二区三区回区在观看免费视频 | 日本一区二区不卡 | 狠狠综合网 | 在线中文视频 | 亚洲国产一区二区三区在线观看 | 欧美成人猛片aaaaaaa | 亚洲最新在线 | 亚洲91视频 | 99国产精品99久久久久久 | 国产精品99久久久久久人 | 一区二区三区视频在线观看 | 亚洲在线| 久久精品国产一区二区三区不卡 | 黑人一级片视频 | 日本成年免费网站 | 九九热久久免费视频 | 免费在线国产视频 | 日韩一二三区视频 | 日韩中文字幕视频在线观看 | 亚洲午夜视频 | 国产精品成人久久久久 | 视频一区二区在线观看 | 成人在线 | 欧美黑人国产人伦爽爽爽 |