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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS1820 溫度檢測,串口輸出

  [復制鏈接]
跳轉到指定樓層
樓主
ID:283037 發表于 2018-2-27 09:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

請教一下大神,我用STC15W408AS+DS18B20, 想實現串口輸出文本類型的溫度數值,類似28.50這樣的溫度數值,用下面這個代碼需要怎么樣改,感謝。

#ifndef _DS18B20_H  
#define _DS18B20_H  

#include "reg51.h"
#include "intrins.h"

#define uchar unsigned char  
#define uint  unsigned int  

sbit DQ = P3^2;         //DS1820數據線IO口  
bit nflag;                //溫度正負標志  


/*****************************************************
    延時函數:延時1us
******************************************************/  
void delayus(uint i)  
{  
    while(i--);  
}  

/*****************************************************
    功能:         延時,最小單位為ms(晶振為11.0592
    計算方法:一個for循環 = 8個指令周期 = 8*12個機器周期
                        = 8*12*1/11.0592 = 0.0086ms
                        xms = 0.0086 * 110 = 0.946 ms
******************************************************/  
void delayms(uint xms)  
{  
    uint i,j;  
    for(i=xms;i>0;i--)            
        for(j=110;j>0;j--);  
}  

/*****************************************************
    DS18B20復位函數:
    1 數據線拉低,延時480us
    2 數據線拉高,延時480us
******************************************************/  
void ds1820rst()         
{  

    DQ = 1;             //初始狀態  
    delayus(4);      
    DQ = 0;             //拉低  
    delayus(480);   //延時480us  
    DQ = 1;             //拉高  
    delayus(480);   
}  


/****************************************************
    18b20讀數據:由低位到高位,重復八次,讀一個字節
    1 數據線拉低,延時4us
    2 數據線拉高,延時10us
    3 讀數據線狀態一位,處理數據,延時45us
    4 重復步驟1-3
*****************************************************/  
uchar ds1820rd()  
{  
    uchar i = 0;  
    uchar dat = 0;  
    for(i=8;i>0;i--)  
    {  
        DQ = 0;         //拉低數據線  
        delayus(4);  
        dat>>=1;      //空出第一位  
        DQ = 1;         //拉高數據線  
        delayus(10);  
        if(DQ)          //若為高電平,則最高位置一  
            dat|=0x80;  
        delayus(45);//延時45us  
    }  
    return(dat);  
}  


/**************************************************
    18b20寫數據:由低位到高位,重復八次,寫一個字節
    1 數據線拉低,延時15us
    2 送一位數據到數據線,延時60us
    3 數據線拉高
    4 重復步驟1-3
**************************************************/  
void ds1820wr(uchar wdata)  
{  
    uchar i = 0;  
    for (i=8; i>0; i--)  
    {  
        DQ = 0;                  //數據線拉低  
        delayus(15);  
        DQ = wdata&0x01; //將數據最低位送入數據線  
        delayus(60);         //延時10us  
        DQ = 1;                  //數據線拉高  
        wdata>>=1;             //字節右移一位  
    }  
}  


/*****************************************************
    讀溫度并轉換,根據RAM命令表寫命令
        0xcc:               不讀取序列地址
        0x44:               啟動溫度轉換
        0xbe:               讀取溫度
******************************************************/  
uint read_temp()     
{  
    uchar TL,TH;                                        //TL:低八位 TH:高八位  
    uchar wd;                                               //最終溫度的絕對值  

    ds1820rst();                                    //先復位  
    ds1820wr(0xcc);                             //不讀取64位地址,因為總線上只有一個DB1820,單片工作  
    ds1820wr(0x44);                               //啟動溫度轉換  

    delayus(125);  

    ds1820rst();  
    ds1820wr(0xcc);                             //跳過讀序列號  
    ds1820wr(0xbe);                             //讀取溫度  

    TL = ds1820rd();                                //讀低八位  
    TH = ds1820rd();                                //讀高八位  

    wd = TL/16+TH*16;  
//  tvalue = TH;                                //tvalue為16位  
//  tvalue = (tvalue<<8)+TL;  
//  if((tvalue&0xf800) == 0xf800)       //判斷負溫度  
//  {  
//      tvalue=~tvalue+1;                           //補碼=反碼+1  
//      nflag = 0;                                      //置標志位為0  
//  }  
//  else  
//      nflag = 1;  
//   
//  wd = tvalue*0.625;                          //計算溫度值  
    return(wd);                                         //返回溫度值  
}  


/*****************************************************
    串口初始化函數:
******************************************************/  
void init()  
{                 
    P1M0 = 0;P1M1 = 0;  
    SCON = 0x40;  
    T2L  = 0xe0;  
    T2H  = 0xfe;  
    AUXR = 0x14;  
    AUXR |= 0x01;  
    TI = 1;  
}  


