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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機DS18B20采集溫度,使用74HC573鎖存器和138譯碼器數碼管顯示

[復制鏈接]
跳轉到指定樓層
樓主
-55~125℃溫度顯示 精度0.1℃

功能:

(1)使用單片機對DS18B20溫度傳感器進行讀取得到溫度值


(2)使用74hc573鎖存器驅動數碼管的斷碼顯示
(3)使用74hc138譯碼器選擇數碼管
(4)增加了傳感器狀態監測,如果傳感器連接異常則顯示檢測動畫
顯示特點:
(1)數字默認顯示整數兩位和小數一位,也就是溫度可以精確到0.1℃
(2)當前溫度為零下是,溫度前自動添加符號,非零下時則不顯示
(3)默認顯示為兩位整數,當溫度大于100攝氏度時,會增加到三位。
展示圖片如下:

零下55℃顯示


125℃顯示


檢測DS18B20



精確0.1℃顯



單片機源程序如下:
  1. /*********************************************
  2. 程序功能:使用74H573鎖存器和138譯碼器共同完成8位數碼管溫度顯示
  3. 138譯碼器的真值表:
  4.           C B A         數碼管位
  5.           0 0 0          1        
  6.           0 0 1                 2  
  7.           0 1 0          3
  8.           0 1 1          4
  9.           1 0 0          5
  10.           1 0 1          6
  11.           1 1 0          7
  12.           1 1 1          8
  13.                 程序公開,共師兄習
  14.                 如有錯誤,敬請糾正
  15. *********************************************/
  16. #include "DS18B20.h"

  17. /*138譯碼器管腳定義*/
  18. sbit LSA = P2^0;     //定義138譯碼器管腳A
  19. sbit LSB = P2^1;         //定義138譯碼器管腳B
  20. sbit LSC = P2^2;         //定義138譯碼器管腳C

  21. /*數碼管字碼定義*/
  22. uchar code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x58,0X40};  //共陰極數碼管字段
  23. /*帶點*/
  24. uchar code table_bit[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};

  25. uchar G,S,BAI,Q;

  26. int num = 0;

  27. void count(void);
  28. void display(void);
  29. void delay(uint z);
  30. void DS18B20_Chack(void);
  31. void SMG_Channel(uchar x);

  32. void main(void)
  33. {  
  34.         uint i;
  35.         while(1)
  36.         {
  37.                 i++;
  38.                 delay(5);
  39.                 if(i%40 == 0)
  40.                 {
  41.                         num = ReadTemperature();   //讀取一次溫度
  42.                         if(num<0)                           //判斷是否為負數
  43.                                 num = -num;                   //轉成整數
  44.                 }
  45.                 DS18B20_Chack();        
  46.                 count();                 //計算
  47.                 display();                         //顯示
  48.         }
  49. }
  50. void count(void)                                 //把每一位數字都單獨存到一個變量中
  51. {
  52.         G =   num%10;                        
  53.         S =   num/10%10;
  54.         BAI = num/100%10;
  55.         Q  =  num/1000%10;        
  56. }
  57. void display(void)
  58. {
  59.         uchar x = 1;
  60. /*********正負號*********/
  61.         if(temp_flag)    //溫度為正不顯示 1正
  62.         {                 
  63.                 P0 = 0X00;
  64.                 SMG_Channel(x);
  65.                 P0 = table[11];
  66.                 delay(1);
  67.         }
  68.         else x=x-1;
  69. /********百位**********/
  70.         if(Q)
  71.         {
  72.                 x=1;
  73.                 P0 = 0X00;
  74.                 SMG_Channel(x);
  75.                 P0 = table[Q];
  76.                 delay(1);        
  77.         }
  78. /*********十位*********/        
  79.         P0 = 0X00;
  80.         SMG_Channel(x+1);
  81.         P0 = table[BAI];
  82.         delay(1);
  83. /*********個位*********/        
  84.         P0 = 0X00;
  85.         SMG_Channel(x+2);
  86.         P0 = table_bit[S];
  87.         delay(1);
  88. /*********小數點后一位*********/               
  89.         P0 = 0X00;
  90.         SMG_Channel(x+3);
  91.         P0 = table[G];
  92.         delay(1);
  93. /*********溫度符號*********/               
  94.         P0 = 0X00;
  95.         SMG_Channel(x+4);
  96.         P0 = table[10];
  97.         delay(1);        
  98. }
  99. /********延時函數*********/
  100. void delay(uint z)
  101. {
  102.         uint x,y;
  103.         for(x=0;x<z;x++)
  104.                 for(y=0;y<123;y++);
  105. }
  106. /********監測DS18B20的在線情況*********/
  107. void DS18B20_Chack(void)
  108. {
  109.         while(DS18B20_Init())         //監測DS18B20是否在線
  110.         {
  111.                 uchar a;
  112.                 for(a = 1;a <= 8;a++)
  113.                 {
  114.                         P0 = 0X00;
  115.                         SMG_Channel(a);
  116.                         P0 = table[11];
  117.                         delay(100);
  118.                 }        
  119.         }
  120. }
  121. /********數碼管的選擇*********/
  122. void SMG_Channel(uchar x)
  123. {
  124.         switch(x)
  125.         {
  126.                 case 1:        LSA = 0;LSB = 0;LSC = 0; break;
  127.                 case 2:        LSA = 1;LSB = 0;LSC = 0; break;
  128.                 case 3:        LSA = 0;LSB = 1;LSC = 0; break;
  129.                 case 4:        LSA = 1;LSB = 1;LSC = 0; break;
  130.                 case 5:        LSA = 0;LSB = 0;LSC = 1; break;
  131.                 case 6:        LSA = 1;LSB = 0;LSC = 1; break;
  132.                 case 7:        LSA = 0;LSB = 1;LSC = 1; break;
  133.                 case 8:        LSA = 1;LSB = 1;LSC = 1; break;
  134.                 default: break;
  135.         }
  136. }
