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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于DS81B20的數字溫度計全套設計資料下載(仿真+代碼+文檔)

  [復制鏈接]
跳轉到指定樓層
樓主
基于51單片機和DS18B20的數字溫度計設計的資料,包括了protues的仿真設計和報告。

目錄
摘要    2
一、 緒論    2
1.1單片機簡介    2
1.2 DS18B20溫度傳感器簡介    2
1.3基于單片機和溫度傳感器設計數字溫度計的發展現狀    2
1.4選題的意義    3
1.5本數字溫度計設計的工作    3
二、設計方案論證與選擇    4
2.1單片機具體方案論證與設計    4
2.2溫度傳感器具體方案論證與設計    4
三、主要芯片與硬件介紹    5
3.1 stc89C51    5
3.2 DS18B20    6
3.3四位一體數碼管    9
四、 系統電路設計    10
4.1單片機最小系統電路設計    10
4.2 DS18B20溫度傳感器電路    11
4.3四位一體數碼管顯示電路    11
五、 系統的軟件設計    11
5.1主程序    12
5.2讀出溫度子程序    12
5.3    溫度轉換命令子程序    13
5.4計算溫度子程序    14
5.5 顯示數據刷新子程序    14
5.6按鍵掃描處理子程序    15
六、 溫度數據的計算處理方法    16
七、 仿真調試及性能分析    17
八、 總結    17
參考文獻    18
附件一:系統原理圖    18
附件二:     元件清單    19
附件三:程序源代碼    19


