国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

51單片機學習--DS18B20溫度讀取&溫度報警器

這篇具有很好參考價值的文章主要介紹了51單片機學習--DS18B20溫度讀取&溫度報警器。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

51單片機學習--DS18B20溫度讀取&溫度報警器,51單片機,51單片機,學習,嵌入式硬件,單片機
需要先編寫OneWire模塊,再在DS18B20模塊中調用OneWire模塊的函數
51單片機學習--DS18B20溫度讀取&溫度報警器,51單片機,51單片機,學習,嵌入式硬件,單片機
先根據原理圖做好端口的聲明:

sbit OneWire_DQ = P3^7;

接下來像之前一樣把時序結構用代碼模擬出來:
51單片機學習--DS18B20溫度讀取&溫度報警器,51單片機,51單片機,學習,嵌入式硬件,單片機

unsigned char OneWire_Init(void)
{
	unsigned char i;
	unsigned char AckBit;
	OneWire_DQ = 1;
	
	OneWire_DQ = 0; //總線拉低
	//延時500us
	i = 227; while (--i);
	
	OneWire_DQ = 1; //釋放總線
	//延時70us
	i = 29; while (--i);
	
	AckBit = OneWire_DQ;
	//延時500us
	i = 227; while (--i);
	
	return AckBit;
}

51單片機學習--DS18B20溫度讀取&溫度報警器,51單片機,51單片機,學習,嵌入式硬件,單片機

void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i;
	OneWire_DQ = 0; //總線拉低
	
	//延時10us后直接讀電平
	i = 4; while(--i);
	OneWire_DQ = Bit;
	
	//延時50us湊滿時間片
	i = 22; while(--i);
	
	OneWire_DQ = 1;
}

51單片機學習--DS18B20溫度讀取&溫度報警器,51單片機,51單片機,學習,嵌入式硬件,單片機

unsigned char OneWire_ReceiveBit(void)
{
	unsigned char i;
	unsigned char Bit;
	OneWire_DQ = 0;
	
	//延時5us
	i = 2; while(--i);
	OneWire_DQ = 1;
	//延時5us
	i = 2; while(--i);
	
	Bit = OneWire_DQ;
	
	//延時50us
	i = 22; while(--i);
	
	return Bit;
}

51單片機學習--DS18B20溫度讀取&溫度報警器,51單片機,51單片機,學習,嵌入式硬件,單片機

void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i = 0; i < 8; i ++) {
		OneWire_SendBit(Byte & (0x01<<i));
	}
}

unsigned char OneWire_ReceiveByte(void)
{
	unsigned char i;
	unsigned char Byte = 0x00;
	for(i = 0; i < 8; i ++) {
		if(OneWire_ReceiveBit()) {Byte |= (0x01<<i);}
	}
	
	return Byte;
}

至此,OneWire模塊就寫好了,接下來在DS18B20模塊中模擬數據幀:
51單片機學習--DS18B20溫度讀取&溫度報警器,51單片機,51單片機,學習,嵌入式硬件,單片機

51單片機學習--DS18B20溫度讀取&溫度報警器,51單片機,51單片機,學習,嵌入式硬件,單片機

#include <REGX52.H>
#include "OneWire.h"

#define DS18B20_SKIP_ROM   0xCC
#define DS18B20_CONVERT_T  0x44
#define DS18B20_READ_SCRATCHPAD  0xBE

void DS18B20_ConvertT(void)
{
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);
	OneWire_SendByte(DS18B20_CONVERT_T);
}


float DS18B20_ReadT(void)
{
	unsigned char TLSB, TMSB;
	int temp;
	float T;
	
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);
	OneWire_SendByte(DS18B20_READ_SCRATCHPAD);
	TLSB = OneWire_ReceiveByte();
	TMSB = OneWire_ReceiveByte();
	
	temp = (TMSB<<8) | TLSB;
	T = temp / 16.0;
	
	return T;
}

之后只需要在main中調用即可

#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"

float T;


