找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7112|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)+DS18B20溫度控制程序仿真與原理圖PCB文件 可設(shè)上下限

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:492633 發(fā)表于 2022-10-23 12:25 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
基于51單片機(jī)溫度控制,使用18b20來做溫度傳感器,四位共陽數(shù)碼管顯示。功能說明書:系統(tǒng)啟動后默認(rèn)溫度下限28℃、上限30℃。當(dāng)溫度低于設(shè)定下限溫度時繼電器開啟、加熱指示燈亮起,當(dāng)溫度達(dá)到設(shè)定上限溫度時蜂鳴器響起、保溫指示燈亮起,當(dāng)溫度高于設(shè)定下限溫度低于上限溫度時蜂鳴器關(guān)閉保溫指示燈繼續(xù)亮起,溫度低于下限溫度時切換繼電器開啟加熱指示燈亮起。(假設(shè)設(shè)置燒水,溫度下限設(shè)置在90℃、上限設(shè)置100℃就行)

制作出來的實物圖如下:

電路原理圖如下:


仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)

單片機(jī)源程序如下:
#include<reg52.h>         //51單片機(jī)的頭文件
#include<intrins.h>   //函數(shù)程序中需要使用到空指令
/***_crol_ 字符循環(huán)左移
    _cror_ 字符循環(huán)右移
    _irol_ 整數(shù)循環(huán)左移
    _iror_ 整數(shù)循環(huán)右移
    _lrol_ 長整數(shù)循環(huán)左移
    _lror_ 長整數(shù)循環(huán)右移
    _nop_ 空操作 (相當(dāng)于8051 NOP 指令)
    _testbit_ 測試并清零位 (相當(dāng)于8051 JBC 指令) ***/
