找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

單片機(jī)下位機(jī)與上位機(jī)程序溫度檢測(cè)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
1、本實(shí)驗(yàn)所用單片機(jī)已經(jīng)將DS18B20的數(shù)據(jù)腳連接到單片機(jī)的P3.7,所以只需要將板子連接到電腦即可,不需要接其他線。

2、打開上位機(jī).exe文件,選擇COM3-連接,溫度窗口就會(huì)有溫度輸出。

源碼:
/*********************************************************************************************
功能:下位機(jī)通過串口把DS18B20的監(jiān)測(cè)數(shù)據(jù)發(fā)送到上位機(jī)并顯示
/**********************************************************************************************/

#include<reg52.h>

#define uint  unsigned int
#define uchar unsigned char

sbit DQ=P3^7;                            // 接DS18B20的數(shù)據(jù)端

/***********************************
   函數(shù):DelayMs(uint z)
----------------------
   說明:毫秒級(jí)的延時(shí)
   參數(shù):z 代表要延時(shí)的毫秒數(shù)
返回值:無
***********************************/
void DelayMs(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}


/***********************************
   void ReSet(void)
------------------
   說明:復(fù)位啟動(dòng)DS18B20
   參數(shù):無
返回值:無
***********************************/
void ReSet(void)
{
        uint i;
        DQ=0;
        i=100;
        while(i--);
        DQ=1;
        i=4;
        while(i--);
        while(DQ);
        while(~DQ);
        i=4;
        while(i--);
}



/***********************************
   uchar ReadByte(void)
------------------
   說明:讀取DS18B20的一個(gè)字節(jié)
   參數(shù):無
返回值:返回讀取到的字節(jié)
***********************************/
uchar ReadByte(void)
{
        uchar i,j,b,dat=0;
        for(j=0;j<8;j++)
        {                                                
                DQ=0;
                i++;
                DQ=1;        
                i=3;                // 延時(shí)15us
                while(--i);
                b=DQ;
                i=10;
                while(i--);
                dat=(b<<7)|(dat>>1);
        }
        return(dat);
}


/************************************************
   void WriteByte(uchar b)
------------------
   說明:寫數(shù)據(jù)的一個(gè)字節(jié),滿足寫1和寫0的時(shí)隙要求
   參數(shù):b代表要寫入到DS18B20的內(nèi)容
返回值:無
************************************************/
void WriteByte(uchar b)
{
        uint i;
        uchar j;
        bit btmp;
        for(j=0;j<8;j++)
        {
                btmp=b&0x01;
                b=b>>1;                         // 取下一位(由低位向高位)
                if(btmp)
                {
                        DQ=0;
                        i++;
                        i++;
                        DQ=1;
                        i=10;
                        while(i--);                // 整個(gè)寫1時(shí)隙不低于60us
                }
                else
                {
                        DQ=0;
                        i=10;
                        while(i--);         // 保持低在60us到120us之間
                        DQ=1;
                        i++;
                        i++;
                }
        }
}




/************************************************
   uint ReadTemp(void)
------------------
   說明:讀取溫度值
   參數(shù):無
返回值:返回讀取到的溫度
************************************************/
uint ReadTemp(void)
{
        uchar TempLow,TempHig;         // 溫度值低位、高位字節(jié)
        float tt;
        uint temp;
        ReSet();                                // 產(chǎn)生復(fù)位脈沖,初始化DS18B20
        WriteByte(0xcc);                // skip rom 命令
        WriteByte(0x44);                // convert T 命令
        ReSet();
        WriteByte(0xcc);                // skip rom 命令
        WriteByte(0xbe);                // read 溫度命令
        TempLow=ReadByte();                // 溫度值低位字節(jié)(其中低4位為二進(jìn)制的"小數(shù)"部分)
        TempHig=ReadByte();                // 高位值高位字節(jié)(其中高5位為符號(hào)位)
        temp=TempHig;
        temp<<=8;
        temp=temp|TempLow;
        tt=temp*0.0625;
        temp=tt*10+0.5;
        return (temp);
}



/***********************************
   函數(shù):void send(uint dat)
---------------------------
   說明:將測(cè)得的距離通過串口發(fā)送出去
   參數(shù):dat是測(cè)得的距離
返回值:無
***********************************/        
void Send(uint dat)
{
        SBUF=(dat/1000)+ 48;                // 發(fā)送 千 位
        while(!TI);
        TI=0;
        SBUF=(dat%1000/100)+ 48;        // 發(fā)送 百 位
        while(!TI);
        TI=0;
        SBUF=(dat%100/10)+48;                // 發(fā)送 十 位
        while(!TI);
        TI=0;
        SBUF=(dat%10)+48;                        // 發(fā)送 個(gè) 位
        while(!TI);
        TI=0;
}

/***********************************
   函數(shù):void InitUart()
----------------------
   說明:對(duì)串口進(jìn)行初始化
   參數(shù):無
返回值:無
***********************************/
void InitUart()
{
    SCON = 0x50;        //串口工作方式1,允許串口接收(SCON = 0x40 時(shí)禁止串口接收)
        PCON = 0x80;        //波特率倍頻(屏蔽本句波特率為2400)
        TMOD = 0x20;        //定時(shí)器T/C1工作方式2
        TH1 = 0xF3;        //定時(shí)器初值高8位設(shè)置
        TL1 = 0xF3;        //定時(shí)器初值低8位設(shè)置
        EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
        ES = 1; //允許UART串口的中斷        
        TR1 = 1;        //定時(shí)器啟動(dòng)  
}



/***********************
   函數(shù):void main(void)
----------------------
   說明:主函數(shù)
   參數(shù):無
返回值:無
***********************/
void main()
{
        uint temp;                                        // 用來保存讀取到的溫度值
        InitUart();
        while(1)
        {
                                
                        temp=ReadTemp();
                        Send(temp);
                        DelayMs(200);

        }
}

/*****************************************************************************/
/*****************************************************************************/
篇幅原因只展示部分代碼,詳細(xì)代碼以及上位機(jī)程序請(qǐng)下載查看。


單片機(jī)代碼下載: 溫度檢測(cè)系統(tǒng).zip (59.84 KB, 下載次數(shù): 24)

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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