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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3738|回復(fù): 1
收起左側(cè)

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

[復(fù)制鏈接]
ID:921535 發(fā)表于 2021-5-26 08:15 | 顯示全部樓層 |閱讀模式
LCD1602顯示DS18B20采集的溫度,附件包含完整程序及仿真設(shè)計
51hei.png

單片機源程序如下:
  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數(shù)據(jù)口
  8. sbit LCD_RS=P2^0;
  9. sbit LCD_RW=P2^1;
  10. sbit LCD_E=P2^2;       
  11. void delay_n40us(uint n);          //函數(shù)申明
  12. uint ReadTemperature(void);   //函數(shù)申明
  13. void Delay_DS18B20(int num);   //函數(shù)申明                                  



  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;//產(chǎn)生下降沿
  22. delay_n40us(1);//實踐證明,我的LCD1602 上,用for 循環(huán)1 次就能完成普通寫指令。
  23. }


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


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



  44. //********延時函數(shù)***************
  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++); //在這個延時循環(huán)函數(shù)中我只做了2次循環(huán),
  50. } //實踐證明我的LCD1602 上普
  51. //通的指令只需1次循環(huán)就能可靠完成。

  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;                                //給復(fù)位脈沖
  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讀一個字節(jié)
  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;     // 給復(fù)位脈沖信號
  81.     DQ = 1;     // 拉高電平確實讀給脈沖信號
  82.         x=DQ;                //讀總線輸出一位數(shù)據(jù)
  83.     if(x)
  84.     dat|=0x80; //高電平保存數(shù)據(jù)
  85.     Delay_DS18B20(5);//等待75us
  86. }
  87. return (dat); //返回讀出的十進制數(shù)據(jù)
  88. }


  89. //*********向1820寫一個字節(jié)
  90. void WriteOneChar(unsigned char dat)
  91. {
  92. unsigned char i=0;
  93.   for (i=8; i>0; i--)
  94.   {
  95.     DQ = 0;                        // 給復(fù)位脈沖信號
  96.     DQ = dat&0x01;        //寫入一位數(shù)據(jù)
  97.     Delay_DS18B20(5); //等待75微妙確保數(shù)據(jù)寫入
  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);  //啟動溫度轉(zhuǎn)換
  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);//第一行寫入數(shù)據(jù)
  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. //主函數(shù)
  193. void main(void)
  194. {
  195.    Init_DS18B20();
  196.    while(1)
  197.    {
  198.    Disp_Temperature();
  199.         }
  200.   
  201. }
復(fù)制代碼

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

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:520434 發(fā)表于 2021-6-4 14:42 | 顯示全部樓層
Proteus8.8可以 但是protues8.9版本lcd無法顯示,DS180也是沒辦法運行的
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产视频 | av影片在线观看 | 在线看av网址| 欧美一区二 | av少妇| 国产无限资源 | 国产一级网站 | 亚洲综合区 | 青青草免费在线观看 | 中文字幕欧美激情 | 成人午夜激情 | 在线免费看毛片 | 成人黄色大片 | 黄色一级免费 | 国产精品成人一区二区 | 日日干天天干 | 中文字幕亚洲综合 | 99热最新网址 | 操出白浆视频 | 欧美午夜精品 | 亚洲精品第一 | 欧美在线免费 | 成人网在线 | 中文字幕免费观看视频 | 欧美久久久久 | 午夜免费福利视频 | 九九久久久 | 国产激情一区 | aaa国产精品 | 日本特级黄色片 | 黄色在线播放 | 国产a一级 | 香蕉视频网站 | 亚洲第一伊人 | 国产强伦人妻毛片 | 黄色在线免费看 | 成人一级片| 中文字幕色哟哟 | 波多野吉衣一二三区乱码 | 亚洲黄色小视频 | 91操操操|