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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+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)



評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:492633 發表于 2022-10-26 07:06 來自觸屏版 | 只看該作者
主函數沒有復制到網頁上 附件里面有
回復

使用道具 舉報

地板
ID:492633 發表于 2022-10-26 07:06 來自觸屏版 | 只看該作者
東西全部在文件里
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

8#
ID:1048397 發表于 2022-12-24 08:19 | 只看該作者
感謝樓主分析,程序層次很清楚,注釋很詳細,適合初學者學習。
回復

使用道具 舉報

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

使用道具 舉報

10#
ID:208271 發表于 2023-2-25 15:50 | 只看該作者
8.9版本可以運行,可測正,負溫度,可以學習,謝謝樓主
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

13#
ID:492633 發表于 2023-6-14 07:53 來自觸屏版 | 只看該作者
DDDRRR 發表于 2023-6-13 11:57
為啥超過上限溫度,我的蜂鳴器不響?

用有源蜂鳴器
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

程序也在內
回復

使用道具 舉報

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

使用道具 舉報

19#
ID:492633 發表于 2024-9-16 12:17 來自觸屏版 | 只看該作者
都尉少槐 發表于 2024-9-14 10:56
在哪抄的,你自己看看對嗎

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产免费网址 | 亚洲激情一区二区 | 久久久久久九九九九 | 毛片网站视频 | www.夜夜操 | 日韩免费一区二区三区 | 亚洲小视频在线观看 | 中文在线免费观看 | 成年人免费在线观看 | 黄色网址在线播放 | 国产中文在线观看 | 久久精品久久久久久久 | 久久久久久久97 | 欧美专区第一页 | 亚洲精品91天天久久人人 | 成人免费视频视频 | 波多野结衣一区二区三区在线观看 | 国产九九精品 | 久久久网站| 免费啪视频 | 久久在线免费视频 | 日日操夜夜骑 | 国产又粗又猛又黄又爽的视频 | 亚洲精品1区2区 | a免费视频 | 国产第一福利 | 天天草天天草 | 色伊人网| 国产精品久久午夜夜伦鲁鲁 | 日韩国产欧美 | 最新中文字幕在线观看 | 少妇av在线 | 色综合久久88色综合天天 | 一级二级片 | 中文字幕三级 | 欧美日韩亚洲视频 | 国产精品视频一区二区三区 | 日韩小视频 | 国产美女福利 | 欧美在线小视频 | 亚洲第一第二区 |