找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機數(shù)字溫度計設計-帶原理圖 PCB 程序 仿真實驗(數(shù)碼管顯示)

  [復制鏈接]
跳轉到指定樓層
樓主
ID:108715 發(fā)表于 2016-5-12 07:56 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是一個很詳細的基于51單片機的數(shù)字溫度計課程設計用數(shù)碼管顯示溫度,包含Altium Designer畫的pcb文件,原理圖,還有仿等等。資料僅供參考學習,任何商業(yè)用途概不負責。

單片機數(shù)字溫度計原理圖仿真圖:


pcb文件:



基于51單片機的數(shù)字溫度計詳細原理圖


本數(shù)字溫度計設計的所有資料下載:
數(shù)字溫度計資料.zip (3.67 MB, 下載次數(shù): 748)
壇友修改的版本: 修改后的溫度計程序 Proteus7.5版本工程.7z (40.52 KB, 下載次數(shù): 72)
相關試驗文檔下載:
DS18B20數(shù)字溫度計設計實驗文檔(數(shù)碼管顯示的).doc (4.23 MB, 下載次數(shù): 246)
單片機數(shù)字溫度計設計.doc (395.09 KB, 下載次數(shù): 254)





/*****溫度計的元件清單如下*****/

1、四位一體共陽數(shù)碼管;
2、三極管8550        5個;
3、雙孔接線端子        1個;
4、繼電器        1個;
5、LED            1個;
6、470電阻        9個;
7、空心三孔插針        1個;
8、蜂鳴器        1個;
9、單片機        1個;

11、4.7K電阻        10個;
12、DIP40        1個;
13、自鎖開關        1個;
14、10Uf電解電容    1個;
15、10K電阻        1個;
16、12M晶振        1個;
17、30P瓷片電容        2個;
18、輕觸按鍵        3個;
19、USB接口        1個;
20、二極管IN4148    1個;
21、10K排阻103        1個;
22、7*9萬用板        1個;
23、溫度傳感器DS18B20    1個;
24、USB數(shù)據(jù)線        1條;
25、電路圖紙        1張。
/*****共:25種元件*****/


