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

標題: 單片機+DS18B20溫度控制程序仿真與原理圖PCB文件 可設上下限 [打印本頁]

作者: 3wjkdhus    時間: 2022-10-23 12:25
標題: 單片機+DS18B20溫度控制程序仿真與原理圖PCB文件 可設上下限
基于51單片機溫度控制,使用18b20來做溫度傳感器,四位共陽數碼管顯示。功能說明書:系統啟動后默認溫度下限28℃、上限30℃。當溫度低于設定下限溫度時繼電器開啟、加熱指示燈亮起,當溫度達到設定上限溫度時蜂鳴器響起、保溫指示燈亮起,當溫度高于設定下限溫度低于上限溫度時蜂鳴器關閉保溫指示燈繼續亮起,溫度低于下限溫度時切換繼電器開啟加熱指示燈亮起。(假設設置燒水,溫度下限設置在90℃、上限設置100℃就行)

制作出來的實物圖如下:

電路原理圖如下:


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


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

單片機源程序如下:
#include<reg52.h>         //51單片機的頭文件
#include<intrins.h>   //函數程序中需要使用到空指令
/***_crol_ 字符循環左移
    _cror_ 字符循環右移
    _irol_ 整數循環左移
    _iror_ 整數循環右移
    _lrol_ 長整數循環左移
    _lror_ 長整數循環右移
    _nop_ 空操作 (相當于8051 NOP 指令)
    _testbit_ 測試并清零位 (相當于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;          //數碼管4
sbit w1=P2^5;          //數碼管3
sbit w2=P2^6;          //數碼管2
sbit w3=P2^7;          //數碼管1
sbit beep=P2^0;   //蜂鳴器
sbit jidianqi=P2^1; //繼電器
sbit yellow=P3^5;          //加熱指示燈
sbit led=P3^6;            //高溫指示燈
sbit zc=P3^7;         //系統運行正常指示燈
sbit set=P3^4;                     //選擇設置
sbit add=P3^3;                  //加
sbit dec=P3^2;                  //減
int temp1=0;//最高溫度和最低溫度標志位         
uint h;
uint temp;        //溫度函數
uchar r;
uchar high=30,low=28;        //開機默認最高溫度和最低溫度
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};          //共陽小數斷碼表
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};        //共陽個位帶小數點的斷碼表
uchar data temp_data[2]={0xff,0xff};//讀出溫度暫放
uchar data display[5]={0xff,0xff,0xff,0xff,0xff};//顯示單元數據,共四個數據和一個運算暫用
/***************11us延時函數***************/
void delay(uint t)
{
        for(;t>0;t--);
}
/***************數碼管顯示***************/
void scan()
{
        int j;
        for(j=0;j<4;j++)
        {
                switch(j)
                {
                        case 0:
                        dm=table_dm[display[0]];;
                        w0=0;  //打開數碼管顯示小數數字的數碼管位選端
                        delay(50);
                        w0=1;        //關閉數碼管顯示小數數字的數碼管位選端
                        case 1:
                        dm=table_dm1[display[1]];
                        w1=0;  //打開數碼管顯示個位數字的數碼管位選端
                        delay(50);
                        w1=1;        //關閉數碼管顯示個位數字的數碼管位選端
                        case 2:
                        dm=table_dm[display[2]];
                        w2=0;        //打開數碼管顯示十位數字的數碼管位選端
                        delay(50);
                        w2=1;        //關閉數碼管顯示十位數字的數碼管位選端
                        case 3:
                        dm=table_dm[display[3]];
                        w3=0;        //打開數碼管顯示百位數字的數碼管位選端
                        delay(50);
                        w3=1;        //關閉數碼管顯示百位數字的數碼管位選端
                }
        }
}
/****溫度傳感器采用的是DS18b20,此傳感器采用的
是“單總線”來傳輸數據。****/
/**************DS18B20初始化**************/
ow_reset(void)         //初始化
{
        char presence=1;
        while(presence)
        {
                while(presence)
                {
                        DQ=1;_nop_();_nop_();   //將數據線拉高并延時
                        DQ=0;           //將DQ(P1.0)引腳拉低。請注意,這里的DQ不是變量,而是單片機的引腳!!!                 
                        delay(50);   //延時
                        DQ=1;     //將DS拉高
                        delay(6);
                        presence=DQ;
                }
                delay(45);
                presence=~DQ;
        }
        DQ=1;        
        return presence;
}
/****************寫命令函數*****************/
void write_byte(uchar val)
{
        uchar i;
        for(i=8;i>0;i--)
        {
                DQ=1;_nop_();_nop_();    //將數據線拉高并延時
                DQ=0;_nop_();_nop_();_nop_();_nop_();          //將數據線拉低并延時
                DQ=val&0x01;
                delay(6);
                val=val>>1;               
        }
        DQ=1;
        delay(1);
}        
/****************讀一個字節函數*******************/
uchar read_byte(void)
{
        uchar i;
        uchar value=0;
        for(i=8;i>0;i--)  //采用for 循環,讀取原始溫度數據
        {
                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;
}
/***************讀取溫度函數***************/
read_temp()           //讀取18b20傳感器函數
{
        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;
}
/***************溫度數據處理函數***************/
work_temp(uint tem)         //溫度轉換函數
{
        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;}         //系統正常指示燈
        if(r>=high&&r<129)         //如果實際溫度高于等于于設定溫度
        {
                led=0;//保溫燈亮
                beep=0;//蜂鳴器響
                jidianqi=1; //繼電器停止加熱
                yellow=1;//加熱燈滅
        }
        else  //否則
        {
                beep=1;//蜂鳴器停
        }
        if(r<low)         //如果實際溫度小于設定溫度
        {
                yellow=0;//加熱燈亮
            led=1;//保溫燈滅
                jidianqi=0;          //繼電器開始加熱
        }
}
/***************溫度顯示轉換**************/
void xianshi(int horl)                 //數碼管顯示函數
{
        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, 下載次數: 324)




