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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于DS18B20數字溫度計 單片機程序和proteus仿真

  [復制鏈接]
跳轉到指定樓層
樓主
給大家分享2個溫度顯示程序和仿真
源程序
  1. #include "typedef.h"
  2. #include "device_init.h"
  3. #include "delay.h"

  4. /************************************************
  5. * 函數名稱:ds18b20_reset
  6. * 輸    入:
  7. * 輸    出:
  8. * 功能描述:
  9. *************************************************/
  10. u8 ds18b20_reset(void)
  11. {
  12.         DQ_PIN = HIGH;
  13.         delay_16us(1);
  14.         DQ_PIN = LOW;
  15.         delay_16us(30);                //延時600us
  16.         DQ_PIN = HIGH;
  17.         delay_16us(5);                //延時80us
  18.         if(!DQ_PIN)
  19.         {
  20.                 delay_16us(30);        //延時420us
  21.                 return 1;
  22.         }
  23.         else
  24.                 return 0;
  25. }
  26. /************************************************
  27. * 函數名稱:ds18b20_write_byte
  28. * 輸    入:
  29. * 輸    出:
  30. * 功能描述:
  31. *************************************************/
  32. void ds18b20_write_byte(u8 wByte)
  33. {
  34.         u8 i;

  35.         for(i=0; i<8; i++)
  36.         {
  37.                 DQ_PIN = LOW;
  38.                 NOP();
  39.                 NOP();
  40.                 NOP();
  41.                 NOP();
  42.                 NOP();
  43.                 NOP();
  44.                 NOP();
  45.                 DQ_PIN = wByte & 0x01;
  46.                 NOP();
  47.                 NOP();
  48.                 NOP();
  49.                 NOP();
  50.                 NOP();
  51.                 DQ_PIN = HIGH;
  52.                 NOP();
  53.                 NOP();
  54.                 NOP();
  55.                 wByte >>= 1;
  56.         }
  57. }
  58. /************************************************
  59. * 函數名稱:ds18b20_read_byte
  60. * 輸    入:
  61. * 輸    出:
  62. * 功能描述:
  63. *************************************************/
  64. u8 ds18b20_read_byte(void)
  65. {
  66.         u8 rByte;
  67.         u8 i;

  68.         for(i=0; i<8; i++)
  69.         {
  70.                 DQ_PIN = LOW;
  71.                 NOP();
  72.                 NOP();
  73.                 rByte >>= 1;
  74.                 NOP();
  75.                 NOP();
  76.                 NOP();
  77.                 NOP();
  78.                 NOP();
  79.                 NOP();
  80.                 DQ_PIN = HIGH;
  81.                 NOP();
  82.                 NOP();
  83.                 NOP();
  84.                 NOP();
  85.                 NOP();
  86.                 NOP();
  87.                 NOP();
  88.                 if(DQ_PIN)
  89.                         rByte |= 0x80;
  90.                 NOP();
  91.                 NOP();
  92.                 NOP();
  93.                 NOP();
  94.                 NOP();
  95.                 NOP();
  96.                 NOP();
  97.         }
  98.         DQ_PIN = HIGH;
  99.         return rByte;
  100. }
  101. /************************************************
  102. * 函數名稱:ds18b20_get_temp
  103. * 輸    入:
  104. * 輸    出:
  105. * 功能描述:
  106. *************************************************/
  107. u16 ds18b20_get_temp(void)
  108. {
  109.         u16 Temp;

  110.         if(ds18b20_reset() == 0)                        //復位
  111.                 return 0;
  112.         ds18b20_write_byte(0xcc);                        //忽略ROM
  113.         ds18b20_write_byte(0x44);                        //發送溫度轉化命令
  114.         delay_16us(30);
  115.         if(ds18b20_reset() == 0)                        //再次復位
  116.                 return 0;
  117.         ds18b20_write_byte(0xcc);                        //忽略ROM
  118.         ds18b20_write_byte(0xbe);

  119.         Temp = ds18b20_read_byte();
  120.         Temp |= ds18b20_read_byte() << 8;

  121.         return Temp;
  122. }