單片機數(shù)字溫度計設計的程序源代碼:
  1. #include "reg51.h"
  2. #include "intrins.h"        //_nop_();延時函數(shù)用
  3. #define  dm P0              //段碼輸出口

  4. #define  uchar unsigned char
  5. #define  uint  unsigned int
  6. sbit DQ=P2^7;       //溫度輸入口
  7. sbit w0=P2^0;       //數(shù)碼管4
  8. sbit w1=P2^1;                //數(shù)碼管3
  9. sbit w2=P2^2;                //數(shù)碼管2
  10. sbit w3=P2^3;                 //數(shù)碼管1
  11. sbit LED=P1^6;                //指示燈
  12. sbit beep=P1^7;      //蜂鳴器
  13. sbit set=P2^6;        //溫度設置切換鍵  
  14. sbit add=P2^4;        //溫度加
  15. sbit dec=P2^5;        //溫度減
  16. int temp1=0;          //顯示當前溫度和設置溫度的標志位為0時顯示當前溫度
  17. uint h;
  18. uint temp;
  19. uchar r;
  20. uchar high=30,low=15; //溫度范圍設置為15-30度
  21. uchar sign;
  22. uchar q=0;
  23. uchar tt=0;
  24. uchar scale;
  25. //**************溫度小數(shù)部分用查表法***********//
  26. uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};                 //小數(shù)斷碼表

  27. uchar code table_dm[12]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f,~0x00,~0x40};
  28. //共陽極數(shù)碼管LED段碼表        "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "不亮" "-"  
  29. uchar table_dm1[]={~0xbf,~0x86,~0xdb,~0xcf,~0xe6,~0xed,~0xfd,~0x87,~0xff,~0xef};  //個位帶小數(shù)點的斷碼表


  30.   
  31. uchar data temp_data[2]={0x00,0x00};             //讀出溫度暫放
  32. uchar data display[5]={0x00,0x00,0x00,0x00,0x00};     //顯示單元數(shù)據(jù),共4個數(shù)據(jù)和一個運算暫用
  33. /*****************11us延時函數(shù)*************************/

  34. void delay(uint t)
  35. {
  36.   for (;t>0;t--);
  37. }

  38. void scan()
  39. {
  40. int j;
  41.         for(j=0;j<4;j++)
  42.         {
  43.                 switch (j)
  44.                 {
  45.                         case 0: dm=table_dm[display[0]];w0=0;delay(50);w0=1;//xiaoshu
  46.                         case 1: dm=table_dm1[display[1]];w1=0;delay(50);w1=1;//gewei
  47.                         case 2: dm=table_dm[display[2]];w2=0;delay(50);w2=1;//shiwei
  48.                         case 3: dm=table_dm[display[3]];w3=0;delay(50);w3=1;//baiwei
  49.                                 //        else{dm=table_dm[b3];w3=0;delay(50);w3=1;}
  50.         }
  51.         }
  52. }

  53. //***************DS18B20復位函數(shù)************************/
  54. ow_reset(void)
  55. {
  56. char presence=1;
  57. while(presence)
  58. {
  59.   while(presence)
  60.    {
  61.     DQ=1;_nop_();_nop_();//從高拉倒低
  62. DQ=0;                                       
  63. delay(50);           //550 us
  64. DQ=1;                                       
  65. delay(6);            //66 us
  66. presence=DQ;         //presence=0 復位成功,繼續(xù)下一步
  67.    }
  68.    delay(45);            //延時500 us
  69.    presence=~DQ;         
  70. }
  71. DQ=1;                   //拉高電平
  72. }
  73. /****************DS18B20寫命令函數(shù)************************/
  74. //向1-WIRE 總線上寫1個字節(jié)
  75. void write_byte(uchar val)
  76. {
  77.   uchar i;
  78.   for(i=8;i>0;i--)
  79.   {
  80.    DQ=1;_nop_();_nop_();                  //從高拉倒低
  81.    DQ=0;_nop_();_nop_();_nop_();_nop_();  //5 us
  82.    DQ=val&0x01;                           //最低位移出
  83.    delay(6);                              //66 us
  84.    val=val/2;                             //右移1位
  85.    }
  86.    DQ=1;
  87.    delay(1);
  88. }
  89. /****************DS18B20讀1字節(jié)函數(shù)************************/
  90. //從總線上取1個字節(jié)
  91. uchar read_byte(void)
  92. {
  93. uchar i;
  94. uchar value=0;
  95. for(i=8;i>0;i--)
  96. {
  97.   DQ=1;_nop_();_nop_();
  98.   value>>=1;
  99.   DQ=0;_nop_();_nop_();_nop_();_nop_();         //4 us
  100.   DQ=1;_nop_();_nop_();_nop_();_nop_();         //4 us
  101.   if(DQ)value|=0x80;
  102.   delay(6);                                     //66 us
  103. }
  104. DQ=1;
  105. return(value);
  106. }

  107. /*****************讀出溫度函數(shù)************************/
  108. read_temp()
  109. {
  110.   ow_reset();                  //總線復位
  111.   delay(200);
  112.   write_byte(0xcc);            //發(fā)命令
  113.   write_byte(0x44);            //發(fā)轉換命令
  114.   ow_reset();
  115.   delay(1);
  116.   write_byte(0xcc);            //發(fā)命令
  117.   write_byte(0xbe);
  118.   temp_data[0]=read_byte();    //讀溫度值的第字節(jié)
  119.   temp_data[1]=read_byte();    //讀溫度值的高字節(jié)
  120.   temp=temp_data[1];
  121.   temp<<=8;                                               
  122.   temp=temp|temp_data[0];      // 兩字節(jié)合成一個整型變量。
  123. return temp;                 //返回溫度值
  124. }
  125. /****************溫度數(shù)據(jù)處理函數(shù)************************/
  126. //二進制高字節(jié)的低半字節(jié)和低字節(jié)的高半字節(jié)組成一字節(jié),這個
  127. //字節(jié)的二進制轉換為十進制后,就是溫度值的百、十、個位值,而剩
  128. //下的低字節(jié)的低半字節(jié)轉化成十進制后,就是溫度值的小數(shù)部分
  129. /********************************************************/
  130. work_temp(uint tem)
  131. {
  132. uchar n=0;
  133. if(tem>6348)                        // 溫度值正負判斷
  134.      {tem=65536-tem;n=1;}            // 負溫度求補碼,標志位置1
  135.       display[4]=tem&0x0f;           // 取小數(shù)部分的值
  136.   display[0]=ditab[display[4]];  // 存入小數(shù)部分顯示值
  137.       display[4]=tem>>4;             // 取中間八位,即整數(shù)部分的值
  138. display[3]=display[4]/100;     // 取百位數(shù)據(jù)暫存
  139.   display[1]=display[4]%100;     // 取后兩位數(shù)據(jù)暫存
  140.   display[2]=display[1]/10;      // 取十位數(shù)據(jù)暫存
  141.   display[1]=display[1]%10;     //個位數(shù)據(jù)
  142.   r=display[1]+display[2]*10+display[3]*100;
  143. /////符號位顯示判斷/////
  144.   if(!display[3])
  145.   {
  146.     display[3]=0x0a;           //最高位為0時不顯示
  147.     if(!display[2])
  148. {
  149.    display[2]=0x0a;        //次高位為0時不顯示
  150. }
  151.   }
  152.   if(n){display[3]=0x0b;}      //負溫度時最高位顯示"-"
  153. }

  154. void BEEP()
  155. {
  156.         if((r>=high&&r<129)||r<low)
  157.         {
  158.                 beep=!beep;
  159.                 LED=0;
  160.         }
  161.         else
  162.         {
  163.                 beep=1;
  164.                 LED=1;
  165.         }
  166. }
  167. //*********設置溫度顯示轉換************//
  168. void xianshi(int horl)
  169. {
  170.         int n=0;
  171.         if(horl>128)
  172.         {
  173.                 horl=256-horl;n=1;
  174.         }
  175.         display[3]=horl/100;
  176.         display[3]=display[3]&0x0f;
  177.         display[2]=horl%100/10;
  178.         display[1]=horl%10;
  179.         display[0]=0;
  180.         if(!display[3])
  181.         {
  182.             display[3]=0x0a;          //最高位為0時不顯示
  183.             if(!display[2])
  184.                 {
  185.                    display[2]=0x0a;        //次高位為0時不顯示
  186.                 }
  187.         }
  188.           if(n)
  189.           {
  190.                   display[3]=0x0b; //負溫度時最高位顯示"-"
  191.           }     

  192. }

  193. //*********按鍵查詢程序**************//
  194. void keyscan()
  195. {
  196.         int temp1;   //最高溫度和最低溫度標志位
  197.         if(set==0)        
  198.         {
  199.                 while(1)
  200.                 {        
  201.                         delay(500);//消抖
  202.                         if(set==0)
  203.                         {        
  204.                                 temp1++;
  205.                                 while(!set)
  206.                                 scan();
  207.                         }
  208.                         if(temp1==1)
  209.                         {
  210.                                 xianshi(high);
  211.                                 scan();
  212.                                 if(add==0)
  213.                                 {
  214.                                         while(!add)
  215.                                         scan();
  216.                                         high+=1;
  217.                                 }
  218.                                 if(dec==0)
  219.                                 {
  220.                                         while(!dec)
  221.                                         scan();
  222.                                         high-=1;
  223.                                 }
  224.                         }               
  225.                         
  226.                         if(temp1==2)
  227.                         {
  228.                                 xianshi(low);
  229.                                 if(add==0)
  230.                                 {
  231.                                         while(!add)
  232.                                         scan();
  233.                                         low+=1;
  234.                                 }
  235.                                 if(dec==0)
  236.                                 {
  237.                                         while(!dec)
  238.                                         scan();
  239.                                         low-=1;        
  240.                                 }
  241.                                 scan();
  242.                         }
  243.                         if(temp1>=3)
  244.                         {
  245.                                 temp1=0;
  246.                                 break;
  247.                         }
  248.                 }
  249.         }
  250. }

  251. /****************主函數(shù)************************/
  252. void main()
  253. {
  254.         
  255.          dm=0x00;                 //初始化端口
  256.          w0=1;
  257.          w1=1;
  258.          w2=1;
  259.          w3=1;
  260.          for(h=0;h<4;h++)              //開機顯示"0000"
  261.          {
  262.                 display[h]=0;
  263.          }
  264.          ow_reset();                   //開機先轉換一次
  265.          write_byte(0xcc);             //Skip ROM
  266.          write_byte(0x44);             //發(fā)轉換命令
  267.          for(h=0;h<100;h++)            //開機顯示"0000"
  268.          {
  269.                  scan();
  270.          }
  271.          while(1)
  272.          {               
  273.                  if (temp1==0)
  274.                 {
  275.                           work_temp(read_temp());     //處理溫度數(shù)據(jù)
  276.                 BEEP();               
  277.                         scan();                    //顯示溫度值
  278.                 keyscan();
  279.                 }
  280.                    else
  281.                          keyscan();
  282.                   }
  283. }