#define dm P0          //段碼輸出口
#define uchar unsigned char //宏定義,用uchar來代替unsigned char(無符號字符型變量,也即是無符號的8位變量),                                         
//宏定義的原因就是書寫方便,宏定義后,uchar可直接用來定義變量
#define uint unsigned int  //原因同上,不過要注意,unsigned int為無符號的整型變量
//sbit是用來管腳的。
sbit DQ=P1^0;          //溫度輸入口
sbit w0=P2^4;          //數(shù)碼管4
sbit w1=P2^5;          //數(shù)碼管3
sbit w2=P2^6;          //數(shù)碼管2
sbit w3=P2^7;          //數(shù)碼管1
sbit beep=P2^0;   //蜂鳴器
sbit jidianqi=P2^1; //繼電器
sbit yellow=P3^5;          //加熱指示燈
sbit led=P3^6;            //高溫指示燈
sbit zc=P3^7;         //系統(tǒng)運(yùn)行正常指示燈
sbit set=P3^4;                     //選擇設(shè)置
sbit add=P3^3;                  //加
sbit dec=P3^2;                  //減
int temp1=0;//最高溫度和最低溫度標(biāo)志位         
uint h;
uint temp;        //溫度函數(shù)
uchar r;
uchar high=30,low=28;        //開機(jī)默認(rèn)最高溫度和最低溫度
uchar sign;
uchar q=0;
uchar tt=0;
uchar scale;
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};          //共陽小數(shù)斷碼表
uchar code table_dm[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};          //共陽LED段碼表"0""1""2""3""4""5""6""7""8""9""不亮""-"
uchar code table_dm1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};        //共陽個位帶小數(shù)點的斷碼表
uchar data temp_data[2]={0xff,0xff};//讀出溫度暫放
uchar data display[5]={0xff,0xff,0xff,0xff,0xff};//顯示單元數(shù)據(jù),共四個數(shù)據(jù)和一個運(yùn)算暫用
/***************11us延時函數(shù)***************/
void delay(uint t)
{
        for(;t>0;t--);
}
/***************數(shù)碼管顯示***************/
void scan()
{
        int j;
        for(j=0;j<4;j++)
        {
                switch(j)
                {
                        case 0:
                        dm=table_dm[display[0]];;
                        w0=0;  //打開數(shù)碼管顯示小數(shù)數(shù)字的數(shù)碼管位選端
                        delay(50);
                        w0=1;        //關(guān)閉數(shù)碼管顯示小數(shù)數(shù)字的數(shù)碼管位選端
                        case 1:
                        dm=table_dm1[display[1]];
                        w1=0;  //打開數(shù)碼管顯示個位數(shù)字的數(shù)碼管位選端
                        delay(50);
                        w1=1;        //關(guān)閉數(shù)碼管顯示個位數(shù)字的數(shù)碼管位選端
                        case 2:
                        dm=table_dm[display[2]];
                        w2=0;        //打開數(shù)碼管顯示十位數(shù)字的數(shù)碼管位選端
                        delay(50);
                        w2=1;        //關(guān)閉數(shù)碼管顯示十位數(shù)字的數(shù)碼管位選端
                        case 3:
                        dm=table_dm[display[3]];
                        w3=0;        //打開數(shù)碼管顯示百位數(shù)字的數(shù)碼管位選端
                        delay(50);
                        w3=1;        //關(guān)閉數(shù)碼管顯示百位數(shù)字的數(shù)碼管位選端
                }
        }
}
/****溫度傳感器采用的是DS18b20,此傳感器采用的
是“單總線”來傳輸數(shù)據(jù)。****/
/**************DS18B20初始化**************/
ow_reset(void)         //初始化
{
        char presence=1;
        while(presence)
        {
                while(presence)
                {
                        DQ=1;_nop_();_nop_();   //將數(shù)據(jù)線拉高并延時
                        DQ=0;           //將DQ(P1.0)引腳拉低。請注意,這里的DQ不是變量,而是單片機(jī)的引腳。!                 
                        delay(50);   //延時
                        DQ=1;     //將DS拉高
                        delay(6);
                        presence=DQ;
                }
                delay(45);
                presence=~DQ;
        }
        DQ=1;        
        return presence;
}
/****************寫命令函數(shù)*****************/
void write_byte(uchar val)
{
        uchar i;
        for(i=8;i>0;i--)
        {
                DQ=1;_nop_();_nop_();    //將數(shù)據(jù)線拉高并延時
                DQ=0;_nop_();_nop_();_nop_();_nop_();          //將數(shù)據(jù)線拉低并延時
                DQ=val&0x01;
                delay(6);
                val=val>>1;               
        }
        DQ=1;
        delay(1);
}        
/****************讀一個字節(jié)函數(shù)*******************/
uchar read_byte(void)
{
        uchar i;
        uchar value=0;
        for(i=8;i>0;i--)  //采用for 循環(huán),讀取原始溫度數(shù)據(jù)
        {
                DQ=1;_nop_();_nop_();
                value>>=1;
                DQ=0;_nop_();_nop_();_nop_();_nop_();
                DQ=1;_nop_();_nop_();_nop_();_nop_();
                if(DQ)value|=0x80;
                delay(6);
        }
        DQ=1;        
        return value;
}
/***************讀取溫度函數(shù)***************/
read_temp()           //讀取18b20傳感器函數(shù)
{
        ow_reset();
        delay(200);
        write_byte(0xcc);
        write_byte(0x44);
        ow_reset();
        delay(1);
        write_byte(0xcc);
        write_byte(0xbe);
        temp_data[0]=read_byte();
        temp_data[1]=read_byte();
        temp=temp_data[1];
        temp<<=8;
        temp=temp|temp_data[0];
        return temp;
}
/***************溫度數(shù)據(jù)處理函數(shù)***************/
work_temp(uint tem)         //溫度轉(zhuǎn)換函數(shù)
{
        uchar n=0;
        if(tem>6348)
        {
                tem=65536-tem;
                n=1;
        }
        display[4]=tem&0x0f;
        display[0]=ditab[display[4]];
        display[4]=tem>>4;
        display[3]=display[4]/100;
        display[1]=display[4]%100;
        display[2]=display[1]/10;
        display[1]=display[1]%10;
        r=display[1]+display[2]*10+display[3]*100;
        if(!display[3])
        {
                display[3]=0x0a;
                if(!display[2])        
                {
                        display[2]=0x0a;
                }
        }
        if(n)
        {
                display[3]=0x0b;
        }
        return n;
}
/***************報警提示電路***************/
void BEEP()
{

        {zc=0;}         //系統(tǒng)正常指示燈
        if(r>=high&&r<129)         //如果實際溫度高于等于于設(shè)定溫度
        {
                led=0;//保溫?zé)袅?br />                 beep=0;//蜂鳴器響
                jidianqi=1; //繼電器停止加熱
                yellow=1;//加熱燈滅
        }
        else  //否則
        {
                beep=1;//蜂鳴器停
        }
        if(r<low)         //如果實際溫度小于設(shè)定溫度
        {
                yellow=0;//加熱燈亮
            led=1;//保溫?zé)魷?br />                 jidianqi=0;          //繼電器開始加熱
        }
}
/***************溫度顯示轉(zhuǎn)換**************/
void xianshi(int horl)                 //數(shù)碼管顯示函數(shù)
{
        int n=0;
        if(horl>128)
        {
                horl=256-horl;
                n=1;
        }
        display[3]=horl/100;         //         顯示千位
        display[3]=display[3]&0x0f;          //顯示千位
        display[2]=horl%100/10;                   // 顯示百位
        display[1]=horl%10;                                // 顯示個位
        display[0]=0;                          // 顯示分
        if(!display[3])
        {
                display[3]=0x0a;
                if(!display[2])        
                {
                        display[2]=0x0a;
                }
        }
        if(n)
        {
                display[3]=0x0b;
        }   

                                                                             
仿真程序和AD PCB文件下載: 51 18b20 .rar (1.78 MB, 下載次數(shù): 324)



評分

參與人數(shù) 2黑幣 +80 收起 理由
akm4a1 + 30 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏22 分享淘帖 頂3 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1049214 發(fā)表于 2022-10-25 22:32 | 只看該作者
主函數(shù) 在附件里面
回復(fù)

使用道具 舉報

板凳
ID:492633 發(fā)表于 2022-10-26 07:06 來自手機(jī) | 只看該作者
主函數(shù)沒有復(fù)制到網(wǎng)頁上 附件里面有
回復(fù)

使用道具 舉報

地板
ID:492633 發(fā)表于 2022-10-26 07:06 來自手機(jī) | 只看該作者
東西全部在文件里
回復(fù)

使用道具 舉報

5#
ID:936755 發(fā)表于 2022-11-16 17:33 | 只看該作者
試試效果
回復(fù)

使用道具 舉報

6#
ID:981391 發(fā)表于 2022-11-18 14:51 | 只看該作者
感謝樓主分享,回去試試效果
回復(fù)

使用道具 舉報

7#
ID:1052763 發(fā)表于 2022-11-24 15:49 | 只看該作者
完整的程序在附件里面
回復(fù)

使用道具 舉報

8#
ID:1048397 發(fā)表于 2022-12-24 08:19 | 只看該作者
感謝樓主分析,程序?qū)哟魏芮宄,注釋很詳?xì),適合初學(xué)者學(xué)習(xí)。
回復(fù)

