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

QQ登錄

只需一步,快速開(kāi)始

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

STC89C52+DS18B20+共陰四位數(shù)碼管 溫度顯示

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:56331 發(fā)表于 2016-8-2 09:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
用的是STC89C52單片機(jī),圖中四個(gè)非門(mén)是相當(dāng)于四個(gè)三極管,在仿真中閑麻煩就用非門(mén)代替。




實(shí)際效果










  1. #include<reg52.h>
  2. #include<intrins.h>
  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. uchar code table[]             =   {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

  6. uchar code Temperature_Char[8] =   {0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};
  7.                                                                   
  8. uchar code df_Table[]          =   {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};

  9. uchar code wei[]               =   {0x01,0x02,0x04,0x08};

  10. sbit DQ = P3^7;
  11. sbit digt1=P2^0;
  12. sbit digt2=P2^1;
  13. sbit digt3=P2^2;
  14. sbit digt4=P2^3;
  15. uchar DS18B20_IS_OK;
  16. uchar CurrentT = 0;
  17. uchar Temp_Value[]={0x00,0x00};
  18. uchar Display_Digit[]={0,0,0,0};
  19. void delayus(uint us)
  20. {
  21.          while(--us);
  22. }
  23. void delay(uint ms)
  24. {
  25.          uchar i;
  26.         while(ms--)
  27.         {
  28.                  for(i=0;i<120;i++);
  29.         }
  30. }
  31. uchar Init_DS18B20()                        //18B20初始化
  32. {
  33.          uchar status;
  34.         DQ = 1;                                         //總線(xiàn)拉高
  35.         delayus(8);                         // 12MHz晶振,20us左右
  36.         DQ = 0;                                         
  37.         delayus(90);                        //720us左右
  38.         DQ = 1;                                        //釋放總線(xiàn)
  39.         delayus(8);
  40.         status=DQ;
  41.         delayus(20);                         //160us左右
  42.         DQ=1;
  43.         return status;
  44. }

  45. uchar ReadOneByte()
  46. {
  47.          uchar i,dat=0;
  48.         DQ = 1;
  49.         _nop_();
  50.         for(i=0;i<8;i++)
  51.         {
  52.                  DQ = 0;
  53.                 _nop_();_nop_();
  54.                 dat >>= 1;
  55.                 DQ = 1;
  56.                 _nop_();
  57.                 _nop_();
  58.                 if(DQ)
  59.                         dat |= 0X80;
  60.                 delayus(30);
  61.                 DQ = 1;
  62.         }
  63.         return dat;
  64. }

  65. void WriteOneByte(uchar dat)                  //18B20寫(xiě)數(shù)據(jù)
  66. {
  67.          uchar i;
  68.         for(i=0;i<8;i++)
  69.         {
  70.                  DQ = 0;
  71.                 DQ = dat& 0x01;
  72.                 delayus(3);
  73.                 DQ = 1;
  74.                 dat >>= 1;                //右移一位
  75.         }
  76. }

  77. void Read_Temperature()                          //讀取溫度
  78. {
  79.          if(Init_DS18B20()==1)
  80.                 DS18B20_IS_OK=0;
  81.         else
  82.         {
  83.                 WriteOneByte(0xcc);                          //跳過(guò)序列號(hào)
  84.                 WriteOneByte(0x44);                           //啟動(dòng)溫度轉(zhuǎn)換
  85.                 Init_DS18B20();
  86.                 WriteOneByte(0xcc);
  87.                 WriteOneByte(0xbe);                                //讀取溫度
  88.                 Temp_Value[0] = ReadOneByte();           //低八位
  89.                 Temp_Value[1] = ReadOneByte();           //高八位
  90.                 DS18B20_IS_OK=1;        
  91.         }        
  92. }

  93. void Display_Temperature()
  94. {

  95.         uchar t = 150, ng =0xff,  a ,  b;
  96.         if((Temp_Value[1]&0xf8)==0xf8)                        //判斷高5位,如果都為1則是負(fù)數(shù)
  97.         {
  98.                  Temp_Value[1] = ~Temp_Value[1];                  //如果為負(fù)數(shù)。高八位需要取反,第八位需要取反后加1.
  99.                 Temp_Value[0] = ~Temp_Value[0]+1;
  100.                 if(Temp_Value[0]==0x00)
  101.                         Temp_Value[1]++;
  102.                 ng = 10;
  103.                         
  104.         }

  105.          a=Temp_Value[0]&0x0f;           //小數(shù)點(diǎn)后一位算法
  106.          b=a*0.0625*10;

  107.         /*----0度以上的數(shù)值顯示-----*/
  108.          Display_Digit[0]=ng;
  109.         CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);         //整數(shù)值
  110.         Display_Digit[1] = CurrentT/10; //百位          CurrentT%1000/100;
  111.         Display_Digit[2] = CurrentT%10;          //十位          CurrentT%100/10;
  112.         Display_Digit[3] =  b%10;                  //個(gè)位          CurrentT%10;

  113.         
  114.         }
  115. void display(uchar ge,uchar shi,uchar bai,uchar fu)    //數(shù)碼管掃描
  116. {
  117.         P2=0X00;
  118.         delayus(30);

  119.         if(table[fu]==0x40)            ////////
  120.         {
  121.                 digt1=1;                //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
  122.         }
  123.         else
  124.         {
  125.            digt1=0;                            //加NPN三級(jí)管位驅(qū)動(dòng)需要取反
  126.         }

  127.         P0=table[fu];
  128.         delay(3);
  129.         digt1=0;                    //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
  130.                                                          
  131.                 if(table[bai]==0x3f)
  132.         {        
  133.                 digt2=0;                //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
  134.         }                          
  135.         else
  136.         {
  137.                 digt2=1;                //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
  138.         }

  139.         P0=table[bai];         
  140.         delay(3);               
  141.         digt2=0;         //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反

  142.         digt3=1;         //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反

  143.         P0=table[shi]+0X80;
  144.         delay(3);           
  145.         digt3=0;   //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反

  146.         digt4=1;    //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
  147.         P0=table[ge];
  148.         delay(3);
  149.         digt4=0;    //不加NPN三級(jí)管位驅(qū)動(dòng)需要取反
  150.    

  151. }
  152. void main()
  153. {
  154.     P0=0XFF;
  155.     P2=0X00;
  156. //        delayus(10);
  157.         Read_Temperature();
  158.         delay(500);

  159.         delay(500);

  160.         while(1)
  161.         {        
  162.                 display(Display_Digit[3],Display_Digit[2],Display_Digit[1],Display_Digit[0]);
  163.                  Read_Temperature();
  164.                 if(DS18B20_IS_OK)
  165.                         Display_Temperature();
  166.                 delayus(3);        
  167.         
  168.         }

  169. }
