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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+DS18B20與LCD1602應用編程

[復制鏈接]
跳轉到指定樓層
樓主
溫度信息的采集與顯示電路如所示,可以看到DS18B20數據口接在了單片機的P22上。在LCD第二行顯示"temp:",后面跟溫度,第一行不顯示。
使用元件:51單片機+DS18B20+LCD1602


單片機源程序如下:
  1. #include <reg52.H>
  2. #include <intrins.H>
  3. #include <math.H>

  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit dula = P2^6;
  7. sbit wela = P2^7;
  8. sbit rw = P3^6;
  9. sbit RS = P3^5;  
  10.   
  11. sbit LCDEN = P3^4;

  12. void delayUs()
  13. {
  14.     _nop_();
  15. }

  16. void delayMs(uint a)
  17. {
  18.     uint i, j;
  19.     for(i = a; i > 0; i--)
  20.         for(j = 100; j > 0; j--);
  21. }


  22. void writeComm(uchar comm)
  23. {
  24.      RS = 0;   
  25.     P0 = comm;
  26.     LCDEN = 1;
  27.      delayUs();
  28.     LCDEN = 0;
  29.     delayMs(1);
  30. }

  31. //寫數據:RS=1, RW=0;
  32. void writeData(uchar dat)
  33. {
  34.      RS = 1;
  35.      P0 = dat;
  36.      LCDEN = 1;
  37.     delayUs();
  38.     LCDEN = 0;
  39.     delayMs(1);
  40. }


  41. void init()
  42. {
  43.      rw = 0;
  44.      dula = wela = 0;
  45.     writeComm(0x38);
  46.    writeComm(0x0c);
  47.     writeComm(0x06);
  48.     writeComm(0x01);
  49. }

  50. void writeString(uchar * str, uchar length)
  51. {
  52.      uchar i;
  53.     for(i = 0; i < length; i++)
  54.     {
  55.          writeData(str[i]);
  56.      }
  57. }

  58. /**//*****************************DS18B20*******************************/
  59. sbit ds = P2^2;
  60. void dsInit()
  61. {
  62.    
  63.     unsigned int i;  
  64.     ds = 0;
  65.     i = 100;  
  66.      while(i>0) i--;
  67.     ds = 1;   
  68.     i = 4;
  69.      while(i>0) i--;
  70. }

  71. void dsWait()
  72. {
  73.       unsigned int i;
  74.       while(ds);  
  75.       while(~ds);
  76.       i = 4;
  77.       while(i > 0) i--;
  78. }


  79. bit readBit()
  80. {
  81.     unsigned int i;
  82.     bit b;
  83.     ds = 0;
  84.     i++;   
  85.     ds = 1;
  86.    i++; i++;  
  87.     b = ds;
  88.     i = 8;
  89.     while(i>0) i--;
  90.     return b;
  91. }

  92. unsigned char readByte()
  93. {
  94.     unsigned int i;
  95.     unsigned char j, dat;
  96.    dat = 0;
  97.     for(i=0; i<8; i++)
  98.     {
  99.         j = readBit();
  100.       
  101.         dat = (j << 7) | (dat >> 1);
  102.     }
  103.     return dat;
  104. }


  105. void writeByte(unsigned char dat)
  106. {
  107.     unsigned int i;
  108.     unsigned char j;
  109.     bit b;
  110.     for(j = 0; j < 8; j++)
  111.     {
  112.         b = dat & 0x01;
  113.         dat >>= 1;
  114.    
  115.         if(b)   
  116.         {
  117.            ds = 0;          i++; i++;  
  118.             ds = 1;   
  119.             i = 8; while(i>0) i--;  
  120.         }
  121.         else  
  122.         {
  123.             ds = 0;
  124.           i = 8; while(i>0) i--;  
  125.             ds = 1;
  126.            i++; i++;
  127.         }
  128.    }
  129. }


  130. void sendChangeCmd()
  131. {
  132.     dsInit();   
  133.     dsWait();   
  134.     delayMs(1);   
  135.     writeByte(0xcc);
  136.     writeByte(0x44);
  137. }

  138. void sendReadCmd()
  139. {
  140.     dsInit();
  141.     dsWait();
  142.     delayMs(1);
  143.     writeByte(0xcc);
  144.     writeByte(0xbe);
  145. }


  146. int getTmpValue()
  147. {
  148.     unsigned int tmpvalue;
  149.     int value;
  150.     float t;
  151.     unsigned char low, high;
  152.     sendReadCmd();
  153.    
  154.     low = readByte();
  155.     high = readByte();
  156.    
  157.     tmpvalue = high;
  158.     tmpvalue <<= 8;
  159.     tmpvalue |= low;
  160.     value = tmpvalue;
  161.    
  162.   \
  163.     t = value * 0.0625;
  164.     \
  165.     value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0減0.5
  166.     return value;
  167. }

  168. void display(int v)
  169. {
  170.     unsigned char count;
  171.     unsigned char datas[] = {0, 0, 0, 0, 0};
  172.     unsigned int tmp = abs(v);
  173.     datas[0] = tmp / 10000;
  174.     datas[1] = tmp % 10000 / 1000;
  175.     datas[2] = tmp % 1000 / 100;
  176.     datas[3] = tmp % 100 / 10;
  177.     datas[4] = tmp % 10;
  178.     writeComm(0xc0+6);   //第二行開頭顯示0xc0+0  第二行末尾顯示0xc0+10
  179.                                      //第一行緊跟0x80+6
  180.                                      //第二行緊跟0xc0+6
  181.     if(v < 0)
  182.     {
  183.         writeString("- ", 1);
  184.    }
  185.     else
  186.     {
  187.        writeString("+ ", 1);
  188.     }
  189.     if(datas[0] != 0)
  190.     {
  191.         writeData('0'+datas[0]);
  192.     }
  193.     for(count = 1; count != 5; count++)
  194.     {
  195.         writeData('0'+datas[count]);
  196.         if(count == 2)
  197.         {
  198.             writeData('.');
  199.         }
  200.     }
  201. }
  202. /**//*****************************DS18B20*******************************/

  203. void main()
  204. {
  205.         uchar table[] = "temp:";    //temp:  temperature:
  206.     sendChangeCmd();
  207.     init();
  208.           writeComm(0xc0);
  209.     writeComm(0xc0);        //一行0x80  二行0xc0
  210.     writeString(table,5);   //5  12
  211.     while(1)
  212.     {
  213.         delayMs(1000); //溫度轉換時間需要750ms以上
  214.         writeComm(0xc0);
  215.         display(getTmpValue());
  216.         sendChangeCmd();
  217.     }
  218. }
