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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機LCD1602顯示DS18B20采集的溫度程序(帶負溫度顯示)

[復制鏈接]
跳轉到指定樓層
樓主
LCD1602顯示DS18B20采集的溫度,附件包含完整程序及仿真設計


單片機源程序如下:
  1. #include <reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define ulong unsigned long
  5. #define uchar unsigned char           //宏定義
  6. sbit DQ = P3^7;                             //定義DS18B20總線I/O
  7. #define LCD_DB P1                                //定義LCD數據口
  8. sbit LCD_RS=P2^0;
  9. sbit LCD_RW=P2^1;
  10. sbit LCD_E=P2^2;       
  11. void delay_n40us(uint n);          //函數申明
  12. uint ReadTemperature(void);   //函數申明
  13. void Delay_DS18B20(int num);   //函數申明                                  



  14. //**********寫入LCD指令**********寫入命令****************
  15. void LCD_write_command(uchar dat)
  16. {
  17. LCD_DB=dat;
  18. LCD_RS=0;//指令
  19. LCD_RW=0;//寫入
  20. LCD_E=1;//允許
  21. LCD_E=0;//產生下降沿
  22. delay_n40us(1);//實踐證明,我的LCD1602 上,用for 循環1 次就能完成普通寫指令。
  23. }


  24. //*******************************
  25. //********再寫數據函數*****向1602中寫入數據********
  26. void LCD_write_data(uchar dat)
  27. {
  28. LCD_DB=dat;
  29. LCD_RS=1;//數據
  30. LCD_RW=0;//寫入
  31. LCD_E=1;//允許
  32. LCD_E=0;//產生下降沿
  33. delay_n40us(1);
  34. }


  35. //************8LCD初始化**************
  36. void LCD_init(void)
  37. {
  38. LCD_write_command(0x38);//設置8位格式,2行,5x7
  39. LCD_write_command(0x0c);//整體顯示,關光標,不閃爍
  40. LCD_write_command(0x06);//設定輸入方式,增量不移位--------------
  41. LCD_write_command(0x01);//清除屏幕顯示----------------
  42. delay_n40us(100);//實踐證明,我的LCD1602上,用for 循環200 次就能可靠完成清屏指令。
  43. }



  44. //********延時函數***************
  45. void delay_n40us(uint n)
  46. { uint i;
  47. uchar j;
  48. for(i=n;i>0;i--)
  49. for(j=0;j<2;j++); //在這個延時循環函數中我只做了2次循環,
  50. } //實踐證明我的LCD1602 上普
  51. //通的指令只需1次循環就能可靠完成。

  52. //*************88延時子程序
  53. void Delay_DS18B20(int num)
  54. {
  55.   while(num--) ;
  56. }
  57. //***********8初始化DS18B20
  58. void Init_DS18B20(void)
  59. {
  60.   bit q;
  61.     //DQ = 1;                                //把總線拿高
  62.         //Delay_DS18B20(1);            //15us
  63.         DQ = 0;                                //給復位脈沖
  64.         Delay_DS18B20(80);                //750us
  65.         DQ = 1;                                //把總線拿高 等待
  66.         Delay_DS18B20(8);                //120us
  67.         q = DQ;                                //讀取18b20初始化信號
  68.         Delay_DS18B20(30);                //等待450us確保初始化成功
  69.         DQ = 1;                                //把總線拿高 釋放總線*/

  70. }
  71. //***********從1820讀一個字節
  72. uchar ReadOneChar(void)
  73. {
  74.   unsigned char i=0;
  75.   uchar dat=0;
  76.   for (i=8;i>0;i--)
  77.   {
  78.     bit x;
  79.         dat>>=1;         //        右移一位
  80.     DQ = 0;     // 給復位脈沖信號
  81.     DQ = 1;     // 拉高電平確實讀給脈沖信號
  82.         x=DQ;                //讀總線輸出一位數據
  83.     if(x)
  84.     dat|=0x80; //高電平保存數據
  85.     Delay_DS18B20(5);//等待75us
  86. }
  87. return (dat); //返回讀出的十進制數據
  88. }


  89. //*********向1820寫一個字節
  90. void WriteOneChar(unsigned char dat)
  91. {
  92. unsigned char i=0;
  93.   for (i=8; i>0; i--)
  94.   {
  95.     DQ = 0;                        // 給復位脈沖信號
  96.     DQ = dat&0x01;        //寫入一位數據
  97.     Delay_DS18B20(5); //等待75微妙確保數據寫入
  98.     DQ = 1;                          //釋放總線為高電平
  99.     dat>>=1;
  100.   }
  101. }
  102. //讀取溫度
  103. uint ReadTemperature(void)
  104. {
  105.   uchar a=0;
  106.   uint t=0;
  107.   Init_DS18B20();
  108.   Delay_DS18B20(50);
  109.   WriteOneChar(0xCC);  //跳過讀序號列號的操作
  110.   WriteOneChar(0x44);  //啟動溫度轉換
  111.   Init_DS18B20();

  112.   WriteOneChar(0xCC);  //跳過讀序號列號的操作
  113.   WriteOneChar(0xBE);  //讀取溫度寄存器

  114.   a=ReadOneChar();     //讀低8位
  115.   t=ReadOneChar();    //讀高8位
  116. t <<= 8;
  117. t|=a;
  118.   return(t);
  119. }

  120. //延時子程序
  121. void Delay(int num)
  122. {
  123. while( --num );
  124. }

  125. //顯示溫度子程序
  126. void Disp_Temperature(void)     //顯示溫度
  127. {
  128.    uint h;
  129.         int feng,ge,shi,bai;

  130.           LCD_init();                          //LCD初始化
  131.           LCD_write_command(0x80);//第一行寫入數據
  132.           LCD_write_data('T');          //寫T
  133.           delay_n40us(15000);          //延遲
  134.           LCD_write_data('e');
  135.           delay_n40us(15000);
  136.           LCD_write_data('m');
  137.           delay_n40us(15000);
  138.           LCD_write_data('p');
  139.           delay_n40us(15000);
  140.           LCD_write_data(':');
  141.           delay_n40us(15000);



  142.           h= ReadTemperature();
  143.           if(h<=0x07d0)                  //判斷溫度為正
  144.         {
  145.         h*=0.625;
  146.         bai=h/1000;                     
  147.         feng=h%10;
  148.         ge=h/10%10;
  149.         shi=h/100;
  150.           LCD_write_command(0x80+5);  //從第一行第六個開始顯示
  151.           LCD_write_data(0x30+bai);
  152.           delay_n40us(15000);
  153.   
  154.       LCD_write_command(0x80+6);
  155.           LCD_write_data(0x30+shi);
  156.           delay_n40us(15000);
  157.           LCD_write_data(0x30+ge);
  158.           delay_n40us(15000);
  159.           LCD_write_data('.');
  160.           delay_n40us(15000);
  161.           LCD_write_data(0x30+feng);
  162.           delay_n40us(15000);
  163.           }
  164.           else                                          //溫度為負時
  165.           {
  166.           h=h-1;                                  //減1取反
  167.           h=(~h);
  168.           h*=0.625;
  169.                                
  170.         feng=h%10;
  171.         ge=h/10%10;
  172.         shi=h/100;
  173.           LCD_write_command(0x80+5);  
  174.           LCD_write_data('-');               
  175.           delay_n40us(15000);
  176.   
  177.           LCD_write_data(0x30+shi);
  178.           delay_n40us(15000);
  179.           LCD_write_data(0x30+ge);
  180.           delay_n40us(150000);
  181.           LCD_write_data('.');
  182.           delay_n40us(1500);
  183.           LCD_write_data(0x30+feng);
  184.           delay_n40us(15000);
  185.           }

  186.           //*************顯示C*************
  187.           LCD_write_command(0x80+10);
  188.           LCD_write_data('C');
  189.           delay_n40us(15000);
  190.           

  191. }

  192. //主函數
  193. void main(void)
  194. {
  195.    Init_DS18B20();
  196.    while(1)
  197.    {
  198.    Disp_Temperature();
  199.         }
  200.   
  201. }