復制代碼

所有資料51hei提供下載:
DEMO_8SMG_74H573 74LS138 DS18B20.zip (2.2 MB, 下載次數: 77)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:496636 發表于 2022-6-11 08:35 | 只看該作者
118句的變量a如果是從0開始到7,那么SMG_Channel函數就可以用幾條語句來替換掉冗長的switch語句。因為a的值就等于輸給三八譯碼器三位二進制的值。如a=0時,LSA = 0;LSB = 0;LSC = 0;a=1時,LSA = 1;LSB = 0;LSC =0;


unsigned char tmp;
tmp=P2;
tmp&=0xf8;//與二進制數11111000按位與,把低三位清零。
tmp|=a;//通過按位或把a加到后三位上。
P2=tmp;//再把值賦給P2。


當然118行的循環語句也可以改成另一種風格書寫,最好是在定時中斷中調用,把a定義為靜態變量。
a++;
a&=0x07;//a的與二進制數00000111按位與,如果小于7,不變,如果變成1000,高位被清零。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: а天堂中文最新一区二区三区 | 日本午夜免费福利视频 | 成人三级视频在线观看 | 亚洲小视频在线播放 | 99精品久久久久久中文字幕 | av第一页 | 99免费| 久久男人天堂 | 国产成人艳妇aa视频在线 | 欧美日韩一区在线 | 欧美日韩精品一区二区三区四区 | 九九精品在线 | 亚洲午夜视频在线观看 | 亚洲一区 中文字幕 | 国产精品成人一区二区三区 | 日韩1区| 国产一级片一区二区 | 日韩国产免费 | 一区网站| 亚洲 成人 在线 | 久久亚洲一区二区 | 麻豆久久久9性大片 | 妞干网视频| 国产高清视频在线观看 | 国产在线精品一区二区 | 日本精a在线观看 | 国产伦精品一区二区三区高清 | 久久久精品网站 | 欧美精品一区在线 | 欧美日一区二区 | 97久久精品午夜一区二区 | 国产成人精品综合 | 视频在线一区二区 | www.久久国产精品 | 国产在线精品一区二区三区 | a级性视频| 亚洲欧美一区二区三区1000 | 久久爱黑人激情av摘花 | 日韩一级免费观看 | 精品在线一区二区三区 | 精品综合在线 |