復制代碼


  1. /*
  2. #include <REGX52.H>
  3. #define uchar unsigned char
  4. sbit DQ=P2^0;       //數據傳輸線接單片機的相應的引腳
  5. unsigned char tempL=0;    //臨時變量低位(無符號字符變量)
  6. unsigned char tempH=0;   //臨時變量高位
  7. unsigned int tempa;      //溫度值(整型變量)
  8. uchar display_data[4]={0};
  9. void DS18_delay(int useconds)//延時函數
  10. {
  11. int s;
  12. for (s=0; s<useconds;s++);
  13. }
  14. unsigned char Init_DS18B20(void)
  15. {
  16. unsigned char x=0;

  17.    DQ=0;               //發送復位脈沖
  18.    DS18_delay(29);           //延時(>480ms)
  19.    DQ=1;             //拉高數據線
  20.    DS18_delay(3);         //等待(15~60ms) 等待存在脈沖
  21.     x=DQ;  //獲得存在信號(用于判斷是否有器件)
  22.     DS18_delay(25);  // 等待時間隙結束
  23.     return(x);  //返回存在信號,0 = 器件存在, 1 = 無器件
  24. }
  25. ReadOneChar(void)//讀一個字節
  26. {
  27. unsigned char i=0;   
  28. unsigned char dat=0;
  29.     for (i=8;i>0;i--)   
  30.   {
  31.    DQ=1;
  32.       DS18_delay(1);
  33.       DQ=0;      
  34.       dat>>=1;//復合賦值運算,等效dat=dat>>1(dat=dat右移一位后的值)
  35.       DQ=1;
  36.       if(DQ)
  37.       dat|=0x80;
  38.       DS18_delay(4);
  39.   }
  40.     return(dat);
  41. }
  42. WriteOneChar(unsigned char dat)//有參函數,功能是"寫",而寫的內容就是括號內的參數
  43. {
  44. unsigned char i=0;   
  45. for(i=8;i>0;i--)   
  46. {
  47.   DQ=0;     
  48.   DQ=dat&0x01;
  49.   DS18_delay(5);
  50.   DQ=1;
  51.   dat>>=1;//復合賦值運算,等效dat=dat>>1(dat=dat右移一位后的值)
  52. }
  53. DS18_delay(4);
  54. }
  55. unsigned int ReadTemperature(void)//返回讀取的溫度.
  56. {  
  57. Init_DS18B20();   //初始化,調用初始化函數
  58. WriteOneChar(0xcc);    //跳過讀序列號的操作,調用寫函數,寫0xcc指令碼(跳過讀序列號)
  59. WriteOneChar(0x44);   //啟動溫度轉換,調用寫函數,寫0x44指令碼(啟動溫度轉換)
  60. DS18_delay(125);       //轉換需要一點時間,延時
  61. Init_DS18B20();    //初始化,調用初始化函數
  62. WriteOneChar(0xcc);    //跳過讀序列號的操作,調用寫函數,寫0xcc指令碼(跳過讀序列號?
  63. WriteOneChar(0xbe);   //調用寫函數,寫0xbe指令碼,讀溫度寄存器(頭兩個值分別為溫度的低位和高位)
  64. tempL=ReadOneChar();   //讀出溫度的低位LSB
  65. tempH=ReadOneChar();   //讀出溫度的高位MSB  
  66.    tempa=((tempH*256)+tempL)*6.25;  //溫度轉換,擴大100返回
  67. //DS18_delay(10);
  68. //tempa=tempL+tempH;
  69. return(tempa);//運算結果返回到函數
  70. }
  71. void display()//顯示函數
  72. {
  73.   unsigned char i,j,k=0x80;
  74.   unsigned char code dis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39};
  75.   for(i=0;i<4;i++)
  76.    {
  77.     P2=0x0f;
  78.     if(i==1)
  79.      P0=dis[display_data[i]]+0x80;
  80.     else
  81.      P0=dis[display_data[i]];
  82.     P2=k;
  83.     k=k>>1;
  84.     for(j=250;j>0;j--);
  85.    }
  86.    P2=0x0f;
  87. }
  88. void main()
  89. {

  90. unsigned int temp;
  91. uchar i;
  92. while(1)
  93. {
  94.   temp=ReadTemperature();
  95.   display_data[0]=temp/1000;
  96.   display_data[1]=(temp/100)%10;
  97.   display_data[2]=(temp/10)%10;
  98.   display_data[3]=temp%10;
  99.   for(i=0;i<250;i++) display();
  100. }
  101. } */
  102. # include <reg51.h>  
  103. #define uint unsigned int
  104. #define uchar unsigned char   //宏定義
  105. sbit p34=P2^4;
  106. sbit p35=P2^5;
  107. sbit p36=P2^6;
  108. sbit dp=P0^7;
  109. sbit p37=P2^7;
  110. sbit  DQ=P2^2;    //定義DS18B20總線I/O
  111.   sbit SET=P3^1;    //定義選擇報調整警溫度上限和下限(1為上限,0為下限) /****P3.2和P3.3為調整溫度報警增加鍵和減少鍵******/
  112. sbit LING=P2^0;   //定義響鈴  
  113. signed char m;     //溫度值全局變量
  114. bit sign=0;     //外部中斷狀態標志
  115. signed char shangxian=38;  //上限報警溫度,默認值為38
  116. signed char xiaxian=6;   //下限報警溫度,默認值為5
  117.   uchar code  LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; /*****延時子程序*****/
  118. void Delay(uint i)
  119. {  
  120. while( i-- );
  121. }
  122. void Init_DS18B20(void)
  123. {  
  124.   unsigned char x=0;   
  125.     DQ=1;    Delay(8);    //稍做延時
  126.    DQ=0;         //單片機將DQ拉低  
  127. Delay(80);   //精確延時,大于480us
  128.   DQ=1;         //拉高總線
  129.   Delay(14);
  130.    x=DQ;           //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗  
  131. Delay(20);
  132. }  
  133. /*****讀一個字節*****/
  134.   unsigned char ReadOneChar(void)
  135. {   
  136. unsigned char i=0;
  137.   unsigned char dat=0;
  138.   for (i=8;i>0;i--)  
  139. {     
  140. DQ=0;     // 給脈沖信號   
  141.   dat>>=1;   
  142.    DQ=1;     // 給脈沖信號
  143.     if(DQ)     dat|=0x80;  
  144.    Delay(4);
  145.   }   
  146. return(dat); }  
  147. /*****寫一個字節*****/
  148. void WriteOneChar(unsigned char dat)
  149. {    unsigned char i=0;
  150.   for (i=8; i>0; i--)
  151.   {
  152.      DQ=0;   
  153.    DQ=dat&0x01;  
  154.    Delay(5);     
  155. DQ=1;     dat>>=1;
  156.   }
  157. }  
  158. void Tmpchange(void) //發送溫度轉換命令
  159. {  
  160.   Init_DS18B20();
  161.    WriteOneChar(0xCC);  //跳過讀序號列號的操作  
  162. WriteOneChar(0x44);  //啟動溫度轉
  163.    }
  164. unsigned int ReadTemperature(void)
  165. {   
  166. unsigned char a=0;
  167.   unsigned char b=0;
  168.   unsigned int t=0;  
  169. float tt=0;  
  170. Tmpchange();
  171.    Init_DS18B20();  
  172.   WriteOneChar(0xCC);  //跳過讀序號列號的操作
  173.   WriteOneChar(0xBE);  //讀取溫度寄存器  
  174. a=ReadOneChar();     //讀低8位
  175.   b=ReadOneChar();    //讀高8位
  176.   t=b;   t<<=8;   t=t|a;    tt=t*0.0625;    t= tt*100+0.5;     //放大10倍輸出并四舍五入
  177.   return(t); }     /*****顯示開機初始化等待畫面*****/
  178. Disp_init()     {   P0 = 0x80;      //顯示-
  179. p34=1;p35=0;p36=0;p37=0;
  180. Delay(200);
  181. P0 = 0x80;
  182.    p34=0;p35=1;p36=0;p37=0;
  183. Delay(200);
  184.   P0 = 0x80;
  185.     p34=0;p35=0;p36=1;p37=0;
  186. Delay(200);
  187.   P0 = 0x80;
  188.    p34=0;p35=0;p36=0;p37=1;
  189. Delay(200);
  190.   P0 = 0x80;
  191.   }  
  192. Disp_Temperature()     //顯示溫度
  193. {   uint a,b,c,d,e;  
  194. e=ReadTemperature();  //獲取溫度值
  195.   a=e/1000;             //計算得到十位數
  196. b=e/100-a*10;         //計算得到個位數字  
  197. d=e%10;               //計算得到小數點后兩位
  198. c=(e%100)/10;         //計算得到小數點后一位
  199. m=e/100;  
  200. if(m>shangxian || m<xiaxian) LING=1;  //溫度不在范圍內報警  
  201. else LING=0;  p34=0;p35=0;p36=0;p37=0;   
  202.   P0 =LEDData[d];   //顯示小數點后兩位  
  203.   p34=1;p35=0;p36=0;p37=0;      
  204.   Delay(300);  p34=0;p35=0;p36=0;p37=0;   
  205. P0 =LEDData[c];    //顯示小數點后一位
  206. p34=0;p35=1;p36=0;p37=0;
  207. Delay(300);
  208. p34=0;p35=0;p36=0;p37=0;   
  209. P0 =LEDData[b];    //顯示個位
  210. dp=0;  p34=0;p35=0;p36=1;p37=0;
  211. Delay(300);  p34=0;p35=0;p36=0;p37=0;  
  212.   P0 =LEDData[a];    //顯示十位
  213. p34=0;p35=0;p36=0;p37=1;  
  214. Delay(300);  p34=0;p35=0;p36=0;p37=0;        //關閉顯示
  215. }  
  216. disptiaozheng()  
  217. {   
  218. uchar f,g,j,k;  
  219. f=shangxian/10;  
  220. g=shangxian%10;  
  221. j=xiaxian/10;  
  222. k=xiaxian%10;  
  223. p34=0;p35=0;p36=0;p37=0;
  224.     P0 =0xc0;          //顯示0 p34=1;p35=0;p36=0;p37=0;
  225. Delay(200);  p34=0;p35=0;p36=0;p37=0;   P0 =0xc0;          //顯示0
  226. p34=0;p35=1;p36=0;p37=0;
  227. Delay(200);  p34=0;p35=0;p36=0;p37=0;  
  228. if(SET==1)
  229. {  
  230. P0 =LEDData[g];
  231.   dp=0;   //顯示上限溫度個位
  232.     }  
  233. else
  234. {
  235. P0 =LEDData[k];
  236.   dp=0;
  237.   }
  238. p34=0;p35=0;p36=1;p37=0;
  239.   Delay(200);  p34=0;p35=0;p36=0;p37=0;
  240.    if(SET==1) P0 =LEDData[f];   //顯示上限溫度十位
  241. else    {    if(f==0) P0=0x00;     //不顯示下限溫度十位
  242.   else P0 =LEDData[j];  //顯示下限溫度十位
  243.   }  p34=0;p35=0;p36=0;p37=1;
  244. Delay(200);
  245.   p34=0;p35=0;p36=0;p37=0;          //關閉顯示
  246. Delay(20);  
  247. }   
  248. void int0(void) interrupt 0 {     EX0=0;      //關外部中斷0
  249. sign=1;  
  250. if(SET==1) shangxian++;  else xiaxian++;
  251.   Delay(500);  EX0=1;
  252. }   /*****外部中斷1服務程序*****/
  253. void int1(void)
  254. interrupt 2
  255. {   
  256. EX1=0;      //關外部中斷0
  257. sign=1;   if(SET==1) shangxian--;
  258. else xiaxian--;  Delay(500);  EX1=1;
  259.   }   /*****主函數*****/
  260. void main(void)
  261. {   
  262. uint z;
  263. IT0=1;  
  264. IT1=1;
  265.   EX0=1;
  266.   EX1=1;
  267.   EA=1;
  268.    ReadTemperature();
  269.   LING=0;   
  270. for(z=0;z<100;z++)
  271.   {   
  272. Disp_init();     
  273.       }
  274. while(1)  
  275. {      
  276. Disp_Temperature();  
  277. if(sign==1)  
  278. {  
  279. for(z=0;z<300;z++)  
  280.   disptiaozheng();
  281.   sign=0;  
  282. }  
  283. }
  284. }
