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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stc89c52單片機+ds18b20+lcd1601溫度計程序

[復制鏈接]
跳轉到指定樓層
樓主
做了個溫度計,和大家分享下。
制作出來的實物圖如下:


單片機源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code table[]="TEMP :  ";
  5. uchar data disdata[5];//百、十、個、小數位
  6. sbit lcden=P1^1;        //液晶使能端
  7. sbit lcdrs=P1^0;        //液晶數據命令選擇端
  8. sbit DQ=P1^3;
  9. uint tvalue;       //溫度值
  10. uchar tflag;      //溫度正負標志
  11. // sbit lcdrw=P1^2;
  12. uchar num;
  13. void delay(uint z)
  14. {
  15.         uint x,y;
  16.         for(x=z;x>0;x--)
  17.                 for(y=110;y>0;y--);
  18. }
  19. void write_com(uchar com)
  20. {
  21.         lcdrs=0;
  22. //        lcdrw=0;
  23.         P0=com;
  24.         delay(5);
  25.         lcden=1;
  26.         delay(5);
  27.         lcden=0;
  28. }
  29. void write_data(uchar date)
  30. {
  31.         lcdrs=1;
  32. //        lcdrw=0;
  33.         P0=date;
  34.         delay(5);
  35.         lcden=1;
  36.         delay(5);
  37.         lcden=0;
  38. }
  39. void init()
  40. {
  41.        
  42.         lcden=0;
  43.         write_com(0x38);//設置16X2顯示,5X7點陣,8位數據接口
  44.         write_com(0x0c);//設置開顯示,不顯示光標
  45.         write_com(0x06);//寫一個字符后地址指針加1
  46.         write_com(0x01);//顯示清零,數據指針清零
  47.         delay(5);
  48. }

  49. /******************************ds18b20程序******************************************************************/
  50. void delay_18b20(uint i)//延時1微秒
  51. {
  52.      while(i--);
  53. }
  54. void ds18b20rst()  //ds18b20初始化子函數
  55.                    //要求"數據線拉高-延時-數據線拉低-延時大于480微妙-數據線拉高-延時等待"                     
  56. {
  57.      uchar x=0;
  58.      DQ = 1;      //信號線DQ復位
  59.     delay_18b20(4); //延時
  60.     DQ = 0;      //DQ拉低
  61.     delay_18b20(100); //精確延時大于480us
  62.      DQ = 1;      //拉高
  63.     delay_18b20(40);
  64. }
  65. void ds18b20wr(uchar wdata)/*寫數據子函數,無返回值,含參數*/

  66. {
  67.        uchar i=0;
  68.       for (i=8; i>0; i--)//要寫完一個字節,故需要重復8次以下操作
  69.      {
  70.        DQ = 0;         //數據線拉低
  71.       DQ = wdata&0x01;//wdata是一個形參,將其與0000 0001進行按位與
  72.                       //按從低到高的順序發送數據(一次發送一位)
  73.        delay_18b20(10);
  74.        DQ = 1;        //最后將數據線拉高
  75.       wdata>>=1;     //將wdata右移1位
  76.      }
  77. }
  78. uchar ds18b20rd()    //讀數據子函數,是有返回值dat
  79. {
  80.      uchar i=0;
  81.      uchar dat = 0;
  82.      for (i=8;i>0;i--)//要讀完一個字節,故需要重復8次以下操作
  83.      {

  84. DQ = 0;     //給脈沖信號
  85.         dat>>=1;
  86.          DQ = 1;     //給脈沖信號
  87.         if(DQ)
  88.          dat|=0x80;
  89.          delay_18b20(10);
  90.       }
  91.      return(dat);    //返回dat
  92. }
  93. read_temp()         //讀取溫度值并轉換的子函數,有返回值溫度值tvalue
  94. {
  95.      uchar a,b;
  96.      ds18b20rst();  //調用ds18b20初始化子函數
  97.     ds18b20wr(0xcc);//調用寫數據子函數,向ds18b20寫命令0xcc
  98.                      //ccH表示跳過ROM讀序列號,適用于單機工作,直接向18b20發送溫度變換命令
  99.     ds18b20wr(0x44);//調用寫數據子函數,向ds18b20寫命令0x44

  100. //44H表示啟動ds18b20溫度轉換,結果自行存入9字節的RAM中
  101.     ds18b20rst();   //調用ds18b20初始化子函數
  102.     ds18b20wr(0xcc);//同上
  103.     ds18b20wr(0xbe);//調用寫數據子函數,向ds18b20寫命令0xbe
  104.                      //beH表示讀取RAM中9字節的溫度數據
  105.     a=ds18b20rd(); //調用讀數據子函數,并將所得數據給a
  106.      b=ds18b20rd(); //
  107.      tvalue=b;      //把b的值給tvalue
  108.      tvalue<<=8;    //tvalue左移8位
  109.     tvalue=tvalue|a;//tvalue與a進行按位或
  110.     if(tvalue<0x0fff)//
  111.        tflag=0;      //前五位為0時,讀取的溫度為正,標志位為0,此時只要
  112.                     //將測得數值乘以0.0625即可得到實際溫度
  113.     else            //前五位為1時,讀取的溫度為負,標志位為1,此時需要
  114.     {              //將測得數值取反后再加1,再乘以0.0625即可得到實際溫度
  115.        tvalue=~tvalue+1;
  116.            tflag=1;     //此時表示負溫度

  117. }
  118.      tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數
  119.     return(tvalue); //返回溫度值
  120. }
  121. /*************************************************************************************************************/
  122. /************************溫度值顯示**************************************************************************/
  123. void ds18b20disp()//溫度值顯示
  124. {
  125.      uchar flagdat;
  126.      disdata[0]=tvalue/1000+0x30;    //百位數
  127.     disdata[1]=tvalue%1000/100+0x30;//十位數
  128.     disdata[2]=tvalue%100/10+0x30;  //個位數
  129.     disdata[3]=tvalue%10+0x30;     //小數位
  130.     if(tflag==0)
  131.        flagdat=0x2b;               //正溫度顯示符號:+
  132.      else

  133. flagdat=0x2d;               //負溫度顯示負號:-
  134.     if(disdata[0]==0x30)
  135.      {
  136.         disdata[0]=0x20;           //如果百位為0,不顯示
  137.         if(disdata[1]==0x30)
  138.           {
  139.              disdata[1]=0x20;     //如果百位為0,十位為0也不顯示
  140.          }
  141.      }
  142.      write_com(0x80+0x40);           //定位數據指針的位置:第二行第六個字符處
  143.     write_data(flagdat);             //顯示符號位
  144.     write_com(0x80+0x41);             //定位數據指針的位置:第二行第七個字符處
  145.     write_data(disdata[0]);         //顯示百位
  146.     write_com(0x80+0x42);             //定位數據指針的位置:第二行第八個字符處
  147.     write_data(disdata[1]);         //顯示十位
  148.     write_com(0x80+0x43);             //定位數據指針的位置:第二行第九個字符處
  149.     write_data(disdata[2]);         //顯示個位

  150. write_com(0x80+0x44);                 //定位數據指針的位置:第二行第十個字符處
  151.     write_data(0x2e);               //顯示小數點
  152.     write_com(0x80+0x45);             //定位數據指針的位置:第二行第十一個字符處
  153.     write_data(disdata[3]);         //顯示小數位
  154. }


  155. void main()
  156. {
  157.         init();
  158.         write_com(0x80);
  159.         for(num=0;num<8;num++)
  160.         {
  161.                 write_data(table[num]);
  162.                 delay(5);
  163.         }
  164.         while(1)
  165.      {
  166.          read_temp();          //調用ds18b20讀取溫度
  167.         ds18b20disp();        //調用溫度顯示子函數
  168.       }
  169. }
