1. 程式人生 > 其它 >ds18b20與dht11程式碼設計

ds18b20與dht11程式碼設計

技術標籤:微控制器

ds18b20與dht11程式碼設計

  1. Ds18b20程式碼設計
    在這裡插入圖片描述

                   圖1.2 DS18B20的初始時序
    

初始化時序:1-wire匯流排需獲取存在脈衝來檢測是否存在DS18B20,還要通過這個脈衝過程通知DS18B20準備好,微控制器將要對它進行操作。脈衝檢測過程中,首先微控制器拉低引腳,持續480us到960us,然後微控制器釋放匯流排,DS18B20等待15us到60us後,會主動拉低引腳60us到240us,然後DS18B20會主動釋放匯流排,這樣IO口會被上拉電阻自動拉高,即初始化成功。
unsigned char init_ds18b20()
{
unsigned char flag;

_DINT(); //禁止總中斷,防止干擾匯流排
DQ=0;//微控制器將DQ拉低
_delay_cycles(600); //產生500us復位脈衝
DQ=1; //拉高匯流排
_delay_cycles(60);//延時60us等待從機響應
if(DQ) 讀取存在脈衝
flag=1;
else
flag=0;
_EINT();//使能總中斷
return flag; //如果flag=0則初始化成功 flag=1則初始化失敗
}
圖1.3 DS18B20位寫入時序

                    圖1.3 DS18B20位寫入時序

寫時序:由圖1.3可知,當要給DS18B20寫入0時,微控制器將引腳拉低,持續時間大於60us小於120us。微控制器先拉低15us之後,DS18B20會從15us到60us之間讀取這一位,典型值是在30us讀取,最多不超過60us。當要給DS18B20寫入1時,微控制器先將引腳拉低,持續時間大於1us,然後馬上釋放匯流排,即拉高引腳,並且持續時間也要大於60us。

void writeonechar(unsigned char dat)
{
unsigned char i;
for (i=0x01; i!=0; i<<=1)//低位在先,依次移出8個bit
{
DQ=0;
_delay_cycles(2);//DQ拉低2us,寫週期開始,釋放匯流排讓DQ隨寫入的值變化
if(dat&i)
DQ=1;//若寫1,DQ拉高至少60us
else
DQ=0;//若寫0,DQ至少拉低60us
_delay_cycles(60);
DQ=1;//拉高通訊引腳
_delay_cycles(10);
}
}
在這裡插入圖片描述

                   圖1.4 DS18B20位讀取時序

位讀取時序:由圖1.4可知,當要讀取DS18B20的資料時,微控制器首先應該拉低引腳,並且至少保持1us的時間,然後釋放引腳,釋放完畢時應該儘快讀取引腳狀態,不能超過15us。

unsigned char readonechar()
{
unsigned i;
unsigned dat;
_DINT();
for(i=0x01;i!=0;i<<=1)//低位在先,依次採集8個bit
{
DQ=0; // 產生2us的低電平脈衝訊號
_delay_cycles(2);
DQ=1; // 結束低電平,等待18b20輸出資料
_delay_cycles(2);//延時2us
if(DQ)
{
dat|=i;
}
else
{
dat&=~i;
}
_delay_cycles(60);//延時60us
}
_EINT();
return dat;
}
2. DHT11模組的應用
2.1 DHT11模組的測溫原理
DHT11的供電電壓為:3-5.5V,電源引腳(VDD,GND)之間可增加一個100nF 的電容,用以去耦濾波。DATA引腳並聯一個5K以上的上拉電阻,增強訊號的抗干擾能力。感測器上電後,要等待 1s 以越過不穩定狀態在此期間無需傳送任何指令。DATA 用於微處理器與 DHT11之間的通訊和同步,採用單匯流排資料格式,一次通訊時間4ms左右,資料分小數部分和整數部分。操作流程如下:一次完整的資料傳輸為40bit,高位先出。資料格式:8bit溼度整數資料+8bit溼度小數資料+8bi溫度整數資料+8bit溫度小數資料+8bit校驗和 。8位校驗和等於8bit溼度整數資料+8bit溼度小數資料+8bi溫度整數資料+8bit溫度小數資料相加所得結果的末8位。若校驗正確則證明採集到有效溫度。
2.2 DHT11模組的程式碼設計
在這裡插入圖片描述

                        圖2.1 DHT11總時序圖

總時序(圖2.2):主機將DATA口拉低,至少拉低18ms作為開始訊號。DHT11從低功耗模式轉換到高速模式,等待主機開始訊號結束後,DHT11傳送響應訊號,送出40bit的資料,並觸發一次訊號採集。
在這裡插入圖片描述

                    圖2.3 DHT11初始化時序圖

初始化時序(圖2.3):DHT11接收到主機的開始訊號後,等待主機開始訊號結束,然後傳送80us低電平響應訊號。主機發送開始訊號結束後,延時等待20-40us後,讀取DHT11的響應訊號,主機發送開始訊號後,可以切換到輸入模式,或者輸出高電平均可,匯流排由上拉電阻拉高。匯流排為低電平,說明DHT11傳送響應訊號,即初始化成功,DHT11傳送響應訊號後,再把匯流排拉高80us,準備傳送資料。
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;//主機拉低
DHT11_delay_ms(20); //延時18ms以上
Data=1;//主機拉高
DHT11_delay_us(30);
}
在這裡插入圖片描述
在這裡插入圖片描述

          圖2.4 DHT11接收資料時序圖

接收資料時序:接收資料時可以先等待低電平過去,即等待資料線拉高,再延時60us,因為60us大於28us且小於70us,再檢測此時資料線是否為高,如果為高,則資料判定為1,否則為0。
uchar DHT11_rec_byte() //接收一個位元組
{
uchar i,dat=0;
for(i=0;i<8;i++) //從高到低依次接收8位資料
{
while(!Data); 等待50us低電平過去
DHT11_delay_us(8); //延時60us,如果還為高則資料為1,否則為0
dat<<=1; //移位使正確接收8位資料,資料為0時直接移位
if(Data==1) //資料為1時,使dat加1來接收資料1
dat+=1;
while(Data); //等待資料線拉低
}
return dat;
}