單片機源程序如下:
  1. # include <reg51.h>  
  2. #define uint unsigned int
  3. #define uchar unsigned char   //宏定義
  4. #define Disdata P2          //段碼輸出口
  5. #define discan  P0           //掃描口
  6. sbit p34=P0^0;
  7. sbit p35=P0^1;
  8. sbit p36=P0^2;
  9. sbit dp=P2^7;
  10. sbit p37=P0^3;
  11. sbit DQ=P1^0;    //定義DS18B20總線I/O
  12. sbit set=P1^6;    //定義選擇報調整警溫度上限和下限(1為上限,0為下限)
  13. /****P1.4和P1.4為調整溫度報警增加鍵和減少鍵******/
  14. sbit SET=P3^2;
  15. sbit add=P1^4;
  16. sbit dec=P1^5;
  17. sbit led_red=P1^2;                //超過上限溫度或低于下限溫度,紅燈亮·
  18. sbit led_green=P1^3;                //溫度在正常范圍內,綠燈亮
  19. sbit speaker=P3^5;   //定義響鈴
  20. int temp1;  
  21. signed char m;     //溫度值全局變量
  22. bit sign=0;     //外部中斷狀態標志
  23. signed char shangxian=38;  //上限報警溫度,默認值為38
  24. signed char xiaxian=6;   //下限報警溫度,默認值為5
  25. uchar code  LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; /*****延時子程序*****/
  26. uchar code dis_7[12]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};
  27. /*共陽LED段碼表 "0","1","2","3","4","5","7","8","9","不亮","-"*/
  28. uchar code scan_con[4]={0xf1,0xF2,0xF4,0xF8};  //列掃描控制字
  29. uchar data temp_data[2]={0x00,0x00}; //讀出溫度暫存
  30. uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //顯示單元數據,共4個數據,其中一個作為運算暫存用
  31. void Delay(uint i)
  32. {  
  33. while( i-- );
  34. }
  35.   /******************顯示掃描函數**********************/
  36. void scan()
  37. {
  38.         char k;
  39.         for(k=0;k<4;k++)           //循環掃描4個口,并顯示
  40.         {
  41.         Disdata=dis_7[display[k]];
  42.         if(k==1){dp=0;}
  43.         discan=scan_con[k];
  44.         Delay(65);
  45.         discan=0xff;
  46.         }
  47.        
  48. }

  49. void Init_DS18B20(void)
  50. {  
  51.   unsigned char x=0;   
  52.     DQ=1;    Delay(8);    //稍做延時
  53.    DQ=0;         //單片機將DQ拉低  
  54. Delay(80);   //精確延時,大于480us
  55.   DQ=1;         //拉高總線
  56.   Delay(14);
  57.    x=DQ;           //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗  
  58. Delay(20);
  59. }  
  60. /***************18b20讀一字節函數****************/
  61.   unsigned char ReadOneChar(void)
  62. {   
  63. unsigned char i=0;
  64.   unsigned char dat=0;
  65.   for (i=8;i>0;i--)  
  66. {     
  67. DQ=0;     // 給脈沖信號   
  68.   dat>>=1;   
  69.    DQ=1;     // 給脈沖信號
  70.     if(DQ)     dat|=0x80;  
  71.    Delay(4);
  72.   }   
  73. return(dat); }  
  74. /***************18b20寫命令函數**************/
  75. void WriteOneChar(unsigned char dat)
  76. {    unsigned char i=0;
  77.   for (i=8; i>0; i--)
  78.   {
  79.      DQ=0;   
  80.    DQ=dat&0x01;  
  81.    Delay(5);     
  82. DQ=1;     dat>>=1;
  83.   }
  84. }  
  85. void Tmpchange(void) //發送溫度轉換命令
  86. {  
  87.   Init_DS18B20();
  88.    WriteOneChar(0xCC);  //跳過讀序號列號的操作  
  89. WriteOneChar(0x44);  //啟動溫度轉
  90.    }
  91. unsigned int ReadTemperature(void)
  92. {   
  93. unsigned char a=0;
  94.   unsigned char b=0;
  95.   unsigned int t=0;  
  96. float tt=0;  
  97. Tmpchange();
  98.    Init_DS18B20();  
  99.   WriteOneChar(0xCC);  //跳過讀序號列號的操作
  100.   WriteOneChar(0xBE);  //讀取溫度寄存器  
  101. a=ReadOneChar();     //讀低8位
  102.   b=ReadOneChar();    //讀高8位
  103.   t=b;   t<<=8;   t=t|a;    tt=t*0.0625;    t= tt*100+0.5;     //放大10倍輸出并四舍五入
  104.   return(t); }     /*****顯示開機初始化等待畫面*****/
  105. Disp_init()     {   
  106. P2 = 0x80;      //顯示-
  107. p34=1;p35=0;p36=0;p37=0;
  108. Delay(200);
  109. P2 = 0x80;
  110.    p34=0;p35=1;p36=0;p37=0;
  111. Delay(200);
  112.   P2 = 0x80;
  113.     p34=0;p35=0;p36=1;p37=0;
  114. Delay(200);
  115.   P2 = 0x80;
  116.    p34=0;p35=0;p36=0;p37=1;
  117. Delay(200);
  118.   P2 = 0x80;
  119.   }
  120. /******************溫度數據處理函數****************/  
  121. work_temp()     //顯示溫度
  122. {   uint a,b,c,d,e;  
  123.   e=ReadTemperature();  //獲取溫度值
  124.   a=e/10000;             //計算得到百位數
  125.   b=e/1000;                                //計算得到十位數
  126.   c=e/100-b*10;         //計算得到個位數字                 
  127.   d=(e%100)/10;         //計算得到小數點后一位
  128.   m=e/100;  
  129.   p34=0;p35=0;p36=0;p37=0;   
  130.   P2 =LEDData[d];   //顯示小數點后一位  
  131.   p34=1;p35=0;p36=0;p37=0;      
  132.   Delay(300);  p34=0;p35=0;p36=0;p37=0;   
  133.   P2 =LEDData[c];    //顯示個位
  134.   dp=0;p34=0;p35=1;p36=0;p37=0;
  135.   Delay(300);
  136.   p34=0;p35=0;p36=0;p37=0;   
  137.   P2 =LEDData[b];    //顯示十位
  138.   p34=0;p35=0;p36=1;p37=0;
  139.   Delay(300);  p34=0;p35=0;p36=0;p37=0;  
  140.   P2 =LEDData[a];    //顯示百位
  141.   if(LEDData[a]==0){P0=0x0A;
  142.         if(LEDData[b]==0){P0=0x0A;}}        //最高位為0時都不顯示
  143.   p34=0;p35=0;p36=0;p37=1;  
  144.   Delay(300);  p34=0;p35=0;p36=0;p37=0;        //關閉顯示
  145. }  
  146. disptiaozheng()  
  147. {   
  148. uchar f,g,j,k;  
  149. f=shangxian/10;  
  150. g=shangxian%10;  
  151. j=xiaxian/10;  
  152. k=xiaxian%10;  
  153. p34=0;p35=0;p36=0;p37=0;
  154. P2 =dis_7[display[2]];          //顯示0
  155. p34=0;p35=1;p36=0;p37=0;
  156. Delay(200);  
  157. p34=0;p35=0;p36=0;p37=0;   
  158. P2 =0xc0;          //顯示0
  159. p34=0;p35=0;p36=1;p37=0;
  160. Delay(200);  
  161. p34=0;p35=0;p36=0;p37=0;  
  162. if(SET==1)
  163. {  
  164. P2 =LEDData[g];
  165.   dp=0;   //顯示上限溫度個位
  166.     }  
  167. else
  168. {
  169. P2 =LEDData[k];
  170.   dp=0;
  171.   }
  172. p34=0;p35=0;p36=1;p37=0;
  173.   Delay(200);  p34=0;p35=0;p36=0;p37=0;
  174.    if(SET==1) P2 =LEDData[f];   //顯示上限溫度十位
  175. else    {    if(f==0) P0=0x00;     //不顯示下限溫度十位
  176.   else P2 =LEDData[j];  //顯示下限溫度十位
  177.   }  p34=0;p35=0;p36=0;p37=1;
  178. Delay(200);
  179.   p34=0;p35=0;p36=0;p37=0;          //關閉顯示
  180. Delay(20);  
  181. }
  182. /******************設置溫度顯示轉換******************/
  183. exchange(int horl)
  184. {
  185.         int n=0;
  186.         if(horl>128)
  187.         {
  188.         horl=256-horl;n=1; //負溫度求補碼
  189.         }
  190.         display[3]=horl/100;  //百位數據暫存
  191.         display[3]=display[3]&0x0f;
  192.         display[2]=horl%100/10;           //十位數據暫存
  193.         display[1]=horl%10;                  //個位數據暫存
  194.         display[0]=0;
  195.         if(!display[3]){display[3]=0x0A;
  196.         if(!display[2]){display[2]=0x0A;}}        //最高位為0時都不顯示
  197.         if(n){display[3]=0x0B;}                //負溫度時最高位顯示為“-”
  198.    
  199.   p34=0;p35=0;p36=0;p37=0;
  200.   P2 =0xc6;          //顯示0
  201.   p34=1;p35=0;p36=0;p37=0;
  202.   Delay(200);  
  203.   p34=0;p35=0;p36=0;p37=0;   
  204.   P2 =dis_7[display[1]];dp=0;          //顯示個位
  205.   p34=0;p35=1;p36=0;p37=0;
  206.   Delay(200);  
  207.   p34=0;p35=0;p36=0;p37=0;   
  208.   P2=dis_7[display[2]];
  209.   p34=0;p35=0;p36=1;p37=0;
  210.   Delay(200);  
  211.   p34=0;p35=0;p36=0;p37=0;
  212.   P2=dis_7[display[3]];
  213.   p34=0;p35=0;p36=0;p37=1;
  214.   Delay(200);
  215.   p34=0;p35=0;p36=0;p37=0;          //關閉顯示
  216.   Delay(20);
  217. }
  218. /******************蜂鳴器報警程序*********************/
  219. void beep()
  220. {
  221.         if(m>=shangxian &&m<129|| m<xiaxian)   //溫度不在范圍內報警
  222.         {        speaker=~speaker;
  223.                 led_red=0;           //紅燈亮
  224.                 led_green=1;}   //綠燈滅
  225.         else
  226.         {
  227.         speaker=0;
  228.         led_red=1;
  229.         led_green=0;}          //綠燈亮
  230. }
  231. /******************按鍵查詢程序**********************/
  232. void keyscan()
  233. {
  234.         if(set==0)                 //判斷設置溫度鍵是否按下
  235.         {
  236.                 while(1)
  237.                 {
  238.                 Delay(500);  //消抖
  239.                 if(set==0)
  240.                 {
  241.                 temp1++;
  242.                 while(!set)
  243.                 scan();
  244.                 }
  245.                 if(temp1==1)                 //1時,顯示溫度上限
  246.                 {
  247.                 exchange(shangxian); //顯示溫度上限值
  248.                 scan();
  249.                 if(add==0)        //判斷增加鍵是否按下
  250.                 {
  251.                 while(!add)
  252.                 scan();
  253.                 shangxian+=1;
  254.                 }
  255.                 if(dec==0)        //判斷減少鍵是否按下
  256.                 {
  257.                 while(!dec)
  258.                 scan();
  259.                 shangxian-=1;
  260.                 }
  261.                 }
  262.                 if(temp1==2)          //2時,顯示溫度下限
  263.                 {
  264.                 exchange(xiaxian); //顯示溫度下限值
  265.                 scan();
  266.                 if(add==0)                  //判斷增加鍵是否按下
  267.                 {
  268.                 while(!add)                  
  269.                 scan();
  270.                 xiaxian+=1;
  271.                 }
  272.                 if(dec==0)                  //判斷減少鍵是否按下
  273.                 {
  274.                 while(!dec)
  275.                 scan();
  276.                 xiaxian-=1;
  277.                 }
  278.                 scan();
  279.                 }
  280.                 if(temp1==3)          //3時返回,顯示當前溫度
  281.                 {
  282.                 temp1=0;
  283.                 break;
  284.                 }
  285.                 }
  286.         }
  287. }   
  288. void int0(void) interrupt 0
  289. {     EX0=0;      //關外部中斷0
  290. sign=1;  
  291. if(SET==1) shangxian++;  else xiaxian++;
  292.   Delay(500);  EX0=1;
  293. }   /*****外部中斷1服務程序*****/
  294. void int1(void)  interrupt 2
  295. {   
  296. EX1=0;      //關外部中斷0
  297. sign=1;   if(SET==1) shangxian--;
  298. else xiaxian--;  Delay(500);  EX1=1;
  299.   }   /*****主函數*****/
  300. void main(void)
  301. {   
  302.   uint h;
  303.   IT0=1;  
  304.   IT1=1;
  305.   EX0=1;
  306.   EX1=1;
  307.   EA=1;
  308.   for(h=0;h<4;h++)
  309.         {
  310.                 display[h]=8;                //開機顯示8888
  311.         }
  312.   ReadTemperature();
  313.   speaker=0;   
  314. for(h=0;h<500;h++)
  315.         {
  316.                 scan();                //開機顯示“8888”2s
  317. }
  318. while(1)  
  319. {      
  320.   if(temp1==0)
  321.           {
  322.                 work_temp();
  323.                 beep();                         //檢測是否超過上限或低于下限
  324.                 keyscan();                //按鍵檢測
  325.                 }
  326.                 else
  327.                 {
  328.                 keyscan();           //按鍵檢測
  329.                 }   
  330. }
  331. }

