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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6712|回復: 9
收起左側

一個讀溫度不閃的18B20數碼管溫度計

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

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

2.jpg

3.jpg

4.jpg


貼上程序(顯示程序是自己寫的,18B20程序是網上找的現成的)
main.c
  1. /*
  2. 程序:18B20數碼管顯示
  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;                                                        //小數點
  14. int temp;                                                                        //溫度緩存
  15. //*******************************顯示函數*****************************
  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];                                //用來存取溫度各位數的值(只用到1-4)
  21.         uchar i;
  22.         uint j;
  23.         j=temp;
  24.   if(temp<0)j=-temp;                        //如果是負數轉換成正數
  25.         for(i=4;i>0;i--)                                //循環次數等于溫度值的位數
  26.                 {
  27.                         df[i]=j%10;                                        //取出各位數的值
  28.                         j/=10;
  29.                 }
  30.         if(temp<0)df[1]=10;                        //如果溫度是負數,千位顯示負號
  31.         if(df[1]==0)df[1]=11;                //如果千位是0不顯示空
  32.         for(i=4;i>0;i--)                                //循環次數等于數碼管的位數
  33.                 {
  34.                         delaynms(15);                                //先延時,跳出循環后馬上讀取溫度,避免讀溫度時數碼管閃
  35.                         duan=0xff;                                        //先關段顯
  36.                         duan=table[df[i]];        //送出段碼
  37.                         if(i==3)dp=0;                                //顯示小數點
  38.                         wei=wf[i];                                        //送出位碼                        
  39.                 }
  40. }
  41. //*********************************主函數*********************************
  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. //**************************初始化函數************************
  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. //**************************寫字節函數************************
  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. //***********************讀字節函數************************
  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. //************************讀取溫度函數************************
  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);                        //發送溫度轉化命令
  66.         reset();                                                         //再次復位
  67.         write_byte(0xcc);                        //忽略ROM
  68.         write_byte(0xbe);
  69.         a= read_byte();                                //讀溫度低字節
  70.         b= read_byte();                                //讀溫度高字節
  71.   tt=(b<<8)|a;                                        //合并
  72.   if(b>200)tt=~tt+1;                //如果是負溫度取反,加一
  73.   t=tt*0.625;                                                //轉換成十進制
  74.   if(b>200)t=~t;                                //如果是負溫度轉換成負數
  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);//寫字節
  8. uchar read_byte(void);//讀字節
  9. uint get_temp(void);//讀溫度

  10. #endif
復制代碼
delay.c
  1. #include "delay.h"
  2. //**************************10us延時函數************************
  3. void delayus(uint us)   
  4. {
  5.    while(us--);
  6. }
  7. //**************************nms延時函數************************
  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, 下載次數: 85)




回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:61002 發表于 2016-11-21 13:09 | 顯示全部樓層
數碼管顯示還可以繼續優化,現在看著有余暉
回復

使用道具 舉報

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

這幾段程序怎么組合
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日摸夜夜添夜夜添精品视频 | 91精品国产自产在线老师啪 | 日韩欧美不卡 | 极品粉嫩国产48尤物在线播放 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | av性色全交蜜桃成熟时 | 蜜桃免费一区二区三区 | 成人国产在线视频 | 日韩在线免费视频 | 亚洲第一视频网 | 欧美视频免费在线 | 欧美性大战久久久久久久蜜臀 | 天天精品在线 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 天天影视网天天综合色在线播放 | 91se在线| 国产精品永久久久久久久www | 黄色一级大片在线免费看产 | 日韩三级一区 | 欧美精品一区二区三区四区 在线 | 日韩国产欧美一区 | 99精品久久 | 男人av的天堂 | 中文字幕国产精品 | 成人婷婷 | 亚洲国产成人精品久久久国产成人一区 | 欧美一级二级在线观看 | 成人在线视频免费看 | 99热这里有精品 | 国产香蕉视频在线播放 | av官网在线| 欧美精品在线播放 | 亚洲一级毛片 | 成人国产精品入口免费视频 | 欧美精品一区二区在线观看 | 一级大片网站 | 99国内精品久久久久久久 | 日本午夜网 | 国产亚洲欧美另类一区二区三区 | 亚洲伊人a | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 |