/*****************************************************
    串口通訊函數:發送兩個字節,首字節為正負標志位,
                                第二個字節為溫度值
******************************************************/  
void comm(uchar temper)  
{  

//  while(!TI == 1);  
//  {  
//      TI = 0;  
//      SBUF = nflag;  
//  }  
    while(!TI == 1);  
    {  
        TI = 0;  
        SBUF = temper;  
    }  
}  


#endif  


void main()  
{  
    uchar temp;                     //臨時變量存儲溫度  
    init();                             //串口的初始化  

    while(1)  
    {  
        temp=read_temp();       //讀取溫度  
        delayms(500);               //延時0.5s  
        comm(temp);                 //發送至上位機  
    }  
}   

評分

參與人數 1黑幣 +1 收起 理由
deaker + 1 很給力!

查看全部評分

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

使用道具 舉報

沙發
ID:285855 發表于 2018-2-27 10:05 | 只看該作者
基本都有了,把串口參數波特率設置好就可以了吧
回復

使用道具 舉報

板凳
ID:96072 發表于 2018-2-27 11:24 | 只看該作者
加串口參數波特率
回復

使用道具 舉報

地板
ID:151348 發表于 2018-2-27 11:25 | 只看該作者
//  tvalue = TH;                                //tvalue為16位  
//  tvalue = (tvalue<<8)+TL;  
//  if((tvalue&0xf800) == 0xf800)       //判斷負溫度  
//  {  
//      tvalue=~tvalue+1;                           //補碼=反碼+1  
//      nflag = 0;                                      //置標志位為0  
//  }  
//  else  
//      nflag = 1;  
//   
//  wd = tvalue*0.625;                          //計算溫度值  
    return(wd);                                         //返回溫度值  
被注釋掉的這段就是把溫度轉換為10進制,另外,數字轉字符方法:數字0~9+0x30,就是將數字0-9轉換為字符'0'~'9'
回復

使用道具 舉報

5#
ID:283037 發表于 2018-2-27 11:33 | 只看該作者
這個程序是學習別人的,輸出是hex格式,我想要文本格式的。
回復

使用道具 舉報

6#
ID:285771 發表于 2018-2-27 13:12 | 只看該作者
把得到的temp 轉換成ascii碼,然后串口打印出來就好了
回復

使用道具 舉報

7#
ID:285953 發表于 2018-2-27 13:48 | 只看該作者
有時間一定好好學習一下!不錯
回復

使用道具 舉報

8#
ID:94031 發表于 2018-2-27 14:30 | 只看該作者
你用串口發送,完全沒有必要考慮轉成字符,你按浮點發送,上位機會把浮點轉成字符的。
回復

使用道具 舉報

9#
ID:283037 發表于 2018-2-27 16:16 | 只看該作者
xuyaqi 發表于 2018-2-27 14:30
你用串口發送,完全沒有必要考慮轉成字符,你按浮點發送,上位機會把浮點轉成字符的。

我試了,上位機收到的就是15,換算成10進制就是21度。我想直接收到21.00這樣的溫度數值,不知道怎么改。
回復

使用道具 舉報

10#
ID:190832 發表于 2018-2-27 17:16 | 只看該作者
把printf函數重映射,即重寫int fputc(int ch)函數,把串口發送一個字節函數放進去就行了

評分

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

查看全部評分

回復

使用道具 舉報

11#
ID:274747 發表于 2018-2-27 21:22 | 只看該作者
不是要改成浮點型嗎

評分

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

查看全部評分

回復

使用道具 舉報

12#
ID:283037 發表于 2018-2-28 17:36 | 只看該作者
已經搞定,感謝大家幫忙。
回復

使用道具 舉報

13#
ID:286508 發表于 2018-3-1 09:58 | 只看該作者

加串口參數波特率
回復

使用道具 舉報

14#
ID:618577 發表于 2020-6-26 16:57 | 只看該作者
有時間可以一起交流下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久久久一区二区国产 | 在线一级片 | 日韩一级电影免费观看 | 亚洲国产高清在线观看 | 午夜精品久久久久99蜜 | 久久99精品视频 | 99自拍视频 | 91精品无人区卡一卡二卡三 | 精品国产色 | 精品免费观看 | 999久久久 | 免费观看的黄色网址 | 激情一区二区三区 | 国内精品一区二区 | 一区二区三区不卡视频 | 精品国产乱码久久久久久1区2区 | 在线日韩在线 | 久久精品一级 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 国产伦精品一区二区三区高清 | 日本一道本视频 | 日韩欧美一区二区三区在线播放 | 日本黄色短片 | 免费国产黄网站在线观看视频 | 精品美女久久久 | 久久久久久久久国产精品 | 亚州毛片 | 欧美日韩一区在线 | 日本不卡免费新一二三区 | 久久久精品一区二区 | 欧美日韩手机在线观看 | 青青草华人在线视频 | 干一干操一操 | 亚洲视频在线免费观看 | 91精品国产91久久久久久密臀 | 国产精品一区在线 | 日本视频在线播放 | 国产日韩精品在线 | 九九综合 | 天天澡天天狠天天天做 | 久草视 |