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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于DS18B20的數顯溫度計 數碼管顯示

  [復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 凌凈清河 于 2018-7-24 08:38 編輯

本作品采用STC15F104W單片機和四位共陰極數碼管設計

主要亮點:
1.數碼管使用74HC595作為段選驅動,為初學者提供了新的思路
次要亮點:
1.使用小巧的STC15F104W單片機

DS18B20的通信要點在于時序的嚴格對應,相比之下DHT11這一類的單總線通信時序要求更加寬松。
因為DS18B20算是極為常用的學習器件,故不做過多講解,本次作品不涉及搜索BOM、精度調節等操作,只是單器件讀取溫度值,數據處理將可以顯示的溫度值設置為-20℃~80℃。

(事實證明不同器件之間會有差異,讀取的值也會不盡相同)

DS18B20數據處理參考普中科技相關例程



#include<STC15.H>
sbit DSPORT=P3^5;//DS18B20管腳定義
#include<intrins.h>
#include"DS18B20.c"
sbit S1=P3^4;
sbit S2=P3^3;//數碼管位選管腳定義
sbit SER=P3^0;
sbit RCLK=P3^1;
sbit SRCLK=P3^2;//74HC595管腳定義

//全局變量表
unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//給74HC595的段選值
unsigned char Display_Temperature[4]={0x40,0x40,0x40,0x40};
int Data_temperature=0;
unsigned char t0_cnt=0;
/*##############################################################################################
設計名稱:基于DS18B20的數顯溫度計
設計者:清河

平臺:STC15F104W
硬件部分
數碼管顯示:位選使用74HC138改為2-4線譯碼、段選使用74HC595減少IO口使用
    使用4位共陰極數碼管,顯示無符號位

注意:由于STC15系列采用Y5內核,所以有關DS18B20精準延時部分在移植時應首先考慮更換
##############################################################################################*/
void delay(unsigned int cnt)//調用該函數進行一段時間的延時
{
    while(cnt--);
}

void hc595send(unsigned char dat)//使用SPI向74HC595發送一個字節的數據                                
{  
    unsigned char a;
    SRCLK=0;
    RCLK=0;
    for(a=0;a<8;a++)
    {
        SER=dat>>7;
        dat<<=1;
        SRCLK=1;
        _nop_();
        _nop_();
        SRCLK=0;   
    }
    RCLK=1;
    _nop_();
    _nop_();
    RCLK=0;
}

void smgdisplay()//數碼管顯示函數,參數為需要顯示的數組
{
    unsigned char i;
    for(i=0;i<4;i++)
    {
        switch(i)//位選,選擇點亮的數碼管
        {
            case(0):
                S1=0;S2=1; break;
            case(1):
                S1=1;S2=0; break;
            case(2):
                S1=0;S2=0; break;
            case(3):
                S1=1;S2=1; break;   
        }
        hc595send(Display_Temperature);
        delay(10); //間隔一段時間掃描   
        hc595send(0x00);//消隱
    }
}

void Data_processing()
{
    float temperature=0.0;//【03c4】似乎只是一個用于更改值為float類型的中間變量,考慮刪去
    int temperature_middle;//為了不更改全局變量中讀取出來的Data_temperature設置此中轉值
    if(Data_temperature>0xf000)//當溫度值為負數
    {
        Display_Temperature[0]=0x40;//顯示符號“-”的段碼
        //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
        temperature_middle=Data_temperature-1;
        temperature_middle=~temperature_middle;
        temperature=temperature_middle;
        temperature_middle=temperature*0.0625*100+0.5;   
        //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
        //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
        //算加上0.5,還是在小數點后面。
        if(temperature_middle<2000)
        {
            if(temperature_middle>=1000)
            {
                Display_Temperature[1]=smgduan[temperature_middle%10000/1000];
                Display_Temperature[2]=smgduan[temperature_middle%1000/100]|0x80;
                Display_Temperature[3]=smgduan[temperature_middle%100/10];
            }
            else
            {
                Display_Temperature[1]=smgduan[temperature_middle%1000/100]|0x80;
                Display_Temperature[2]=smgduan[temperature_middle%100/10];
                Display_Temperature[3]=smgduan[temperature_middle%10];
            }
        }
        else
        {
            unsigned char i;
            for(i=0;i<4;i++)
            {
                Display_Temperature=0x40;
            }
        }
    }
    else
    {
        temperature=Data_temperature;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
        //如果溫度是正的那么,那么正數的原碼就是補碼它本身
        temperature_middle=(int)(temperature*0.0625*100+0.5);   
        //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
        //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
        //算加上0.5,還是在小數點后面。
        if(temperature_middle<8000)
        {
            if(temperature_middle>=1000)
            {
                Display_Temperature[0]=smgduan[temperature_middle%10000/1000];
                Display_Temperature[1]=smgduan[temperature_middle%1000/100]|0x80;
                Display_Temperature[2]=smgduan[temperature_middle%100/10];
                Display_Temperature[3]=smgduan[temperature_middle%10];
            }
            else
            {
                Display_Temperature[0]=0x00;
                Display_Temperature[1]=smgduan[temperature_middle/100]|0x80;
                Display_Temperature[2]=smgduan[temperature_middle%100/10];
                Display_Temperature[3]=smgduan[temperature_middle%10];
            }
        }
        else
        {
            unsigned char i;
            for(i=0;i<4;i++)
            {
                Display_Temperature=0x40;
            }
        }
    }
}

void sys_init()
{
    TH0=0;
    TL0=0;
    ET0=1;
    TR0=1;
    EA=1;
}

void main()
{
    sys_init();
    while(1)
    {
        smgdisplay();
    }
}

void Temperature_Refresh() interrupt 1
{
    TL0 = 0x00;
    TH0 = 0x28;//5ms初值
    if(t0_cnt==10)
    {
        hc595send(0x00);
        Data_temperature=DS18B20_GetTemperature();
        Data_processing();
        t0_cnt=0;
    }
    else
    {
        t0_cnt++;
    }
}
由于中斷時的數據讀取和處理會占用一部分時間,導致數碼管有輕微閃爍感,使用者可以考慮將轉換精度調為最低并修改轉換等待時間以減少數碼管的閃爍感,同時別忘記調一下數據處理函數中對應的精度值。
上述程序仍然臃腫,但由于是普通器件的使用,沒有難點,所以也沒有進行優化,以完成功能為目的。


新礦城學習基地 凌凈清河
游客,如果您要查看本帖隱藏內容請回復

評分

參與人數 3黑幣 +110 收起 理由
兵臨天下 + 30 贊一個!
map0391 + 30
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:350006 發表于 2018-7-26 10:41 | 只看該作者
溫度讀取值怎么轉換?
回復

使用道具 舉報

板凳
ID:362076 發表于 2018-7-26 16:57 | 只看該作者
空格鍵~~ 發表于 2018-7-26 10:41
溫度讀取值怎么轉換?

溫度轉換在Data_processing()函數中,分正負數之后,temperature_middle就是轉換之后溫度值*100
回復

使用道具 舉報

地板
ID:323496 發表于 2018-7-26 19:36 | 只看該作者
可否有源程序和電路圖可以下載
回復

使用道具 舉報

5#
ID:362076 發表于 2018-7-27 12:57 | 只看該作者
manpingshui 發表于 2018-7-26 19:36
可否有源程序和電路圖可以下載

源程序回復之后就應該可以下載了,原理圖沒有的,74HC595驅動數碼管的典型應用電路在STC單片機的手冊上可以找到,138是基本模塊也不用解釋,單片機一共就6個IO口,定義在程序開頭處已經表明出來了,嘗試一下,看不明白再問。
回復

使用道具 舉報

6#
ID:203000 發表于 2018-7-28 08:08 | 只看該作者
這個溫度計的硬件設計思路很好。簡單實用。
回復

使用道具 舉報

7#
ID:79874 發表于 2018-7-28 15:59 | 只看該作者
下載學習下
回復

使用道具 舉報

8#
ID:56186 發表于 2018-8-8 23:02 | 只看該作者
下載學習下
回復

使用道具 舉報

9#
ID:385800 發表于 2018-8-13 14:55 | 只看該作者
喜歡。。。。。。。。。。。。
回復

使用道具 舉報

10#
ID:108366 發表于 2018-8-21 16:19 | 只看該作者
下載學習下
回復

使用道具 舉報

11#
ID:108366 發表于 2018-8-21 16:19 | 只看該作者
下載學習下
回復

使用道具 舉報

12#
ID:388788 發表于 2018-8-22 10:05 | 只看該作者
下載學習下
回復

使用道具 舉報

13#
ID:65956 發表于 2018-8-22 11:16 | 只看該作者
我一直有要作這個的方案,結果讓你先實現了
回復

使用道具 舉報

14#
ID:362076 發表于 2018-9-4 21:51 | 只看該作者
aking991 發表于 2018-8-22 11:16
我一直有要作這個的方案,結果讓你先實現了

hhh,不好意思啦~不過你可以試試別的模塊呀,BMP180、DHT11、這些常用的傳感器精度和可用性都不輸于DS18B20,配上OLED小屏幕,再加一個無線顯示功能,無線方式傳輸顯示多個不同位置傳感器的數據。

評分

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

查看全部評分

回復

使用道具 舉報

15#
ID:90140 發表于 2018-9-5 08:19 | 只看該作者
下載學習下
回復

使用道具 舉報

16#
ID:33449 發表于 2018-9-5 10:07 | 只看該作者
謝謝分享
回復

使用道具 舉報

17#
ID:33544 發表于 2018-9-9 08:47 | 只看該作者
學習數碼管顯示
回復

使用道具 舉報

18#
ID:187675 發表于 2018-9-9 09:19 | 只看該作者
可否有源程序和電路圖可以下載
回復

使用道具 舉報

19#
ID:187675 發表于 2018-9-9 09:21 | 只看該作者
學習數碼管顯示
回復

使用道具 舉報

20#
ID:386381 發表于 2018-9-9 16:08 來自手機 | 只看該作者
這個比較小巧經典
回復

使用道具 舉報

21#
ID:388870 發表于 2018-9-10 15:43 | 只看該作者
謝謝分享
回復

使用道具 舉報

22#
ID:87193 發表于 2018-9-11 10:43 | 只看該作者
回復了看下,學習了
回復

使用道具 舉報

23#
ID:362076 發表于 2018-9-11 11:08 | 只看該作者
rs7cai 發表于 2018-9-9 09:19
可否有源程序和電路圖可以下載

這個真沒有,這款單片機只有6個IO,DS18B20是單總線通信,再加上一個595驅動的數碼管顯示電路,當初制作的時候是直接焊接的,根本沒畫電路圖。
回復

使用道具 舉報

24#
ID:310820 發表于 2018-9-17 22:53 | 只看該作者
感謝分享,
回復

使用道具 舉報

25#
ID:16663 發表于 2018-9-18 22:06 來自手機 | 只看該作者
下載學習一下
回復

使用道具 舉報

26#
ID:216625 發表于 2018-9-19 17:52 | 只看該作者
謝謝分享,
回復

使用道具 舉報

27#
ID:258542 發表于 2018-9-23 16:33 | 只看該作者
新手學習學習溫度模塊
回復

使用道具 舉報

28#
ID:291850 發表于 2018-10-8 16:26 | 只看該作者
學習學習
回復

使用道具 舉報

29#
ID:405456 發表于 2018-10-8 21:50 來自手機 | 只看該作者
做得很漂亮

評分

參與人數 1黑幣 +5 收起 理由
凌凈清河 + 5 蟹蟹!

查看全部評分

回復

使用道具 舉報

30#
ID:409954 發表于 2018-10-15 21:41 | 只看該作者
下載學習下
回復

使用道具 舉報

31#
ID:204228 發表于 2018-10-16 08:40 | 只看該作者
謝謝分享!
回復

使用道具 舉報

32#
ID:101014 發表于 2018-10-18 11:22 來自手機 | 只看該作者
樓主厲害啊

評分

參與人數 1黑幣 +15 收起 理由
凌凈清河 + 15 蟹蟹,不過沒有很厲害啦

查看全部評分

回復

使用道具 舉報

33#
ID:3212 發表于 2018-10-18 14:21 | 只看該作者
用C語言好幾次都不成功(導師說是1T的51單片機定時中斷不好控制),改成匯編的就行了。佩服樓主調試的耐性。

評分

參與人數 1黑幣 +15 收起 理由
凌凈清河 + 15 其實還好,這些器件的通訊協議沒有特別嚴格.

查看全部評分

回復

使用道具 舉報

34#
ID:148003 發表于 2018-10-18 15:14 | 只看該作者
謝謝作者的分享和制作

評分

參與人數 1黑幣 +15 收起 理由
凌凈清河 + 15 蟹蟹,客氣了~

查看全部評分

回復

使用道具 舉報

35#
ID:58241 發表于 2019-4-10 18:34 | 只看該作者
簡單實用!!1

評分

參與人數 1黑幣 +12 收起 理由
NPC-1024 + 12 黑幣補貼

查看全部評分

回復

使用道具 舉報

36#
ID:499474 發表于 2019-4-11 01:30 來自手機 | 只看該作者
不錯,頂一下

評分

參與人數 1黑幣 +12 收起 理由
NPC-1024 + 12 黑幣補貼

查看全部評分

回復

使用道具 舉報

37#
ID:106887 發表于 2019-4-11 08:49 | 只看該作者
學習一下

評分

參與人數 1黑幣 +12 收起 理由
NPC-1024 + 12 黑幣補貼

查看全部評分

回復

使用道具 舉報

38#
ID:509665 發表于 2019-4-11 19:21 來自手機 | 只看該作者
學習一下

評分

參與人數 1黑幣 +12 收起 理由
NPC-1024 + 12 黑幣補貼

查看全部評分

回復

使用道具 舉報

39#
ID:510842 發表于 2019-4-12 21:46 | 只看該作者
給您點贊

評分

參與人數 1黑幣 +12 收起 理由
NPC-1024 + 12 黑幣補貼

查看全部評分

回復

使用道具 舉報

40#
ID:171746 發表于 2019-4-14 10:32 | 只看該作者
下來學習

評分

參與人數 1黑幣 +12 收起 理由
NPC-1024 + 12 黑幣補貼

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产高清 | 麻豆精品国产91久久久久久 | 日日噜噜噜夜夜爽爽狠狠视频, | 亚洲高清在线观看 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 久久久久久免费观看 | 一区二区三区视频在线观看 | 国产精品3区 | 午夜精品一区二区三区在线观看 | 国产成人久久 | 国产日韩欧美二区 | 三级特黄特色视频 | 亚洲精品二三区 | 亚洲一区二区 | 日韩中文字幕 | 欧美一级久久 | 亚洲精品久久久9婷婷中文字幕 | 精品视频一区二区 | 天天操天天射天天舔 | 99亚洲精品| 亚洲精品v | 米奇成人网| 日韩免费一区 | 久久综合一区 | 国产精品69毛片高清亚洲 | 美女黄色在线观看 | 欧美美女一区二区 | 免费观看黄色片视频 | 国产精品美女久久久久aⅴ国产馆 | 国产综合区 | 欧美黄色片 | 欧美一级视频免费看 | 精品一级| av天天看| 国产精品入口久久 | 国产精品久久久久久二区 | 欧美国产一区二区 | 黑人精品 | 欧美精品福利视频 | 日韩欧美中文在线 | 久久久999国产精品 中文字幕在线精品 |