作者: zhouds18b20    時間: 2022-10-25 22:32
主函數 在附件里面

作者: 3wjkdhus    時間: 2022-10-26 07:06
主函數沒有復制到網頁上 附件里面有

作者: 3wjkdhus    時間: 2022-10-26 07:06
東西全部在文件里
作者: CHEN461107759    時間: 2022-11-16 17:33
試試效果
作者: 2521245392    時間: 2022-11-18 14:51
感謝樓主分享,回去試試效果
作者: staw    時間: 2022-11-24 15:49
完整的程序在附件里面
作者: 小白艾世雄    時間: 2022-12-24 08:19
感謝樓主分析,程序層次很清楚,注釋很詳細,適合初學者學習。
作者: abslearn    時間: 2023-2-8 11:27
感謝樓主分享,有空自己搞一個先··
作者: wifingtta    時間: 2023-2-25 15:50
8.9版本可以運行,可測正,負溫度,可以學習,謝謝樓主
作者: luzaijiaoxia    時間: 2023-5-9 00:52
感謝樓主  最近仿真DS18B20一直不成功,然后用了你這個,很穩定,感謝

作者: DDDRRR    時間: 2023-6-13 11:57
為啥超過上限溫度,我的蜂鳴器不響?
作者: 3wjkdhus    時間: 2023-6-14 07:53
DDDRRR 發表于 2023-6-13 11:57
為啥超過上限溫度,我的蜂鳴器不響?

用有源蜂鳴器
作者: tuuuuuuyj高手    時間: 2024-3-25 16:34
寫的好詳細,贊贊贊
作者: funny_0928    時間: 2024-3-28 22:25
程序要用Keil5打開
作者: funny_0928    時間: 2024-7-27 14:02
下載下來,里面只有原理圖啊,啥也沒有啊
作者: 3wjkdhus    時間: 2024-9-1 19:15
funny_0928 發表于 2024-7-27 14:02
下載下來,里面只有原理圖啊,啥也沒有啊

程序也在內
作者: 都尉少槐    時間: 2024-9-14 10:56
在哪抄的,你自己看看對嗎
作者: 3wjkdhus    時間: 2024-9-16 12:17
都尉少槐 發表于 2024-9-14 10:56
在哪抄的,你自己看看對嗎

是的你是大神,我是抄的,您高高在上,看不上別評價,以防傷您大雅。




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲最大网站 | 成人网在线 | 成人av网站在线观看 | 欧美成人久久 | 亚洲视频精品 | 夜夜操av| 96看片| 第一福利视频导航 | 日韩看片 | 久久久久久亚洲 | 亚洲成人久久久 | 国产精品日韩精品 | 成人黄色av| 一级免费黄色片 | 美女视频福利 | 亚洲日本天堂 | 午夜免费看片 | 成人91视频 | 国产精品原创 | 精品国产99久久久久久宅男i | 欧美日韩在线一区二区三区 | 日韩欧美黄色 | 欧美激情在线播放 | 国产特级黄色片 | 激情小说在线视频 | 亚洲第一色 | 日韩免费三级 | 视频在线一区 | 国产黄视频在线观看 | 精品国产一区二 | 欧美精品日韩少妇 | 欧美午夜精品一区二区三区 | 22精品一区二区三区 | 免费av小说| a级成人毛片 | 国产精品免费在线 | 天天草天天干 | www.中文字幕.com | 精品国产三级 | 久热在线| 久久一区二区视频 |