找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

基于STC12C5A60S2的DS18B20溫度顯示工程(LCD1602顯示)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
STC12C5A60S2單片機(jī)DS18B20溫度顯示工程(LCD1602顯示)的實(shí)物圖如下:

單片機(jī)源程序如下:
  1. #include<STC12C5A60S2.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
  2. #include<intrins.h>

  3. sbit RS = P1 ^ 0;   //定義端口
  4. sbit RW = P1 ^ 1;
  5. sbit EN = P2 ^ 5;
  6. sbit DS = P2 ^ 2;

  7. unsigned char code Table[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
  8. bit flag;
  9. unsigned char xdata a, b;

  10. #define DataPort P0


  11. /************************LCD1602函數(shù)************************/
  12. /******延時(shí)函數(shù)******/
  13. void DelayUs2x(unsigned char t)
  14. {   
  15.         while(--t);
  16. }
  17. /******延時(shí)函數(shù)******/
  18. void DelayMs(unsigned char t)
  19. {
  20.         while(t--)
  21.         {
  22.                 //大致延時(shí)1mS
  23.                 DelayUs2x(245);
  24.                 DelayUs2x(245);
  25.         }
  26. }
  27. /******判忙函數(shù)******/
  28. bit LCD_Check_Busy(void)
  29. {
  30.         DataPort = 0xFF;
  31.         RS = 0;
  32.         RW = 1;
  33.         EN = 0;
  34.         _nop_( );
  35.         EN = 1;
  36.         return (bit)(DataPort & 0x80);
  37. }
  38. /******寫入命令函數(shù)******/
  39. void LCD_Write_Com(unsigned char com)
  40. {  
  41.         while(LCD_Check_Busy( )); //忙則等待
  42.         RS = 0;
  43.         RW = 0;
  44.         EN = 1;
  45.         DataPort = com;
  46.         _nop_( );
  47.         EN = 0;
  48. }
  49. /******寫入數(shù)據(jù)函數(shù)******/
  50. void LCD_Write_Data(unsigned char Data)
  51. {
  52.         while(LCD_Check_Busy( )); //忙則等待
  53.         RS = 1;
  54.         RW = 0;
  55.         EN = 1;
  56.         DataPort = Data;
  57.         _nop_( );
  58.         EN = 0;
  59. }
  60. /******清屏函數(shù)******/
  61. void LCD_Clear(void)
  62. {
  63.         LCD_Write_Com(0x01);
  64.         DelayMs(5);
  65. }
  66. /******寫入字符串函數(shù)******/
  67. void LCD_Write_String(unsigned char x, unsigned char y, unsigned char *s)
  68. {     
  69.         if (y == 0)
  70.         {     
  71.                 LCD_Write_Com(0x80 + x);     //表示第一行
  72.         }
  73.         else
  74.         {      
  75.                 LCD_Write_Com(0xc0 + x);      //表示第二行
  76.         }        
  77.         while (*s)
  78.         {     
  79.                 LCD_Write_Data(*s);     
  80.                 s ++;     
  81.         }
  82. }
  83. /******寫入字符函數(shù)******/
  84. void LCD_Write_Char(unsigned char x, unsigned char y, unsigned char Data)
  85. {     
  86.         if (y == 0)
  87.         {     
  88.                 LCD_Write_Com(0x80 + x);     
  89.         }   
  90.         else
  91.         {     
  92.                 LCD_Write_Com(0xc0 + x);     
  93.         }        
  94.         LCD_Write_Data(Data);  
  95. }
  96. /******初始化函數(shù)******/
  97. void LCD_Init(void)
  98. {
  99.         LCD_Write_Com(0x38);    /*顯示模式設(shè)置*/
  100.         DelayMs(5);
  101.         LCD_Write_Com(0x38);
  102.         DelayMs(5);
  103.         LCD_Write_Com(0x38);
  104.         DelayMs(5);
  105.         LCD_Write_Com(0x38);  
  106.         LCD_Write_Com(0x08);    /*顯示關(guān)閉*/
  107.         LCD_Write_Com(0x01);    /*顯示清屏*/
  108.         LCD_Write_Com(0x06);    /*顯示光標(biāo)移動(dòng)設(shè)置*/
  109.         DelayMs(5);
  110.         LCD_Write_Com(0x0c);    /*顯示開及光標(biāo)設(shè)置*/
  111. }
  112.    

  113. /************************DS18B20函數(shù)************************/
  114. /******延時(shí)函數(shù)******/
  115. void DS18B20_Delay(unsigned int j)//延時(shí)j * 1us
  116. {
  117.         unsigned int i;
  118.         for(i = 0; i < j; i ++)
  119.         {
  120.                 _nop_( );//@11.0592M晶振(12M晶振:_nop_( );_nop_( );)
  121.         }
  122.         
  123. }
  124. /******初始化/復(fù)位函數(shù)******/
  125. void DS_Rest( )
  126. {
  127.         DS = 1;
  128.         DS18B20_Delay(60);
  129.         DS = 0;
  130.         DS18B20_Delay(700);
  131.         DS = 1;
  132.         DS18B20_Delay(150);
  133.         if(DS == 0)
  134.         {
  135.                 flag = 1;
  136.         }
  137.         else
  138.         {
  139.                 flag = 0;
  140.         }
  141.         DS18B20_Delay(200);
  142. }
  143. /******位讀取函數(shù)******/
  144. bit DS_Read_Bit( )
  145. {
  146.         bit Dat;
  147.         DS = 0;
  148.         _nop_( );_nop_( );
  149.         DS = 1;
  150.         _nop_( );
  151.         Dat = DS;
  152.         DS18B20_Delay(100);
  153.         return Dat;
  154. }
  155. /******字節(jié)讀取函數(shù)******/
  156. unsigned char DS_Read_Byte( )
  157. {
  158.         unsigned char idata i, j, k;
  159.         for(i = 0; i < 8; i ++)
  160.         {
  161.                 j = DS_Read_Bit( );
  162.                 k = (j << 7) | (k >> 1);
  163.         }
  164.         return k;
  165. }
  166. /******字節(jié)寫函數(shù)******/
  167. void DS_Write_Byte(unsigned char Dat)
  168. {
  169.         unsigned char idata i;
  170.         for(i = 0; i < 8; i ++)
  171.         {
  172.                 DS = 0;
  173.                 _nop_( );
  174.                 DS = Dat & 0x01;
  175.                 DS18B20_Delay(70);
  176.                 DS = 1;
  177.                 Dat >>= 1;
  178.         }
  179.         DS18B20_Delay(70);
  180. }
  181. /******讀取溫度數(shù)據(jù)函數(shù)******/
  182. void Read_Temperature( )
  183. {
  184.         unsigned char xdata tvalue_L, tvalue_H;
  185.         float num;
  186.         
  187.         DS_Rest( );
  188.         DS_Write_Byte(0xcc);
  189.         DS_Write_Byte(0xbe);
  190.         tvalue_L = DS_Read_Byte( );
  191.         tvalue_H = DS_Read_Byte( );
  192.         tvalue_H <<= 4;
  193.         tvalue_H += (tvalue_L & 0xf0) >> 4;
  194.         a = tvalue_H;
  195.         num = (tvalue_L & 0x0f) * 0.0625;
  196.         b = (unsigned char)(num * 100);
  197. }
  198. /******溫度顯示函數(shù)******/
  199. void DS18B20_Display( )
  200. {
  201.         LCD_Write_String(0, 0, "The Temperature:");
  202.         LCD_Write_Char(0, 1, Table[a / 10]);
  203.         LCD_Write_Char(1, 1, Table[a % 10]);
  204.         LCD_Write_Char(2, 1, '.');
  205. ……………………

  206. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
基于STC12C5A60S2的DS18B20溫度顯示工程(LCD1602顯示).zip (38.93 KB, 下載次數(shù): 515)


評(píng)分

參與人數(shù) 2黑幣 +60 收起 理由
兵臨天下 + 10 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:288065 發(fā)表于 2018-4-24 08:24 | 只看該作者
挺好的,不錯(cuò)
回復(fù)

使用道具 舉報(bào)

板凳
ID:315981 發(fā)表于 2018-4-25 11:20 | 只看該作者
很棒,可以試試。
回復(fù)

使用道具 舉報(bào)

地板
ID:324109 發(fā)表于 2018-5-16 14:19 | 只看該作者
為什么不能顯示
回復(fù)

使用道具 舉報(bào)

5#
ID:277616 發(fā)表于 2018-5-25 11:57 | 只看該作者
特別好~~我寫的一直都有warning,這個(gè)程序什么錯(cuò)都沒有
回復(fù)

使用道具 舉報(bào)

6#
ID:332316 發(fā)表于 2018-5-28 15:03 | 只看該作者
您好,請(qǐng)問把程序燒到單片機(jī)中為什么初始溫度值是85℃呢,如何修改一下直接顯示實(shí)時(shí)溫度呢,麻煩幫忙解決一下
回復(fù)

使用道具 舉報(bào)

7#
ID:170141 發(fā)表于 2018-8-20 23:28 | 只看該作者
fenfen625 發(fā)表于 2018-5-28 15:03
您好,請(qǐng)問把程序燒到單片機(jī)中為什么初始溫度值是85℃呢,如何修改一下直接顯示實(shí)時(shí)溫度呢,麻煩幫忙解決一 ...

你可以把讀取實(shí)時(shí)溫度的函數(shù)寫2次,屏蔽第一次不讓顯示,那樣就不會(huì)顯示85度了
回復(fù)

使用道具 舉報(bào)

8#
ID:391728 發(fā)表于 2018-8-30 19:20 | 只看該作者
我的也是不能顯示啊 很難受
回復(fù)

使用道具 舉報(bào)

9#
ID:303383 發(fā)表于 2018-8-30 22:01 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

10#
ID:397622 發(fā)表于 2018-12-22 14:49 | 只看該作者
好好好
回復(fù)

使用道具 舉報(bào)

11#
ID:465014 發(fā)表于 2019-1-21 20:25 | 只看該作者
不錯(cuò),研究一下
回復(fù)

使用道具 舉報(bào)

12#
ID:472756 發(fā)表于 2019-3-23 23:59 | 只看該作者
參考下
回復(fù)

使用道具 舉報(bào)

13#
ID:229821 發(fā)表于 2019-3-24 09:01 | 只看該作者
我的keil5.25中找不到STC12C5A60S2單片機(jī)。用c52代替的話。晶振選12M。嗎?延時(shí)1us是一個(gè)_nop_嗎?
回復(fù)

使用道具 舉報(bào)

14#
ID:229821 發(fā)表于 2019-3-24 12:32 | 只看該作者
謝謝分享啊。不錯(cuò)的東西。
回復(fù)

使用道具 舉報(bào)

15#
ID:229821 發(fā)表于 2019-3-26 11:17 | 只看該作者
可能我的ds壞了。無(wú)論連接不連接。lcd都顯示5.93c。難受香菇
回復(fù)

使用道具 舉報(bào)

16#
ID:498577 發(fā)表于 2019-3-26 12:00 | 只看該作者
挺好收藏了
回復(fù)

使用道具 舉報(bào)

17#
ID:498577 發(fā)表于 2019-3-26 12:00 | 只看該作者
挺好,收藏了
回復(fù)

使用道具 舉報(bào)

18#
ID:416287 發(fā)表于 2019-3-26 18:39 | 只看該作者
fenfen625 發(fā)表于 2018-5-28 15:03
您好,請(qǐng)問把程序燒到單片機(jī)中為什么初始溫度值是85℃呢,如何修改一下直接顯示實(shí)時(shí)溫度呢,麻煩幫忙解決一 ...

在你讀這次的溫度值時(shí) 先把上一次的值清除了
回復(fù)

使用道具 舉報(bào)

19#
ID:224782 發(fā)表于 2019-3-29 10:19 | 只看該作者
fenfen625 發(fā)表于 2018-5-28 15:03
您好,請(qǐng)問把程序燒到單片機(jī)中為什么初始溫度值是85℃呢,如何修改一下直接顯示實(shí)時(shí)溫度呢,麻煩幫忙解決一 ...

這個(gè)程序就是簡(jiǎn)單地讀取顯示的程序,顯示值是隨實(shí)時(shí)溫度變化改變的,如果你一直都顯示85度的話可能是硬件的問題了
回復(fù)

使用道具 舉報(bào)

20#
ID:224782 發(fā)表于 2019-3-29 10:21 | 只看該作者
saya0769 發(fā)表于 2019-3-24 09:01
我的keil5.25中找不到STC12C5A60S2單片機(jī)。用c52代替的話。晶振選12M。嗎?延時(shí)1us是一個(gè)_nop_嗎?

用ISP燒錄軟件添加一下STC的型號(hào)和頭文件就行了
回復(fù)

使用道具 舉報(bào)

21#
ID:500775 發(fā)表于 2019-4-1 19:25 | 只看該作者
好東西,學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

22#
ID:118735 發(fā)表于 2019-4-2 22:28 | 只看該作者
挺好的,不錯(cuò)
回復(fù)

使用道具 舉報(bào)

23#
ID:115740 發(fā)表于 2019-5-22 02:12 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

24#
ID:581127 發(fā)表于 2019-7-10 01:48 | 只看該作者
怎么溫度為0??
回復(fù)

使用道具 舉報(bào)

25#
ID:282095 發(fā)表于 2019-7-10 09:17 | 只看該作者
可以同時(shí)顯示溫度和濕度嗎
回復(fù)

使用道具 舉報(bào)

26#
ID:224782 發(fā)表于 2019-8-8 11:19 | 只看該作者
鵬博士PBs 發(fā)表于 2019-7-10 09:17
可以同時(shí)顯示溫度和濕度嗎

這個(gè)只是DS18B20的測(cè)試程序,它只能測(cè)溫度,濕度得別的傳感器
回復(fù)

使用道具 舉報(bào)

27#
ID:848909 發(fā)表于 2020-11-25 12:48 | 只看該作者
以后能用到,mark一下,
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表