

DS18B20是常用的數字溫度傳感器,其輸出的是數字信號,具有體積小,硬體開銷低,抗干擾能力強,精度高的特點,面對著平的那一面,左負右正,一旦接反就會立刻發熱,有可能啥訓!同時,接反也是導致該傳感器總是顯示85℃的原因,實際操作中將正負反接,傳感器立即發熱,液晶屏不能顯示讀數,正負接好后顯示85℃,另外,如果使用51單片機的話,那么中間那個引腳必須接上4.7K-10K的上拉電阻,否則,由于高電平不能正常輸入/輸出,要么通電后立即顯示85℃,要么用幾個月后溫度在85℃與正常值上亂跳,
設計內容:
1.檢測室內溫度,顯示在數碼管上,格式如下圖所示:

2.設定溫度閾值為25℃,超過溫度閾值L1點亮,否則L1熄滅,
對于單總線的操作,相對于IIC,DS1302來說要簡單的多,考試的時候官方是會提供這三個驅動給我們的,不太清楚的同學可以參考藍橋杯大賽——驅動程式,官方給我們提供了這部分程式,對我們的代碼撰寫作業量來說確實減少了很多,但這個驅動并不是可以直接拿來用的,我們還需要再寫一部分程式才能真正利用到這部分代碼,下面咱們就用官方提供的驅動來編程吧,

#include<stc15f2k60s2.h>
#define uchar unsigned char //定義無符號字符型別uchar
#define uint unsigned int //定義無符號整型型別uint
sbit DQ = P1^4; //單總線介面
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6};//數字0~9,“-”,“關”,“C”
uchar yi,er,san,si,wu,liu,qi,ba; //定義字符型變數yi,er,san,si,wu,liu,qi,ba,當作數碼管顯示控制變數
uchar wendu;
void delayms(int ms); //延時函式
void allinit(); //初始化函式
void display1(uchar yi,uchar er); //第一、二段數碼管函式
void display2(uchar san,uchar si); //第三、四段數碼管函式
void display3(uchar wu,uchar liu); //第五、六段數碼管函式
void display4(uchar qi,uchar ba); //第七、八段數碼管函式
//單總線延時函式
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
unsigned char Tempget();
void main()//主函式
{
allinit(); //初始化函式
yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;//讓數碼管全部熄滅
while(1)
{
wendu=Tempget(); //獲取溫度
liu=wendu/10;qi=wendu%10;ba=12; //把獲取到的溫度和識別符號C顯示在第六、七、八位數碼管上
if(wendu>25){P2=0X80;P0=0XFE;} //溫度大于25℃,L1點亮
else {P2=0X80;P0=0XFF;} //否則L1熄滅
display1(yi,er); //第一、二段數碼管函式
display2(san,si); //第三、四段數碼管函式
display3(wu,liu); //第五、六段數碼管函式
display4(qi,ba); //第七、八段數碼管函式
}
}
void delayms(int ms)//延時函式
{
uint i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void allinit()//初始化函式
{
P2=0XA0;P0=0X00; //關閉蜂鳴器繼電器
P2=0X80;P0=0XFF; //關閉所有LED燈
P2=0XC0;P0=0XFF; //選中所有數碼管段選
P2=0XFF;P0=0XFF; //關閉所有數碼管
}
void display1(uchar yi,uchar er)//第一、二段數碼管函式
{
P2=0XC0;P0=0X01; //選中第一個數碼管段選
P2=0XFF;P0=tab[yi]; //讓第一個數碼管顯示yi指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X02; //選中第二個數碼管段選
P2=0XFF;P0=tab[er]; //讓第一個數碼管顯示er指向的值
delayms(1); //延時1ms
}
void display2(uchar san,uchar si)//第三、四段數碼管函式
{
P2=0XC0;P0=0X04; //選中第s三個數碼管段選
P2=0XFF;P0=tab[san]; //讓第一個數碼管顯示san指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X08; //選中第四個數碼管段選
P2=0XFF;P0=tab[si]; //讓第一個數碼管顯示si指向的值
delayms(1); //延時1ms
}
void display3(uchar wu,uchar liu)//第五、六段數碼管函式
{
P2=0XC0;P0=0X10; //選中第五個數碼管段選
P2=0XFF;P0=tab[wu]; //讓第一個數碼管顯示wu指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X20; //選中第六個數碼管段選
P2=0XFF;P0=tab[liu]; //讓第一個數碼管顯示liu指向的值
delayms(1); //延時1ms
}
void display4(uchar qi,uchar ba)//第七、八段數碼管函式
{
P2=0XC0;P0=0X40; //選中第七個數碼管段選
P2=0XFF;P0=tab[qi]; //讓第一個數碼管顯示qi指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X80; //選中第八個數碼管段選
P2=0XFF;P0=tab[ba]; //讓第一個數碼管顯示ba指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X80; //選中第八個數碼管段選
P2=0XFF;P0=0XFF; //讓第八個數碼管熄滅
}
/*********************** DS18B20驅動程式 ************************/
//單總線延時函式
void Delay_OneWire(unsigned int t)
{
while(t--);
}
//通過單總線向DS18B20寫一個位元組
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(50);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//從DS18B20讀取一個位元組
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(50);
}
return dat;
}
//DS18B20設備初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(120);
DQ = 0;
Delay_OneWire(800);
DQ = 1;
Delay_OneWire(100);
initflag = DQ;
Delay_OneWire(50);
return initflag;
}
//DS18B20溫度獲取
unsigned char Tempget() //溫度的讀取,可參照DS18B20芯片手冊
{
unsigned char temp,low,high; //定義無符號字符型變數temp,low,high;
init_ds18b20(); //DS18B20設備初始化
Write_DS18B20(0xcc); //通過單總線向DS18B20寫0xcc:這條命令允許總線控制器不用提供64位ROM編碼就使用存盤器操作命令,在單總線情況下右以節省時間,
Write_DS18B20(0x44); //這條命令啟動一次溫度轉換而無需其他資料,
Delay_OneWire(200); //延時
init_ds18b20(); //DS18B20設備初始化
Write_DS18B20(0xcc); //通過單總線向DS18B20寫0xcc:這條命令允許總線控制器不用提供64位ROM編碼就使用存盤器操作命令,在單總線情況下右以節省時間,
Write_DS18B20(0xbe); //這個命令讀取暫存器的內容,
low=Read_DS18B20(); // 因為溫度傳感器是16位所以依次讀取低八位和高八位
high=Read_DS18B20(); // 因為溫度傳感器是16位所以依次讀取低八位和高八位
temp=high<<4; //高四位是符號位不要
temp|=(low>>4); //低四位是小數位不要,讓去除符號的高四位或上去除小數的低四位,即溫度的值
return temp; //回傳temp
}
![]()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278468.html
標籤:其他
