91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 8KB
    文件類型: .c
    金幣: 1
    下載: 0 次
    發布日期: 2021-06-16
  • 語言: 其他
  • 標簽: DS18B20??單片機??

資源簡介

總線形式的訪問多個DS18B20溫度傳感器的程序。程序已經測試過,試過7個DS18B20正常訪問。要連接多個DS18B20要考慮其供電,最好單獨供電。 用的AT89S52的單片機,程序注釋里有硬件連接。

資源截圖

代碼片段和文件信息

//讀者須知:
//若要用這個程序,LCD的D0-D7跟單片機的P2口連。LCD用得是1602,LCD的第4腳與單片機的P3.5腳,LCD的第6腳與單片機的P3.4連
//LCD的第5腳接地。DS18B20的數據線(中間的引腳)接單片機的P1.0。單片機用的是AT89S52.
//這個程序,本人測試過了,測試過單總線上7個DS18B20的連接,并能正確讀到。
//
//序列號只能一位一位讀出來,先寫個程序讀出序列號,然后可以針對某一個DS18B20進行操作
//需要注意的是:若單總線上有多個DS18B20時,讀不到正確的序列號,因為單片機在總線上發出讀序列號的命令后
//每一個DS18B20都會開始上傳自己的序列號,因此讀不到正確的序列號,只能一個一個地讀序列號。

#include
#include
#define?uchar?unsigned?char
#define?uint?unsigned?int
sbit?ds=P1^0; //溫度傳感器DS18B20信號線與P1.0連

uint?temptemp1temp2temp3temp4temp5temp6temp7temp8numnum1;
float?f_temp;
uchar?D1_ROM_ID[8];
uchar?D2_ROM_ID[8];

//通過調用“read_and_display_DS18B20_ROMID()”?在1602液晶里顯示序列號,如何讀到正確的序列號,請
//參考read_and_display_DS18B20_ROMID()的說明,讀出正確的序列號后,把序列號填到下面的數組里面,
//然后通過調用“get_temperature(DD1_ROM_ID)”?得到總線上指定的DS18B20的溫度,而不會讀到其它的DS18B20的溫度。
//需要注意的是:若單總線上有多個DS18B20時,讀不到正確的序列號,因為單片機在總線上發出讀序列號的命令后
//每一個DS18B20都會開始上傳自己的序列號,因此讀不到正確的序列號,只能一個一個地讀序列號。
uchar?code?DD1_ROM_ID[8]={0x280x0b0x0f0x0d0x020x000x000x5b};
uchar?code?DD2_ROM_ID[8]={0x280xc10xdc0x0c0x020x000x000x94};

//液晶1602部分--start
sbit?LCDen=P3^4; //液晶LCD1602的第6腳與P3.4連
sbit?LCDrs=P3^5; ?? //液晶LCD1602的第4腳與P3.5連
unsigned?char?code?table[]=“I?LOVE?MCU!“;
unsigned?char?code?table1[]=“WWW.WZVCST.COM“;
//液晶1602部分--end

//延時xms毫秒
void?delay(uint?xms)
{
uint?ij;?
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}

//R/W-->GNDno?used??液晶的第5腳沒有用到,直接接地。因為往液晶里寫數據就顯示,所以只需要接地。
//不需要從液晶里讀數據,所以這根腳就直接接地。
//往液晶里寫命令:如清屏,設置顯示的位置等。
void?write_com(uchar?com)
{
LCDrs=0;
P2=com;
delay(5);
LCDen=1;
delay(5);
LCDen=0;
}

//往液晶里寫數據:要顯示的數據,通過此程序來寫進液晶里去。
void?write_data(uchar?date)
{
LCDrs=1;
P2=date;
delay(5);
LCDen=1;
delay(5);
LCDen=0;
}

//液晶部分--start:1602的初始化
void?LCD_init()
{
write_com(0x38); //P150?tale7.2.6
write_com(0x0c); //open?display?not?display?cursor
write_com(0x06); //address?point?add?one?after?write?a?char
write_com(0x01); //clear?the?LCD?and?data?point
}
//液晶部分--end:1602的初始化

//DS18B20的相關程序--start
void?dsreset(void) //DS18B20復位,初始化函數
{
uint i;
ds=1;
i++;
ds=0;
i=400;
while(i>0)i--;
ds=1;
// i=4;?
i=8;
while(i>0)i--;
}

bit tempreadbit(void) //讀1位數據函數
{
uint?i;
bit dat;
ds=1;i++;
ds=0;i++;i++;?i++;i++;
ds=1;i++;i++;?
dat=ds;?
i=30;while(i>0)i--;? //i=8;while(i>0)i--; ;若是i=8,只能檢測到5個 ??3
return(dat);
}

uchar tempread(void) //讀1個字節數據函數
{
uchar ijdat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return?dat;
}

void tempwritebyte(uchar?dat) //向DS18B20寫一個字節數據函數
{
uint?i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--; ???
}
else
{
ds=0;
i=8;while(i>0)i--; ??????
ds=1;
i++;i++;
}
}
}

void tempchange(void) //DS18B20開始獲取溫度并轉換
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwri

評論

共有 條評論