void main()
{
	LCD_Init();
	LCD_ShowString(1, 1, "Temperature!");
	
	while(1)
	{
		DS18B20_ConvertT();
		T = DS18B20_ReadT();
		
		if(T < 0)
		{
			LCD_ShowChar(2, 1, '-');
			T = -T;
		}
		else
		{
			LCD_ShowChar(2, 1, '+');
		}
		LCD_ShowNum(2, 2, T, 3);//整數部分
		LCD_ShowChar(2, 5, '.');
		LCD_ShowNum(2, 6, (unsigned long)(T *10000) % 10000, 4); //小數部分
	}
}

51單片機學習--DS18B20溫度讀取&溫度報警器,51單片機,51單片機,學習,嵌入式硬件,單片機


接下來進行一些綜合的應用:溫度報警器,按鍵可調整報警溫度的上下限,且能用AT24C02記錄上下限,掉電不丟失(這里默認所有溫度不會超過DS18B20的芯片范圍)

#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"
#include "AT24C02.h"
#include "Key.h"
#include "Timer0.h"


float T, TShow;
char THigh, TLow;
unsigned char KeyNum;


void main()
{
	THigh = AT24C02_ReadByte(0);
	TLow = AT24C02_ReadByte(1);
	//第一次讀可能是非法值,所以要特判一下
	if(THigh > 125 || TLow < - 55 || THigh <= TLow)
	{
		THigh = 20;
		TLow = 15;
	}
	
	Timer0_Init();
	LCD_Init();
	LCD_ShowString(1, 1, "T:");
	LCD_ShowString(2, 1, "TH:");
	LCD_ShowString(2, 9, "TL:");
	LCD_ShowSignedNum(2, 4, THigh, 3);
	LCD_ShowSignedNum(2, 12, TLow, 3);
	
	while(1)
	{
		KeyNum = Key();
		
		
		/*溫度讀取及顯示*/
		DS18B20_ConvertT();
		T = DS18B20_ReadT();
		
		if(T < 0)
		{
			LCD_ShowChar(1, 3, '-');
			TShow = -T;
		}
		else
		{
			LCD_ShowChar(1, 3, '+');
			TShow = T;
		}
		LCD_ShowNum(1, 4, TShow, 3);
		LCD_ShowChar(1, 7, '.');
		LCD_ShowNum(1, 8, (unsigned long)(TShow * 100)%100, 2);
		
		
		/*閾值判斷及顯示*/
		if(KeyNum)
		{
			if(KeyNum == 1) THigh ++;
			if(KeyNum == 2) THigh --;
			if(KeyNum == 3) TLow ++;
			if(KeyNum == 4) TLow --;
			
			LCD_ShowSignedNum(2, 4, THigh, 3);
			LCD_ShowSignedNum(2, 12, TLow, 3);
			AT24C02_WriteByte(0, THigh);
			Delay(5);
			AT24C02_WriteByte(1, TLow);
			Delay(5);
		}
		
		if(T > THigh) LCD_ShowString(1, 13, "OV:H");
		else if(T < TLow) LCD_ShowString(1, 13, "OV:L");
		else LCD_ShowString(1, 13, "    ");
			
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x66;		//設置定時初值
	TH0 = 0xFC;		//設置定時初值
	T0Count ++;
	if(T0Count >= 20) //20ms執(zhí)行一次
	{
		T0Count = 0;
		
    Key_Loop();
	}
}

51單片機學習--DS18B20溫度讀取&溫度報警器,51單片機,51單片機,學習,嵌入式硬件,單片機

這還沒完,在與定時器的結合中,定時器的中斷會影響OneWire的延時,從而影響其中的時序結構進而影響溫度實時獲取,所以在時序結構編寫的代碼中需要加上屏蔽定時器中斷的代碼:開始時加上EA = 0,最后加上EA = 1,改版后的OneWire模塊如下:

#include <REGX52.H>

sbit OneWire_DQ = P3^7;

unsigned char OneWire_Init(void)
{
	unsigned char i;
	unsigned char AckBit;
	EA = 0;  //屏蔽中斷
	OneWire_DQ = 1;
	
	OneWire_DQ = 0; //總線拉低
	//延時500us
	i = 227; while (--i);
	
	OneWire_DQ = 1; //釋放總線
	//延時70us
	i = 29; while (--i);
	
	AckBit = OneWire_DQ;
	//延時500us
	i = 227; while (--i);
	
	EA = 1;
	return AckBit;
}

void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i;
	EA = 0;  //屏蔽中斷
	OneWire_DQ = 0; //總線拉低
	
	//延時10us后直接讀電平
	i = 4; while(--i);
	OneWire_DQ = Bit;
	
	//延時50us湊滿時間片
	i = 22; while(--i);
	
	OneWire_DQ = 1;
	EA = 1;
}