復制代碼





2個文件,都含有仿真和程序

溫度顯示.rar

156.57 KB, 下載次數: 269, 下載積分: 黑幣 -5

DS18B20溫度計.rar

69.17 KB, 下載次數: 247, 下載積分: 黑幣 -5

評分

參與人數 6黑幣 +30 收起 理由
BUDONGYAO + 5
我的autocad2010 + 5 很給力!
急不可待 + 5 很給力!
我的挨地 + 5 贊一個!
你不懂的丶我 + 5
xmd1972 + 5 贊一個!

查看全部評分

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

使用道具 舉報

沙發
ID:108622 發表于 2016-10-12 18:39 來自手機 | 只看該作者
贊一個
回復

使用道具 舉報

板凳
ID:108622 發表于 2016-10-12 18:40 來自手機 | 只看該作者
迷上溫度計
回復

使用道具 舉報

地板
ID:77498 發表于 2017-5-3 19:21 | 只看該作者
迷上溫度計
回復

使用道具 舉報

5#
ID:206965 發表于 2017-6-3 00:42 | 只看該作者
謝謝分享哈!好人一生平安!
回復

使用道具 舉報

6#
ID:219090 發表于 2017-7-12 13:02 | 只看該作者
感謝大咖為我指明新路。
回復

使用道具 舉報

