找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6630|回復: 9
收起左側(cè)

一個讀溫度不閃的18B20數(shù)碼管溫度計

[復制鏈接]
ID:113376 發(fā)表于 2016-7-24 00:07 | 顯示全部樓層 |閱讀模式
本帖最后由 cyy998 于 2016-7-24 14:25 編輯

初學單片機,學著做一個18B20溫度計,開始在網(wǎng)上找了很多這方面的程序來學習,但是發(fā)現(xiàn)一個共同的問題,就是在18B20讀取溫度的時候數(shù)碼管都會閃一下,經(jīng)過研究發(fā)現(xiàn)原來是18B20讀取溫度需要的時間是毫秒級的,而數(shù)碼管顯示是實時掃描的,所以會造成顯示中斷。經(jīng)過幾天的折騰后,把顯示程序改進了一下,達到了預期效果,現(xiàn)在已經(jīng)看不到一點閃了,現(xiàn)把程序分享出來,跟同學們交流交流。
先上幾張實物:
1.jpg

2.jpg

3.jpg

4.jpg


貼上程序(顯示程序是自己寫的,18B20程序是網(wǎng)上找的現(xiàn)成的)
main.c
  1. /*
  2. 程序:18B20數(shù)碼管顯示
  3. MCU:STC89C52RC
  4. 晶振:11.0592MHz
  5. */
  6. #include<reg52.h>
  7. #include "delay.h"
  8. #include "ds18b20.h"
  9. #define uchar unsigned char
  10. #define uint unsigned int
  11. #define duan P2
  12. #define wei P3
  13. sbit dp=P2^7;                                                        //小數(shù)點
  14. int temp;                                                                        //溫度緩存
  15. //*******************************顯示函數(shù)*****************************
  16. void Display()
  17. {
  18.         uchar code table[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//共陽碼表0~9、負號、不顯,共12位
  19.         uchar code wf[5]={0xff,0xfe,0xfd,0xfb,0xf7};//位選表(只用到后4位)
  20.         uchar data df[5];                                //用來存取溫度各位數(shù)的值(只用到1-4)
  21.         uchar i;
  22.         uint j;
  23.         j=temp;
  24.   if(temp<0)j=-temp;                        //如果是負數(shù)轉(zhuǎn)換成正數(shù)
  25.         for(i=4;i>0;i--)                                //循環(huán)次數(shù)等于溫度值的位數(shù)
  26.                 {
  27.                         df[i]=j%10;                                        //取出各位數(shù)的值
  28.                         j/=10;
  29.                 }
  30.         if(temp<0)df[1]=10;                        //如果溫度是負數(shù),千位顯示負號
  31.         if(df[1]==0)df[1]=11;                //如果千位是0不顯示空
  32.         for(i=4;i>0;i--)                                //循環(huán)次數(shù)等于數(shù)碼管的位數(shù)
  33.                 {
  34.                         delaynms(15);                                //先延時,跳出循環(huán)后馬上讀取溫度,避免讀溫度時數(shù)碼管閃
  35.                         duan=0xff;                                        //先關(guān)段顯
  36.                         duan=table[df[i]];        //送出段碼
  37.                         if(i==3)dp=0;                                //顯示小數(shù)點
  38.                         wei=wf[i];                                        //送出位碼                        
  39.                 }
  40. }
  41. //*********************************主函數(shù)*********************************
  42. void main()
  43. {
  44.         reset();                                                                //18b20初始化
  45.         while(1)
  46.         {
  47.                 Display();                                                //顯示溫度
  48.     temp=get_temp();                        //讀取溫度
  49.         }        
  50. }
復制代碼
18b20.c
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "ds18b20.h"
  4. #include "delay.h"
  5. //**************************初始化函數(shù)************************
  6. void reset()
  7. {
  8.         uchar x=0;
  9.         DQ = 1;
  10.         delayus(1);
  11.         DQ = 0;
  12.         delayus(50);        //延時600us
  13.         DQ = 1;
  14.         delayus(6);                //延時80us
  15.         x=DQ;        
  16.         delayus(45);        //延時420us        
  17. }
  18. //**************************寫字節(jié)函數(shù)************************
  19. void write_byte(uchar wByte)
  20. {
  21.         uchar i;
  22.         for(i=8; i>0; i--)
  23.         {
  24.                 DQ = 0;
  25.                 _nop_();
  26.                 _nop_();
  27.                 _nop_();
  28.                 _nop_();
  29.                 DQ = wByte & 0x01;
  30.                 delayus(6);        
  31.                 DQ = 1;               
  32.                 wByte >>= 1;
  33.         }        
  34.         delayus(1);
  35. }
  36. //***********************讀字節(jié)函數(shù)************************
  37. uchar read_byte(void)
  38. {
  39.         uchar i,rByte;
  40.         for(i=8; i>0; i--)
  41.         {
  42.                 DQ = 0;
  43.                 _nop_();
  44.                 rByte >>= 1;
  45.                 DQ = 1;
  46.                 _nop_();
  47.                 _nop_();
  48.                 _nop_();
  49.                 _nop_();        
  50.                 if(DQ)
  51.                 rByte |= 0x80;
  52.                 delayus(6);
  53.         }
  54.         return rByte;
  55. }
  56. //************************讀取溫度函數(shù)************************
  57. uint get_temp(void)
  58. {
  59.         uchar a=0;
  60.         uchar b=0;
  61.         int t=0;                                                        //溫度
  62.         uint tt=0;
  63.         reset();                                                        //復位
  64.         write_byte(0xcc);                        //忽略ROM
  65.         write_byte(0x44);                        //發(fā)送溫度轉(zhuǎn)化命令
  66.         reset();                                                         //再次復位
  67.         write_byte(0xcc);                        //忽略ROM
  68.         write_byte(0xbe);
  69.         a= read_byte();                                //讀溫度低字節(jié)
  70.         b= read_byte();                                //讀溫度高字節(jié)
  71.   tt=(b<<8)|a;                                        //合并
  72.   if(b>200)tt=~tt+1;                //如果是負溫度取反,加一
  73.   t=tt*0.625;                                                //轉(zhuǎn)換成十進制
  74.   if(b>200)t=~t;                                //如果是負溫度轉(zhuǎn)換成負數(shù)
  75.         return(t);                                                //返回溫度值
  76. }
復制代碼
18b20.h
  1. #ifndef _DS18B20_H_
  2. #define _DS18B20_H_

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit DQ        =        P0^7;

  6. void reset(void);//復位
  7. void write_byte(uchar wByte);//寫字節(jié)
  8. uchar read_byte(void);//讀字節(jié)
  9. uint get_temp(void);//讀溫度

  10. #endif
復制代碼
delay.c
  1. #include "delay.h"
  2. //**************************10us延時函數(shù)************************
  3. void delayus(uint us)   
  4. {
  5.    while(us--);
  6. }
  7. //**************************nms延時函數(shù)************************
  8. void delaynms(uint n)
  9. {
  10.   uint a;
  11.         uchar b;
  12.         for(a=n;a>0;a--)
  13.                 for(b=110;b>0;b--);
  14. }
復制代碼
delay.h
  1. #ifndef _DELAY_H_
  2. #define _DELAY_H_
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. void delayus(uint us);//延時10微秒
  6. void delaynms(uint n);//延時若干毫秒

  7. #endif
復制代碼
最后附上源文件(有仿真)
18B20.rar (64.82 KB, 下載次數(shù): 85)




回復

使用道具 舉報

ID:79544 發(fā)表于 2016-7-25 08:32 | 顯示全部樓層
謝謝樓主分享,值得學習�。。。�!
回復

使用道具 舉報

ID:92231 發(fā)表于 2016-8-12 07:39 來自觸屏版 | 顯示全部樓層
菜鳥需要補充知識,所以下載,學習中
回復

使用道具 舉報

ID:108622 發(fā)表于 2016-10-12 19:29 來自觸屏版 | 顯示全部樓層
總能找到好東西
回復

使用道具 舉報

ID:141595 發(fā)表于 2016-10-18 12:29 | 顯示全部樓層
好東西。。。。。。。。。
回復

使用道具 舉報

ID:147631 發(fā)表于 2016-11-21 12:28 | 顯示全部樓層
您好,請問您寫過間隔一定時間測量溫度的嗎
回復

使用道具 舉報

ID:61002 發(fā)表于 2016-11-21 13:09 | 顯示全部樓層
數(shù)碼管顯示還可以繼續(xù)優(yōu)化,現(xiàn)在看著有余暉
回復

使用道具 舉報

ID:99130 發(fā)表于 2016-11-25 16:48 | 顯示全部樓層
騰飛的龍 發(fā)表于 2016-7-25 08:32
謝謝樓主分享,值得學習�。。。�!

這幾段程序怎么組合
回復

使用道具 舉報

ID:150416 發(fā)表于 2016-11-26 22:13 | 顯示全部樓層
這個DS18B20測的是管子的溫度,跟實際溫度差距很大的
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

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