使用道具 舉報

9#
ID:894868 發(fā)表于 2023-2-8 11:27 | 只看該作者
感謝樓主分享,有空自己搞一個先··
回復(fù)

使用道具 舉報

10#
ID:208271 發(fā)表于 2023-2-25 15:50 | 只看該作者
8.9版本可以運(yùn)行,可測正,負(fù)溫度,可以學(xué)習(xí),謝謝樓主
回復(fù)

使用道具 舉報

11#
ID:821272 發(fā)表于 2023-5-9 00:52 | 只看該作者
感謝樓主  最近仿真DS18B20一直不成功,然后用了你這個,很穩(wěn)定,感謝
回復(fù)

使用道具 舉報

12#
ID:1068711 發(fā)表于 2023-6-13 11:57 | 只看該作者
為啥超過上限溫度,我的蜂鳴器不響?
回復(fù)

使用道具 舉報

13#
ID:492633 發(fā)表于 2023-6-14 07:53 來自手機(jī) | 只看該作者
DDDRRR 發(fā)表于 2023-6-13 11:57
為啥超過上限溫度,我的蜂鳴器不響?

用有源蜂鳴器
回復(fù)

使用道具 舉報

14#
ID:1114112 發(fā)表于 2024-3-25 16:34 | 只看該作者
寫的好詳細(xì),贊贊贊
回復(fù)

使用道具 舉報

15#
ID:1098146 發(fā)表于 2024-3-28 22:25 | 只看該作者
程序要用Keil5打開
回復(fù)

使用道具 舉報

16#
ID:1098146 發(fā)表于 2024-7-27 14:02 | 只看該作者
下載下來,里面只有原理圖啊,啥也沒有啊
回復(fù)

使用道具 舉報

17#
ID:492633 發(fā)表于 2024-9-1 19:15 | 只看該作者
funny_0928 發(fā)表于 2024-7-27 14:02
下載下來,里面只有原理圖啊,啥也沒有啊

程序也在內(nèi)
回復(fù)

使用道具 舉報

18#
ID:674046 發(fā)表于 2024-9-14 10:56 | 只看該作者
在哪抄的,你自己看看對嗎
回復(fù)

使用道具 舉報

19#
ID:492633 發(fā)表于 2024-9-16 12:17 來自手機(jī) | 只看該作者
都尉少槐 發(fā)表于 2024-9-14 10:56
在哪抄的,你自己看看對嗎

是的你是大神,我是抄的,您高高在上,看不上別評價,以防傷您大雅。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表