欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
DS1820 溫度檢測,串口輸出
[打印本頁]
作者:
alewe
時間:
2018-2-27 09:17
標題:
DS1820 溫度檢測,串口輸出
請教一下大神,我用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); //發送至上位機
}
}
作者:
gk2017
時間:
2018-2-27 10:05
基本都有了,把串口參數波特率設置好就可以了吧
作者:
HEIZI555
時間:
2018-2-27 11:24
加串口參數波特率
作者:
imxuheng
時間:
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'
作者:
alewe
時間:
2018-2-27 11:33
這個程序是學習別人的,輸出是hex格式,我想要文本格式的。
作者:
lo_
時間:
2018-2-27 13:12
把得到的temp 轉換成ascii碼,然后串口打印出來就好了
作者:
lbmjsj
時間:
2018-2-27 13:48
有時間一定好好學習一下!不錯
作者:
xuyaqi
時間:
2018-2-27 14:30
你用串口發送,完全沒有必要考慮轉成字符,你按浮點發送,上位機會把浮點轉成字符的。
作者:
alewe
時間:
2018-2-27 16:16
xuyaqi 發表于 2018-2-27 14:30
你用串口發送,完全沒有必要考慮轉成字符,你按浮點發送,上位機會把浮點轉成字符的。
我試了,上位機收到的就是15,換算成10進制就是21度。我想直接收到21.00這樣的溫度數值,不知道怎么改。
作者:
hange_v
時間:
2018-2-27 17:16
把printf函數重映射,即重寫int fputc(int ch)函數,把串口發送一個字節函數放進去就行了
作者:
其二v
時間:
2018-2-27 21:22
不是要改成浮點型嗎
作者:
alewe
時間:
2018-2-28 17:36
已經搞定,感謝大家幫忙。
作者:
171650333
時間:
2018-3-1 09:58
加串口參數波特率
作者:
asdf152128
時間:
2020-6-26 16:57
有時間可以一起交流下
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1