復(fù)制代碼



全部資料51hei下載地址:
數(shù)碼管溫度顯示.zip (54.94 KB, 下載次數(shù): 180)

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:108622 發(fā)表于 2016-10-12 19:22 來(lái)自手機(jī) | 只看該作者
能顯示低溫嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:56331 發(fā)表于 2016-11-29 16:46 | 只看該作者

實(shí)時(shí)顯示溫度
回復(fù)

使用道具 舉報(bào)

地板
ID:207497 發(fā)表于 2017-6-5 22:30 | 只看該作者
這里面有protues仿真嗎?
回復(fù)

使用道具 舉報(bào)

5#
ID:207497 發(fā)表于 2017-6-9 17:40 | 只看該作者
這個(gè)是實(shí)時(shí)顯示溫度嗎,為什么我用你的hex還是和你一樣的溫度呢
回復(fù)

使用道具 舉報(bào)

6#
ID:84492 發(fā)表于 2018-9-13 10:11 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

7#
ID:256289 發(fā)表于 2018-11-17 20:38 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

8#
ID:424506 發(fā)表于 2019-2-22 23:29 | 只看該作者
你好 我想咨詢(xún)下你是使用的PNP三極管 還是NPN三極管
回復(fù)

使用道具 舉報(bào)

9#
ID:424506 發(fā)表于 2019-2-23 08:46 | 只看該作者
我想問(wèn)一下 你的NPN三極管如何在電路中接線(xiàn)的 求回復(fù) 謝謝了
回復(fù)

使用道具 舉報(bào)

10#
ID:343102 發(fā)表于 2019-2-23 10:28 | 只看該作者
謝謝分享!
回復(fù)

使用道具 舉報(bào)

11#
ID:424506 發(fā)表于 2019-4-27 15:48 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

12#
ID:522050 發(fā)表于 2019-4-27 17:43 來(lái)自手機(jī) | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

13#
ID:554057 發(fā)表于 2019-6-15 01:14 來(lái)自手機(jī) | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

14#
ID:564693 發(fā)表于 2019-6-17 15:58 來(lái)自手機(jī) | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

15#
ID:424506 發(fā)表于 2020-10-16 16:36 | 只看該作者
共陰數(shù)碼管 CA
回復(fù)

使用道具 舉報(bào)

16#
ID:831210 發(fā)表于 2020-10-17 23:31 | 只看該作者
ttwwtt 發(fā)表于 2017-6-5 22:30
這里面有protues仿真嗎?

有的,proteus畫(huà)好了
回復(fù)

使用道具 舉報(bào)

17#
ID:255559 發(fā)表于 2020-10-20 13:29 | 只看該作者
你好。如果把數(shù)碼管換成共陽(yáng)的,只修改段碼行不行,單片機(jī)驅(qū)動(dòng)共陰管亮度好像不理想
回復(fù)

使用道具 舉報(bào)

18#
ID:337139 發(fā)表于 2020-10-20 17:40 | 只看該作者
溫度顯示的范圍可以更寬一點(diǎn)的。
回復(fù)

使用道具 舉報(bào)

19#
ID:283883 發(fā)表于 2021-1-1 19:44 | 只看該作者
您好,為什么仿真通過(guò),但我實(shí)物搭建出來(lái)不行呢,沒(méi)搭錯(cuò)。謝謝!
回復(fù)

使用道具 舉報(bào)

20#
ID:926496 發(fā)表于 2021-5-28 14:05 | 只看該作者
周栩樂(lè) 發(fā)表于 2021-1-1 19:44
您好,為什么仿真通過(guò),但我實(shí)物搭建出來(lái)不行呢,沒(méi)搭錯(cuò)。謝謝!

串口要改的,而且他是共陰的
回復(fù)

使用道具 舉報(bào)

21#
ID:143767 發(fā)表于 2021-5-28 15:52 | 只看該作者
你好樓主,能顯示負(fù)溫度嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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