復制代碼


評分

參與人數(shù) 3黑幣 +110 收起 理由
去瞧瞧去去去 + 5 絕世好帖!
天才2333333 + 5 很給力!
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

來自 2#
ID:122642 發(fā)表于 2016-5-24 14:02 | 只看該作者
感謝樓主。發(fā)現(xiàn)只能用Proteus7.8版本才可以,其他版本都不行,不過樓主的程序有問題,無法顯示,我花了半天的時間修改了一下,奉獻給大家,完美運行: 修改后的溫度計程序+Proteus7.5版本工程.7z (40.52 KB, 下載次數(shù): 48)

51hei.png (8.16 KB, 下載次數(shù): 100)

51hei.png

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

來自 3#
ID:20345 發(fā)表于 2018-10-17 15:43 | 只看該作者
2017年3月份焊接好后,弄了好長時間,一直不亮。一直耿耿于懷。2018年10月16日拿出仔細檢查,發(fā)現(xiàn)去年焊接時限流電阻阻值焊接錯了,還有段碼端接錯4根,蜂鳴器沒接地。按樓主的原理圖焊接改好,燒好程序,接上電源,一切正常,能聲光報警。高興。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:108622 發(fā)表于 2016-10-12 20:59 來自手機 | 只看該作者
不知道有沒有0下溫度
回復