7#
ID:228837 發表于 2017-8-22 18:58 | 只看該作者
兄弟你有c語言的程序嗎?
回復

使用道具 舉報

8#
ID:244345 發表于 2017-11-2 17:05 | 只看該作者
有沒有設計說明書
回復

使用道具 舉報

9#
ID:272215 發表于 2018-1-6 09:25 | 只看該作者
贊一個
回復

使用道具 舉報

10#
ID:272470 發表于 2018-1-6 19:00 | 只看該作者
1602顯示比較麻煩吧
回復

使用道具 舉報

11#
ID:146834 發表于 2018-1-6 21:22 | 只看該作者
要是3年前看見這個程序我就不用破費了
回復

使用道具 舉報

12#
ID:283883 發表于 2018-3-12 19:03 | 只看該作者
at89c52應該可以用stc89c52代替吧
回復

使用道具 舉報

13#
ID:291942 發表于 2018-3-14 18:51 | 只看該作者
溫度計

溫度計.rar

81.7 KB, 下載次數: 39, 下載積分: 黑幣 -5

評分

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

查看全部評分

回復

使用道具 舉報

14#
ID:351921 發表于 2018-6-14 15:44 來自手機 | 只看該作者
可以發一下第二張全圖嗎?蟹蟹喲!
回復