復制代碼

Keil代碼與Proteus8.13版本的仿真下載(注意:不能兼容其他版本 只能用8.13打開):
溫度18B20與IIC總線.zip (97.17 KB, 下載次數: 20)



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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久无码国产精品一区 | 成人精品视频 | 国产精品夜夜春夜夜爽久久电影 | av片免费 | 男女视频在线免费观看 | 美女131mm久久爽爽免费 | 久久久久无码国产精品一区 | 国产农村妇女毛片精品久久麻豆 | aaaaa毛片| 在线免费观看黄a | 成人不卡 | 一区二区不卡 | 国产精品色| 一区二区三区回区在观看免费视频 | 色婷婷精品久久二区二区蜜臂av | 久久久国产视频 | 久久99蜜桃综合影院免费观看 | 天天干天天插天天 | 精品国产乱码久久久久久影片 | 成人在线播放网址 | 日本一二三区在线观看 | 久久亚洲国产精品 | 久久精品无码一区二区三区 | 毛片免费在线观看 | 成人精品一区二区户外勾搭野战 | 干干干操操操 | 一区二区免费在线观看 | 久久久精品影院 | 精品乱码一区二区 | 精品综合视频 | 99国产精品视频免费观看一公开 | 精品一区二区三区四区视频 | 精品国产网 | 精品综合视频 | 亚洲欧美在线视频 | 亚洲成人一区 | 一区二区三区亚洲 | 免费观看一级特黄欧美大片 | 欧美一级黄带 | 成人久久久久久久久 | 精品亚洲永久免费精品 |