使用道具 舉報

5#
ID:127881 發(fā)表于 2016-12-31 19:49 | 只看該作者
好東西,拿來學習學習
回復

使用道具 舉報

6#
ID:164699 發(fā)表于 2017-2-15 08:56 | 只看該作者
樓主棒棒噠。
回復

使用道具 舉報

7#
ID:147958 發(fā)表于 2017-2-15 09:02 | 只看該作者
好東西,拿來學習學習
回復

使用道具 舉報

8#
ID:162689 發(fā)表于 2017-2-15 22:40 | 只看該作者
學習學習...........
回復

使用道具 舉報

9#
ID:159600 發(fā)表于 2017-2-17 00:04 | 只看該作者
謝謝共享,lz很帥呀
回復

使用道具 舉報

10#
ID:194143 發(fā)表于 2017-4-30 21:02 | 只看該作者
看來不錯,不知道用得起不
回復

使用道具 舉報

11#
ID:211251 發(fā)表于 2017-6-14 18:13 來自手機 | 只看該作者
好東西,拿來學習學習
回復

使用道具 舉報

12#
ID:329939 發(fā)表于 2018-5-15 16:14 | 只看該作者
單片機好難,要好好研究一下了
回復

使用道具 舉報

13#
ID:292628 發(fā)表于 2018-5-31 19:58 | 只看該作者
這個資料有問題吧,程序弄進去沒用
回復

使用道具 舉報

14#
ID:342752 發(fā)表于 2018-6-8 16:46 | 只看該作者
下載不了文件,好傷心
回復

使用道具 舉報

15#
ID:348910 發(fā)表于 2018-6-11 20:41 | 只看該作者
為啥我的數(shù)碼管不亮??
回復

使用道具 舉報

16#
ID:350557 發(fā)表于 2018-6-12 19:43 | 只看該作者
學習學習
回復

使用道具 舉報

17#
ID:342752 發(fā)表于 2018-6-20 09:49 | 只看該作者
怎么把小數(shù)點改成攝氏度"C"  自己改了好久還是失敗了
回復