使用道具 舉報

15#
ID:359673 發表于 2018-6-27 14:48 | 只看該作者
請問大神這些程序都是什么功能呢,沒有注釋看不懂啊

620.png (132.44 KB, 下載次數: 50)

620.png
回復

使用道具 舉報

16#
ID:272932 發表于 2018-6-29 23:24 | 只看該作者
非常nice,謝謝
回復

使用道具 舉報

17#
ID:283883 發表于 2018-7-30 06:52 | 只看該作者
請問數碼管是共陰還是共陽,沒安裝proteus
回復

使用道具 舉報

18#
ID:401573 發表于 2018-9-23 14:45 | 只看該作者
看看,學習下
回復

使用道具 舉報

19#
ID:401573 發表于 2018-9-23 15:51 | 只看該作者
第二個仿真里的reset有什么用呢
回復

使用道具 舉報

20#
ID:417927 發表于 2018-10-30 15:56 | 只看該作者
很給力,謝謝樓主
回復

使用道具 舉報

21#
ID:422278 發表于 2018-11-8 13:45 | 只看該作者
第二張的圖下面有點看不到
回復

使用道具 舉報

22#
ID:362076 發表于 2018-11-11 19:46 | 只看該作者
你的程序有一個問題,就是在主函數中設置的是unsigned量用來存儲溫度,而溫度全局變量m是signed 的,這樣你顯示的時候調用temp位處理之后,溫度的負值就會顯示不正確。
回復