unsigned char OneWire_ReceiveBit(void)
{
	unsigned char i;
	unsigned char Bit;
	EA = 0;  //屏蔽中斷
	OneWire_DQ = 0;
	
	//延時5us
	i = 2; while(--i);
	OneWire_DQ = 1;
	//延時5us
	i = 2; while(--i);
	
	Bit = OneWire_DQ;
	
	//延時50us
	i = 22; while(--i);
	
	EA = 1;
	return Bit;
}


void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i = 0; i < 8; i ++) {
		OneWire_SendBit(Byte & (0x01<<i));
	}
}

unsigned char OneWire_ReceiveByte(void)
{
	unsigned char i;
	unsigned char Byte = 0x00;
	for(i = 0; i < 8; i ++) {
		if(OneWire_ReceiveBit()) {Byte |= (0x01<<i);}
	}
	
	return Byte;
}

但是這樣雖然能維護好單總線的通信,但這樣直接屏蔽中斷卻會影響定時器的計時準確度,從而對定時器控制的其他模塊造成影響,這也就是單總線的一大缺點,不過在這個實例中,按鍵的定時器準度要求并不高,所以這樣控制影響不大文章來源地址http://www.zghlxwxcb.cn/news/detail-632577.html

到了這里,關于51單片機學習--DS18B20溫度讀取&溫度報警器的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 51單片機溫度傳感器DS18B20

    51單片機溫度傳感器DS18B20

    實現功能 插上DS18B20溫度傳感器,數碼管顯示檢測的溫度值 單片機型號:STC89C52 DS18B20介紹 1、DS18B20簡介 DS18B20 是由 DALLAS 半導體公司推出的一種的“一線總線(單總線)”接口的溫度傳感器。與傳統的熱敏電阻等測溫元件相比,它是一種新型的體積小、 適用電壓寬、與微處理

    2024年02月01日
    瀏覽(25)
  • 51單片機(十三)DS18B20溫度傳感器

    51單片機(十三)DS18B20溫度傳感器

    ?? 專欄簡介:本專欄記錄了從零學習單片機的過程,其中包括51單片機和STM32單片機兩部分;建議先學習51單片機,其是STM32等高級單片機的基礎;這樣再學習STM32時才能融會貫通。 ?? 專欄適用人群 :適用于想要從零基礎開始學習入門單片機,且有一定C語言基礎的的童鞋

    2024年02月11日
    瀏覽(28)
  • MCU-51:單片機DS18B20溫度報警器

    MCU-51:單片機DS18B20溫度報警器

    DS18B20是一種常見的數字溫度傳感器,其控制命令和數據都是以數字信號的方式輸入輸出,相比較于模擬溫度傳感器,具有功能強大、硬件簡單、易擴展、抗干擾性強等特點 測溫范圍:-55°C 到 +125°C 通信接口:1-Wire(單總線) 其它特征:可形成總線結構、內置溫度報警功能、

    2024年02月02日
    瀏覽(22)
  • 基于51單片機多路溫度檢測proteus仿真 ds18b20

    基于51單片機多路溫度檢測proteus仿真 ds18b20

    本設計是基于51單片機多路溫度檢測proteus仿真_ds18b20(仿真+程序+原理圖) 仿真圖proteus 7.8 程序編譯器:keil 4/keil 5 編程語言:C語言 設計編號:C0042 功能說明: 通過對多路DS18B20溫度傳感器的數據采集,實現8路/4路溫度采集并將數值顯示在LCD顯示屏上; 通過按鍵設置溫度報警

    2024年02月12日
    瀏覽(25)
  • 【小實驗】C51單片機 DS18B20溫度顯示實驗

    【小實驗】C51單片機 DS18B20溫度顯示實驗

    ? ? ?利用單總線技術和數碼管動態(tài)顯示的原理,要求實現DS18B20溫度采集并顯示,能夠設定溫度值上限值27.5度,當超出上限值LED燈閃爍。? ? 實驗前可先用protues繪制出原理圖: ? 代碼僅供參考,希望大家能夠在此基礎上優(yōu)化代碼,而不是ctrl+c,ctrl+v。 謝謝?。。?? ? ? ?

    2024年02月12日
    瀏覽(23)
  • 基于51單片機的DS18B20溫度控制加熱降溫系統設計

    基于51單片機的DS18B20溫度控制加熱降溫系統設計

    仿真圖:proteus8.9以上 程序代碼:KEIL4/KEIL5 原理圖:AD 設計編號:A0007 結合實際情況,基于51單片機設計一個排隊叫號系統設計。該系統應滿足的功能要求為: 系統由51單片機、DS18B20溫度傳感器、LCD1602液晶顯示屏、繼電器、風扇、加熱膜、按鍵、蜂鳴器組成。 可實現以下基本功能

    2023年04月09日
    瀏覽(29)
  • 基于51單片機數字溫度報警器_DS18B20可調上下限

    基于51單片機數字溫度報警器_DS18B20可調上下限

    (仿真+程序+原理圖) 原理圖:Altium Designer 仿真版本:proteus 7.8 程序編譯器:keil 4/keil 5 編程語言:C語言 設計編號:S0009 1、實時溫度測量及顯示,超出溫度范圍聲光報警,上下限溫度可通過按鍵設定等功能; 2、溫度測量范圍0到99.9攝氏度,精度為0.1攝氏度; 3、可設置上下

    2024年02月06日
    瀏覽(25)
  • 51單片機DS18B20溫度報警器proteus仿真設計_可調上下限

    51單片機DS18B20溫度報警器proteus仿真設計_可調上下限

    (仿真+源碼+原理圖+報告+講解視頻) 原理圖:Altium Designer 仿真版本:proteus 7.8 程序編譯器:keil 4/keil 5 編程語言:C語言 設計編號:S0008 本設計系統是18b20溫度報警系統數碼管顯示,可設置溫度上限高溫報警和下限低溫報警,報警溫度可精確到0.1度,并具有掉電保存功能,數

    2024年02月11日
    瀏覽(19)
  • 51單片機DS18B20溫度傳感器使用及數碼管溫度計、LCD1602溫度顯示代碼詳解

    51單片機DS18B20溫度傳感器使用及數碼管溫度計、LCD1602溫度顯示代碼詳解

    溫馨提示:讀者若要徹底理解并會靈活使用DS18B20溫度傳感器,請詳細閱讀中文手冊,并且對照代碼注釋充分分析代碼。請不要覺得中文手冊內容繁多!如能靜心分析,定能深有體會,獲益匪淺! 主函數操作順序(執(zhí)行序列) 功能指令 最后希望我的分享對你有所幫助!敬請關

    2024年02月12日
    瀏覽(29)
  • 【TB作品】MSP430單片機 Proteus仿真 DS18B20溫度 LCD1602顯示器 溫度讀取與顯示

    【TB作品】MSP430單片機 Proteus仿真 DS18B20溫度 LCD1602顯示器 溫度讀取與顯示

    效果圖如下: 首先,讓我們先來說說DS18B20集成電路。 ? DS18B20是一款采用OneWire通訊協議的集成電路,因此只需要一條線就可以與微控制器通訊。它不需要額外的電源,但是也有外部電源輸入端口。 ? OneWire設備具有64位的ROM代碼。如我們之前所說,這64位的前8位是家族代碼,中間

    2024年02月08日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包