新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 51單片機-溫度傳感器DS18B20

51單片機-溫度傳感器DS18B20

作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
void DS18B20_ID_read(){
DS18B20_reset();
DS18B20_write(0x33);
for(i = 0; i < 8; i++)
DS[ i] = DS18B20_read();
}
void main(){
init_lcd();
while(1){
DS18B20_ID_read();
Display_lcd(0,0,>);
Display_lcd(0,1,:);
Display_lcd(0,2,Time_Data[DS[0]/16]);
Display_lcd(0,3,Time_Data[DS[0]%16]);
Display_lcd(0,4,>);
Display_lcd(0,5,:);
Display_lcd(0,6,Time_Data[DS[1]/16]);
Display_lcd(0,7,Time_Data[DS[1]%16]);
Display_lcd(0,8,>);
Display_lcd(0,9,:);
Display_lcd(0,10,Time_Data[DS[2]/16]);
Display_lcd(0,11,Time_Data[DS[2]%16]);
Display_lcd(0,12,>);
Display_lcd(0,13,:);
Display_lcd(0,14,Time_Data[DS[3]/16]);
Display_lcd(0,15,Time_Data[DS[3]%16]);
Display_lcd(1,0,>);
Display_lcd(1,1,:);
Display_lcd(1,2,Time_Data[DS[4]/16]);
Display_lcd(1,3,Time_Data[DS[4]%16]);
Display_lcd(1,4,>);
Display_lcd(1,5,:);
Display_lcd(1,6,Time_Data[DS[5]/16]);
Display_lcd(1,7,Time_Data[DS[5]%16]);
Display_lcd(1,8,>);
Display_lcd(1,9,:);
Display_lcd(1,10,Time_Data[DS[6]/16]);
Display_lcd(1,11,Time_Data[DS[6]%16]);
Display_lcd(1,12,>);
Display_lcd(1,13,:);
Display_lcd(1,14,Time_Data[DS[7]/16]);
Display_lcd(1,15,Time_Data[DS[7]%16]);
}
}
單只DS18B20工作流程:
2只DS18B20并聯(lián)工作流程:
DS18B20溫度存儲格式:
DS18B20暫存器的分布:
DS18B20內(nèi)部ROM指令:
DS18B20內(nèi)部RAM指令:
讀出當(dāng)前溫度,在LCD上顯示,溫度超過一定時,報警。
#include <reg52.h>
#include<intrins.h>
sbit DQ = P3^3;
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
sbit bell = P3^4;
#define uchar unsigned char
#define uint unsigned int
#define nop() _nop_()
uint i;
uchar value;
uchar DS[8];
uchar Time_Data[]={0,1,2,3,4,5,6,7,
8,9,A,B,C,D,E,F};
void delay(uchar t){
while(--t);
}
void Lcd_Com(uchar s){
RS = 0; //低電平,寫指令
P2 = s; //傳數(shù)據(jù)
delay(14); //看時序圖,數(shù)據(jù)需要穩(wěn)定一段時間
E = 1; //給一個高脈沖,發(fā)送命令
delay(14); //如圖,高脈沖延時一段時間,確保命令發(fā)送
E = 0; //發(fā)送結(jié)束E置為低電平
}
void Lcd_Data(uchar s){
RS = 1;
P2 = s;
delay(14);
E = 1;
delay(14);
E = 0;
}
void Init_Lcd(){
RS = 1; //先發(fā)指令,在初始時刻RS是高,E和RW是低
E = 0;
RW = 0;
Lcd_Com(0x38); //設(shè)置為16*2顯示,5*7點陣,8位數(shù)據(jù)接口
Lcd_Com(0x0f); //開顯示,顯示光標(biāo),光標(biāo)閃爍
Lcd_Com(0x06); //讀寫一個字符后地址指針加一
Lcd_Com(0x01);
}
void Display_Lcd(uchar y, uchar x, uchar value){
if(y)
Lcd_Com(0x80+0x40+x); //如果y為1,寫在第二行
else
Lcd_Com(0x80+x);
Lcd_Data(value); //寫到LCD602上

評論


技術(shù)專區(qū)

關(guān)閉