使用道具 舉報

23#
ID:425523 發表于 2018-11-13 10:20 | 只看該作者
非常好,這個帖子
回復

使用道具 舉報

24#
ID:418772 發表于 2018-11-17 21:23 | 只看該作者
迫切需要
回復

使用道具 舉報

25#
ID:243394 發表于 2019-7-13 09:40 | 只看該作者
很給力,謝謝樓主
回復

使用道具 舉報

26#
ID:658207 發表于 2019-12-9 15:43 來自手機 | 只看該作者
請問樓主,6mhz換成11.0592mhz應該怎么改程序呢
回復

使用道具 舉報

27#
ID:761335 發表于 2020-5-26 09:42 | 只看該作者
非常好,這個帖子
回復

使用道具 舉報

28#
ID:280206 發表于 2020-5-26 11:46 | 只看該作者
本帖最后由 haikuotian 于 2020-5-27 06:36 編輯

18B20的輸出狀態 26.5 度

回復

使用道具 舉報

29#
ID:764266 發表于 2020-5-30 16:03 | 只看該作者
很給力
回復

使用道具 舉報

30#
ID:786665 發表于 2020-6-22 14:47 | 只看該作者
回復

使用道具 舉報

31#
ID:786665 發表于 2020-6-22 14:51 | 只看該作者
第一個程序,頭文件里面是不是還封裝了什么?報錯誤打不開
回復

使用道具 舉報

32#
ID:787020 發表于 2020-6-23 11:44 來自手機 | 只看該作者
程序不對把
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产亚洲一区二区精品 | 久久国产高清 | 欧美成年黄网站色视频 | 精品国产欧美 | 男女羞羞网站 | 亚洲视频一区在线观看 | 欧美日韩国产一区 | 久久精品久久久久久 | 亚洲精品免费看 | 精品一区二区久久久久久久网站 | 亚洲国产免费 | 亚洲精品888 | 亚洲人成人一区二区在线观看 | 日韩av一区二区在线观看 | 波多野结衣一二三区 | 成人久草 | 日屁网站| 搞av.com | 国产传媒在线观看 | 人人鲁人人莫人人爱精品 | 天天天插 | 久久一区二区三区四区五区 | 国产精品s色 | 午夜精品一区二区三区在线观看 | 国产乱码精品一区二区三区五月婷 | 仙人掌旅馆在线观看 | 中文字幕一区在线观看视频 | 日本高清视频在线播放 | 亚洲国产精品一区二区第一页 | 一级a性色生活片久久毛片波多野 | 玖玖视频免费 | 精品在线一区 | 欧美xxxx日本 | 亚洲精品黄色 | 国产精品观看 | 在线欧美 | 中文字幕乱码一区二区三区 | 91精品国产欧美一区二区 | www.色53色.com| 欧美电影免费观看高清 | 人人叉|