復制代碼

以上所有資料51hei提供打包下載:
ds18b20.rar (1.99 KB, 下載次數: 88)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:88606 發表于 2019-6-9 08:36 | 只看該作者
謝謝樓主!!!
回復

使用道具 舉報

板凳
ID:723965 發表于 2020-6-6 08:23 來自手機 | 只看該作者
可以做多路
回復

使用道具 舉報

地板
ID:149451 發表于 2022-3-16 06:55 | 只看該作者
樓主的標題、圖片是LCD1601,可程序卻是LCD1602D的,???
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费午夜电影 | 人人干人人超 | 亚洲视频免费在线观看 | 久久成人精品 | 偷拍亚洲色图 | 亚洲国产一区二区三区 | 欧美精品一区二区在线观看 | 一区二区三区四区免费在线观看 | 一区二区三区亚洲视频 | 一区二区在线不卡 | 91豆花视频 | 国产精品99视频 | 国产亚洲精品久久19p | 99精品欧美一区二区三区综合在线 | 国产精品久久久久久中文字 | 国产精品v | 精品国产91 | 国产精品久久一区 | 91精品国产一区二区三区香蕉 | 91在线资源 | 日韩精品视频在线 | 在线黄色网 | 精品一二三区 | 欧美一区在线视频 | 午夜影晥 | 国产精品美女久久久 | 毛片网站在线观看 | 一区欧美 | 欧美亚洲另类丝袜综合网动图 | 天天久久| 国产成人一区二区三区 | 天天夜干 | www.色综合| av成人在线观看 | 91热爆在线观看 | 手机在线观看 | 国产高清在线观看 | 成人免费视频观看视频 | 超碰免费在线 | 国产激情在线播放 | 国产一级黄色网 |