復制代碼

所有資料51hei提供下載:
LCD1602顯示DS18B20采集的溫度.zip (357.22 KB, 下載次數: 91)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:520434 發表于 2021-6-4 14:42 | 只看該作者
Proteus8.8可以 但是protues8.9版本lcd無法顯示,DS180也是沒辦法運行的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩免费 | 亚洲国产成人精品久久 | 秋霞a级毛片在线看 | 91视频久久久久 | 亚洲高清在线 | 夜夜爆操 | 99精品欧美一区二区三区综合在线 | 精品久久国产 | 国产精品国色综合久久 | 欧美一级高潮片免费的 | 成人午夜看片 | 91精品国产91久久久久久吃药 | 羞羞视频在线观看免费观看 | 日韩一区二区三区在线视频 | 国产一级视频在线观看 | 免费看国产一级特黄aaaa大片 | 日韩在线看片 | 中文字幕人成人 | 欧美国产91 | 中文字幕亚洲区一区二 | 国产日韩一区 | 亚洲成人自拍 | 国产一区二区精品在线 | 国产91丝袜在线播放 | 久久久久久久久久久久亚洲 | 香蕉久久久 | 午夜影院在线观看 | 成人欧美一区二区三区在线播放 | 久久国产一区二区 | 99精品视频一区二区三区 | www.亚洲一区 | 国产欧美一区二区三区在线看蜜臀 | www.887色视频免费 | 天天看天天干 | 亚洲一二三区av | 久久天天躁狠狠躁夜夜躁2014 | 亚洲一区久久 | 久久毛片| 极品粉嫩国产48尤物在线播放 | 亚洲精品一区二区三区 | 成人av播放|