使用道具 舉報

18#
ID:323367 發(fā)表于 2018-6-21 10:23 | 只看該作者
你好   看您使用了蜂鳴器  請問這個設計包括溫度上下限報警嘛???
回復

使用道具 舉報

19#
ID:359236 發(fā)表于 2018-6-27 15:46 | 只看該作者
好資料,51黑有你更精彩
回復

使用道具 舉報

20#
ID:367019 發(fā)表于 2018-7-7 20:21 | 只看該作者
數(shù)碼管不能正常工作,有解決辦法嗎
回復

使用道具 舉報

21#
ID:159857 發(fā)表于 2020-5-14 22:06 | 只看該作者
好東西,拿來學習學習!謝謝樓主!
回復

使用道具 舉報

22#
ID:749309 發(fā)表于 2020-5-15 13:51 | 只看該作者
好東西哦,借來分享
回復

使用道具 舉報

23#
ID:750686 發(fā)表于 2020-5-16 09:07 | 只看該作者
求解下為啥我仿真不成功啊,按照圖做的啊
回復

使用道具 舉報

24#
ID:760117 發(fā)表于 2020-5-24 20:03 | 只看該作者
很有用,非常感謝
回復

使用道具 舉報

25#
ID:760117 發(fā)表于 2020-5-24 22:29 | 只看該作者
很實用,非常感謝
回復

使用道具 舉報

26#
ID:760117 發(fā)表于 2020-5-24 22:33 | 只看該作者
為什么照著這個仿真,結果出不來?
回復

使用道具 舉報

27#
ID:760949 發(fā)表于 2020-5-25 18:00 | 只看該作者
為什么我用仿真就不行呢???
回復

使用道具 舉報

28#
ID:763783 發(fā)表于 2020-5-28 21:28 | 只看該作者
很好,非常感謝
回復

使用道具 舉報

29#
ID:767160 發(fā)表于 2020-6-3 11:00 | 只看該作者
樓主太厲害了,沒有頭緒的時候看到了樓主,豁然開朗
回復

使用道具 舉報

30#
ID:863613 發(fā)表于 2020-12-19 22:36 | 只看該作者
用了程序后數(shù)碼管顯示不了數(shù)據(jù),是怎么回事啦
回復

使用道具 舉報

31#
ID:865002 發(fā)表于 2020-12-21 20:13 | 只看該作者
學習了,今天跑了一下樓主的程序,可以運行,非常感謝,學到新知識了
回復

使用道具 舉報

32#
ID:848824 發(fā)表于 2020-12-22 15:31 | 只看該作者
仿真可以用,實驗數(shù)碼管不亮怎么回事
回復

使用道具 舉報

33#
ID:843940 發(fā)表于 2021-1-7 10:19 | 只看該作者
你這個程序有問題
回復

使用道具 舉報

34#
ID:89286 發(fā)表于 2021-1-9 09:13 | 只看該作者
thanks for sharing
回復

使用道具 舉報

35#
ID:561361 發(fā)表于 2021-4-13 13:44 | 只看該作者
王梓名 發(fā)表于 2020-5-24 20:03
很有用,非常感謝

兄弟  幫個忙   為啥 仿真文件夾里的HEX  文件能仿真,程序里的HEX 文件 沒實現(xiàn)
回復

使用道具 舉報

36#
ID:995569 發(fā)表于 2021-12-22 11:00 來自手機 | 只看該作者
2201651598 發(fā)表于 2021-4-13 13:44
兄弟  幫個忙   為啥 仿真文件夾里的HEX  文件能仿真,程序里的HEX 文件 沒實現(xiàn)

先運行一下,再鏈接,在云行
回復

使用道具 舉報

37#
ID:1133323 發(fā)表于 2024-10-10 14:28 | 只看該作者
發(fā)表于 2018-10-17 15:43
2017年3月份焊接好后,弄了好長時間,一直不亮。一直耿耿于懷。2018年10月16日拿出仔細檢查,發(fā)現(xiàn)去年焊接 ...

厲害厲害
回復

使用道具 舉報

38#
ID:1135335 發(fā)表于 2024-11-2 17:50 | 只看該作者
好東西,拿來學習學習
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表