微控制器小白學習之路(三十二)---DS18B20數字溫度計(三)
目標:目標: DS18B20數字溫度計(三)
- 18b20開始轉換溫度
DS18B20 的典型溫度讀取過程為:復位→發 SKIP ROM 命令(0XCC)→發開始轉換命令( 0X44)→延時→復位→傳送 SKIP ROM 命令(0XCC)→發讀儲存器命令( 0XBE)→連續讀出兩個位元組資料(即溫度)→結束。
- 我們把上面的過程分成了兩部分,並分別用函式表示
(1)復位→發 SKIP ROM 命令(0XCC)→發開始轉換命令( 0X44)→延時
復位→發 SKIP ROM 命令(0XCC)→發開始轉換命令( 0X44)→延時
void Ds18b20ReadTemp() //傳送讀取溫度命令--轉換
{
Ds18b20Init(); //18b20初始化
delay_1ms(1);
Ds18b20WriteByte(0xcc); //跳過ROM操作命令
DS18b20WriteByte(0x44); //傳送讀取溫度的轉換命令
//Delay1ms(100); //等待轉換成功,而如果你是一直刷著的話,就不用這個延時了
}
(2)復位→傳送 SKIP ROM 命令(0XCC)→發讀儲存器命令( 0XBE)
復位→傳送 SKIP ROM 命令(0XCC)→發讀儲存器命令( 0XBE)→連續讀出兩個位元組資料(即溫度)→結束
void Ds18b20ReadTempCom() //傳送讀取溫度命令--傳送讀取溫度指令
{
Ds18b20Init();
delay_1ms();
Ds18b20WriteByte(0xcc); //跳過ROM操作命令
Ds18b20WriteByte(0xbe); //傳送讀取溫度的讀取儲存器命令
}
- 讀取溫度
int Ds18b20ReadTemp() //讀取溫度
{
int temp = 0; //int型別佔2個位元組,共16位
uchar tmh,tml;
Ds18b20ReadTemp(); //先寫入轉換命令
Ds18b20ReadTempCom(); //然後等待轉換完成後傳送讀取溫度命令
tml = Ds18b20ReadByte();//先讀出低位元組
tmh = Ds18b20ReadByte();//再讀出高位元組
temp = tmh;
temp <<= 8; //相當於在低8位的溫度高8位向左移8位到正確位置
temp |= tml; //再把tml放到低8位儲存
return temp;
}
main檔案:
/*
實現現象:下載程式後,在DS18B20溫度感測器介面處,按照絲印方向插好溫度感測器,數碼管就會顯示
檢測的溫度值,
注意事項:將LED點陣模組的J1短接片短接到VCC端
*/
#include "reg52.h"
#include "ds18b20.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA = P3^0;
sbit LSB = P3^1;
sbit LSC = P3^3;
char num = 0;
u8 DisplayData[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(u16 i)
{
while(i--);
}
void datapros(int temp)
{
float tp;
if(temp<0){
DisplayData[0] = 0x40; //數碼管顯示一個‘-’來表示負號
temp = temp-1; //因為讀取的溫度是實際溫度的補碼,而又是負數所以原碼是補碼減1然後取反
temp = ~temp; //得到實際溫度
tp = temp;
temp = tp*0.0625*100+0.5; //由於temp是整形所以當小數賦給temp時會把小數點後面的數字去掉,
//為了不讓小數部分去掉我們乘100把小數變成整數
}
else{
DisplayData[0] = 0x00;
tp = temp;
temp = tp*0.0625*100+0.5;
}
DisplayData[1] = smgduan[temp/10000]; //取出5位數的最高位
DisplayData[2] = smgduan[temp%10000/1000]; //取出次高位
DisplayData[3] = smgduan[temp%1000/100] | 0x80; //取出一位並加上個小數點
DisplayData[4] = smgduan[temp%100/10];
DisplayData[5] = smgduan[temp%10]; //最低位
}
void DigDisplay()
{
u8 i;
for(i=0;i<6;i++){
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
}
P0 = DisplayData[i]; //向數碼管傳送資料
delay(100);//間隔一段時間掃描
P0 = 0x00;
}
}
void main()
{
while(1){
datapros(Ds18b20ReadTemp()); //資料處理函式
DigDisplay(); //數碼管顯示函式
}
}
標頭檔案:
#ifndef _ds18b20_H_
#define _ds18b20_H_
#include<reg52.h>
#include<intrins.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
sbit DSPORT = P3^7;
void delay_1ms(uint );
void delay_10tus(uint );
uchar Ds18b20Init();
void Ds18b20WriteByte(uchar );
uchar Ds18b20ReadByte();
void Ds18b20ChangeTemp();
void Ds18b20ReadTempCom();
int Ds18b20ReadTemp();
#endif
相關文章
- 微控制器學習(十二)1-Wire通訊協議和DS18B20溫度感測器協議
- 微控制器小白學習之路(十二)---直流電機的控制
- 微控制器小白學習之路(四)---led燈的閃爍
- DS18B20讀取溫度並顯示在數碼管上
- FastAPI 學習之路(三十二)建立資料庫ASTAPI資料庫
- 數字技術變革:廣度、深度和溫度
- (一):小白的Flink學習計劃以及進度表
- 小白機器學習基礎演算法學習必經之路(下)機器學習演算法
- 關於DS18B20溫度感測器的時序詳解及程式碼分析
- 一枚iOS程式設計師學習JavaWeb之路(三)-EhCacheiOS程式設計師JavaWeb
- Linux學習之路(三)Shell指令碼初探Linux指令碼
- 學習Spring Cloud與微服務之路三SpringCloud微服務
- python學習之數字Python
- 零基礎Python學習路線,小白的進階之路!Python
- 計算機網路小白學習-2計算機網路
- 小白學習Golang(三)Go語言基本語法Golang
- 人工智慧之路學習計劃人工智慧
- RxJS的學習之路三(建立一個Observable)JS
- AI 學習之路——輕鬆初探 Python 篇(三)AIPython
- Linux學習之路(三) — 搭建nginx伺服器LinuxNginx伺服器
- web前端學習之路的第三天Web前端
- 大三寒假學習進度(8)
- 小白怎麼學習雲端計算?雲端計算學習大綱
- 數字化轉型之路的三個關鍵節點
- 【重溫基礎】6.數字
- python學習-數字和列表Python
- ElasticSearch7.3學習(三十二)----logstash三大外掛(input、filter、output)及其綜合示例ElasticsearchFilter
- 設計師學習HTML/CSS之路-07HTMLCSS
- day1 上升的溫度--三種方法
- 儀器儀表水銀,水銀溫度計,水銀體溫計
- Python學習筆記 - 字串,數字Python筆記字串
- eggjs學習之路JS
- java學習之路Java
- Pytest學習之路
- 黑馬程式設計師前端學習之路程式設計師前端
- 5000字長文,kurryluo 的自學程式設計之路程式設計
- Java工程師修煉之路(從小白到BAT的兩年學習歷程)Java工程師BAT
- golang學習之路之函式可變引數Golang函式