復制代碼

全部資料51hei下載地址:
數字溫度計設計.zip (633.93 KB, 下載次數: 222)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:460968 發表于 2019-1-3 15:13 | 只看該作者
非常漂亮的一篇帖子 對我的 課程設計很有幫助
回復

使用道具 舉報

板凳
ID:682512 發表于 2020-1-8 14:33 | 只看該作者
你好,有匯編版的嗎
回復

使用道具 舉報

地板
ID:417194 發表于 2020-1-10 19:07 | 只看該作者
太棒了,頂樓主
回復

使用道具 舉報

5#
ID:1055077 發表于 2022-12-4 17:01 來自觸屏版 | 只看該作者
值得下載參考學習
回復

使用道具 舉報

6#
ID:1134489 發表于 2024-10-23 19:48 | 只看該作者
作者太厲害了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩有码一区 | 免费黄色在线观看 | 中文字幕在线一区 | 丝袜 亚洲 欧美 日韩 综合 | 日韩精品一区二区三区在线播放 | 国产人久久人人人人爽 | 久久99视频 | 亚洲一区欧美 | 视频二区| 欧美福利精品 | 国产精品国产成人国产三级 | 一级毛片视频免费观看 | 网站黄色在线 | 性一交一乱一伦视频免费观看 | 久久国产三级 | 午夜精品久久久久久久久久久久久 | 国产高清精品一区二区三区 | 国产美女一区二区 | 日韩欧美成人一区二区三区 | 中文字幕免费中文 | 99这里只有精品视频 | 91正在播放 | 91亚洲国产精品 | 91在线精品视频 | 午夜资源 | 国产精品久久久久久福利一牛影视 | 超碰在线免费 | 欧美精品在线一区 | 中文字幕三区 | 久久网站黄| 欧美精品日韩精品国产精品 | 欧美极品视频在线观看 | 久久久99国产精品免费 | 激情在线视频网站 | 在线天堂免费中文字幕视频 | 99热精品在线 | 巨大黑人极品videos精品 | 999久久久国产精品 欧美成人h版在线观看 | 日本成人在线播放 | 国产欧美精品一区二区三区 | 国产高清免费 |