導航:首頁 > 操作系統 > 51單片機ds18b20程序

51單片機ds18b20程序

發布時間:2022-07-04 09:46:34

㈠ 求用51單片機與DS18B20測溫的C程序。完整的。

/*************** writer:shopping.w ******************/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
sbit DQ = P3^3;
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
uchar code Temp_Disp_Title[]={"Current Temp : "};
uchar Current_Temp_Display_Buffer[]={" TEMP: "};
uchar code Temperature_Char[8] =
{
0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00
};
uchar code df_Table[]=
{
0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
};
uchar CurrentT = 0;
uchar Temp_Value[]={0x00,0x00};
uchar Display_Digit[]={0,0,0,0};
bit DS18B20_IS_OK = 1;
void DelayXus(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<200;i++);
}
}
bit LCD_Busy_Check()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN=0;
return result;
}
void Write_LCD_Command(uchar cmd)
{
while(LCD_Busy_Check());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void Write_LCD_Data(uchar dat)
{
while(LCD_Busy_Check());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void LCD_Initialise()
{
Write_LCD_Command(0x01);
DelayXus(5);
Write_LCD_Command(0x38);
DelayXus(5);
Write_LCD_Command(0x0c);
DelayXus(5);
Write_LCD_Command(0x06);
DelayXus(5);
}
void Set_LCD_POS(uchar pos)
{
Write_LCD_Command(pos|0x80);
}
void Delay(uint x)
{
while(--x);
}
uchar Init_DS18B20()
{
uchar status;
DQ = 1;
Delay(8);
DQ = 0;
Delay(90);
DQ = 1;
Delay(8);
DQ = 1;
return status;
}
uchar ReadOneByte()
{
uchar i,dat=0;
DQ = 1;
_nop_();
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
_nop_();
_nop_();
if(DQ)
dat |= 0X80;
Delay(30);
DQ = 1;
}
return dat;
}
void WriteOneByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat& 0x01;
Delay(5);
DQ = 1;
dat >>= 1;
}
}
void Read_Temperature()
{
if(Init_DS18B20()==1)
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xcc);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xcc);
WriteOneByte(0xbe);
Temp_Value[0] = ReadOneByte();
Temp_Value[1] = ReadOneByte();
DS18B20_IS_OK=1;
}
}
void Display_Temperature()
{
uchar i;
uchar t = 150, ng = 0;
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1] = ~Temp_Value[1];
Temp_Value[0] = ~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng = 1;
}
Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];
CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);
Display_Digit[3] = CurrentT/100;
Display_Digit[2] = CurrentT%100/10;
Display_Digit[1] = CurrentT%10;
Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';
Current_Temp_Display_Buffer[10] = '.';
Current_Temp_Display_Buffer[9] = Display_Digit[1] + '0';
Current_Temp_Display_Buffer[8] = Display_Digit[2] + '0';
Current_Temp_Display_Buffer[7] = Display_Digit[3] + '0';
if(Display_Digit[3] == 0)
Current_Temp_Display_Buffer[7] = ' ';
if(Display_Digit[2] == 0&&Display_Digit[3]==0)
Current_Temp_Display_Buffer[8] = ' ';
if(ng)
{
if(Current_Temp_Display_Buffer[8] == ' ')
Current_Temp_Display_Buffer[8] = '-';
else if(Current_Temp_Display_Buffer[7] == ' ')
Current_Temp_Display_Buffer[7] = '-';
else
Current_Temp_Display_Buffer[6] = '-';
}
Set_LCD_POS(0x00);
for(i=0;i<16;i++)
{
Write_LCD_Data(Temp_Disp_Title[i]);
}
Set_LCD_POS(0x40);
for(i=0;i<16;i++)
{
Write_LCD_Data(Current_Temp_Display_Buffer[i]);
}
Set_LCD_POS(0x4d);
Write_LCD_Data(0x00);
Set_LCD_POS(0x4e);
Write_LCD_Data('C');
}
void main()
{
LCD_Initialise();
Read_Temperature();
Delay(50000);
Delay(50000);
while(1)
{
Read_Temperature();
if(DS18B20_IS_OK)
Display_Temperature();
DelayXus(100);
}
}

以上程序來自《單片機C語言程序設計實訓100例基於8051+Proteus模擬》

㈡ 51單片機兩個I/O口分別接ds18b20程序

//DS從機程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define SLAVE 0x01
#define BN 6
sbit LCD_RS = P2^5; /*定義LCD控制埠*/
sbit LCD_RW = P2^6;
sbit LCD_EN = P2^7;

sbit DS1=P1^0;
sbit DS2=P1^1;
sbit key3=P3^5;
sbit tem=P3^3;
sbit win=P3^4;
sbit key1=P3^6;
sbit key2=P3^7;
uint temp1,temp2,tempH,tempL; // variable of temperature
uchar flag1,aa,we;
uchar A1,A2,A3,A4,B1,B2,B3,B4; // sign of the result positive or negative
uchar dis1[16]={76,45,84,'0','0','.','0',32,32,72,45,84,'0','0','.','0'};
uchar dis2[16]={48,49,32,'0','0','.','0',32,32,48,50,32,'0','0','.','0'};
uchar code tab[] = {'0','1','2','3','4','5','6','7','8','9'};
uchar trbuf[6];
bit tready;
bit rready;
void str(void);
void sre(void);

void delay(int ms)
{
int i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

/*******************************************************************/
/* */
/*檢查LCD忙狀態 */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。 */
/* */
/*******************************************************************/

bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0&0x80);
LCD_EN = 0;
return result;
}

/*******************************************************************/
/* */
/*寫指令數據到LCD */
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
/* */
/*******************************************************************/

void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}

/*******************************************************************/
/* */
/*寫顯示數據到LCD */
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */
/* */
/*******************************************************************/

void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}

/*******************************************************************/
/* */
/* 設定顯示位置 */
/* */
/*******************************************************************/

void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80); //數據指針=80+地址變數
}

/*******************************************************************/
/* */
/* LCD初始化設定 */
/* */
/*******************************************************************/

void lcd_init()
{
lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數據
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);

lcd_wcmd(0x0c); //顯示開,關游標
delay(5);
lcd_wcmd(0x06); //移動游標
delay(5);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(5);
lcd_wcmd(0x06); //向右移動游標
delay(5);
}

/*******************************************************************/
/* */
/* 閃動子程序 */
/* */
/*******************************************************************/

void flash()
{
delay(600); //控制停留時間
lcd_wcmd(0x08); //關閉顯示
delay(200); //延時
lcd_wcmd(0x0c); //開顯示
delay(200); //延時
lcd_wcmd(0x08); //關閉顯示
delay(200); //延時
lcd_wcmd(0x0c); //開顯示
delay(200);
}

/*void delay(uint count) //delay
{
uint i;
while(count)
{
i=100;
while(i>0)
i--;
count--;
}
} */
///////功能:串口初始化,波特率9600,方式1///////
void Init(void)
{
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
PCON=0x00;
TR1=1;
SCON=0xf0;
ES=1;
EA=1;
}

void dsreset(uchar DS) //send reset and initialization command 18B20復位,初始化函數
{
uint i;
if(DS==1)
{
DS1=0;
i=103;
while(i>0)i--;
DS1=1;
i=4;
while(i>0)i--;
}
if(DS==2)
{
DS2=0;
i=103;
while(i>0)i--;
DS2=1;
i=4;
while(i>0)i--;
}
}

bit tmpreadbit(uchar DS) //read a bit 讀DS2 1位數據函數
{
uint i;
bit dat;
if(DS==1)
{
DS1=0;i++; //i++ for delay
DS1=1;i++;i++;
dat=DS1;
i=8;while(i>0)i--;
}
if(DS==2)
{
DS2=0;i++; //i++ for delay
DS2=1;i++;i++;
dat=DS2;
i=8;while(i>0)i--;
}
return (dat);
}

uchar tmpread(uchar DS) //read a byte date 讀1位元組函數
{
uchar i,j,dat;
dat=0;
if(DS==1)
{
for(i=1;i<=8;i++)
{
j=tmpreadbit(1);
dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里
}
}
if(DS==2)
{
for(i=1;i<=8;i++)
{
j=tmpreadbit(2);
dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里
}
}
return(dat);
}

void tmpwritebyte(uchar dat,uchar DS) //write a byte to ds18b20 向1820寫一個位元組數據函數
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(DS==1)
{
if(testb) //write 1
{
DS1=0;
i++;i++;
DS1=1;
i=8;while(i>0)i--;
}
else
{
DS1=0; //write 0
i=8;while(i>0)i--;
DS1=1;
i++;i++;
}
}
if(DS==2)
{
if(testb) //write 1
{
DS2=0;
i++;i++;
DS2=1;
i=8;while(i>0)i--;
}
else
{
DS2=0; //write 0
i=8;while(i>0)i--;
DS2=1;
i++;i++;
}
}
}
}

void tmpchange(uchar DS) //DS18B20 begin change 開始獲取數據並轉換
{
if(DS==1)
{
dsreset(1);
delay(1);
tmpwritebyte(0xcc,1); // address all drivers on bus 寫跳過讀ROM指令
tmpwritebyte(0x44,1);
} // initiates a single temperature conversion 寫溫度轉換指令
if(DS==2)
{
dsreset(2);
delay(1);
tmpwritebyte(0xcc,2); // address all drivers on bus 寫跳過讀ROM指令
tmpwritebyte(0x44,2);
} // initiates a single temperature conversion 寫溫度轉換指令
}

uint tmp1(void) //get the temperature 讀取寄存器中存儲的溫度數據
{
float tt;
uchar a,b;
dsreset(1);
delay(1);
tmpwritebyte(0xcc,1);
tmpwritebyte(0xbe,1);
a=tmpread(1); //讀低8位
b=tmpread(1); //讀高8位
temp1=b;
temp1<<=8; //two byte compose a int variable 兩個位元組組合為1個字
temp1=temp1|a;
tt=temp1*0.0625; //溫度在寄存器中是12位,解析度是0.0625
temp1=tt*10+0.5; //乘10表示小數點後只取1位,加0.5是四折五入
//temp1=temp1+5; //誤差補償
return temp1;
}
uint tmp2( void) //get the temperature 讀取寄存器中存儲的溫度數據
{
float tt;
uchar a,b;
dsreset(2);
delay(1);
tmpwritebyte(0xcc,2);
tmpwritebyte(0xbe,2);
a=tmpread(2); //讀低8位
b=tmpread(2); //讀高8位
temp2=b;
temp2<<=8; //two byte compose a int variable 兩個位元組組合為1個字
temp2=temp2|a;
tt=temp2*0.0625; //溫度在寄存器中是12位,解析度是0.0625
temp2=tt*10+0.5; //乘10表示小數點後只取1位,加0.5是四折五入
//temp2=temp2+5; //誤差補償
return temp2;
}
void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}

uchar display(uint temp1,uint temp2) //顯示程序
{
uchar i;
A1=temp1/100;
A2=temp1%100/10;
A3=temp1%100%10;

B1=temp2/100;
B2=temp2%100/10;
B3=temp2%100%10;

trbuf[0]=A1;
trbuf[1]=A2;
trbuf[2]=A3;
trbuf[3]=B1;
trbuf[4]=B2;
trbuf[5]=B3;

dis1[3]=tab[tempL*10/100];
dis1[4]=tab[tempL*10%100/10];
dis1[6]=tab[tempL*10%100%10];

dis1[12]=tab[tempH*10/100];
dis1[13]=tab[tempH*10%100/10];
dis1[15]=tab[tempH*10%100%10];
dis2[3]=tab[A1];
dis2[4]=tab[A2];
dis2[6]=tab[A3];

dis2[12]=tab[B1];
dis2[13]=tab[B2];
dis2[15]=tab[B3];

delay(1);
lcd_pos(0); //設置顯示位置為第一行的第1個字元
delay(2);
for(i=0;i<16;i++)
{
lcd_wdat(dis1[i]);
}
delay(2);
lcd_pos(0x40);
delay(2);
for(i=0;i<16;i++)
{
lcd_wdat(dis2[i]);
}

return (A1,A2,A3,B1,B2,B3);
}
void TemC()
{
if(temp1<=(tempL*10)||temp2<=(tempL*10)) tem=0;
else tem=1;
if (temp1>=(tempH*10)||temp2>=(tempH*10)) win=0;
else win=1;
}

uchar chan()
{
if(key1==0)
{
tempL++;
while(key1==0);
if(tempL>35)
tempL=0;
}

if(key2==0)
{
tempH++;
while(key2==0);
if(tempH>35)
tempH=0;
}
return (tempH,tempL);
}

/******************************************************************************/

void main()
{ //uchar a;

//uchar i;
delay(10);
lcd_init();
Init();
tempH=35;
tempL=15;
while(1)
{
tmpchange(1);
tmpchange(2);
tmp1();
tmp2();
chan();
TemC();
display(temp1,temp2);

tready=1;
rready=1;
}
}
void ssio(void)interrupt 4
{
uchar a;
RI=0;
ES=0;
if(SBUF!=SLAVE)
{
ES=1;
goto reti;
}
SM2=0;
SBUF=SLAVE;
while(TI!=1);
TI=0;
while(RI!=1);
RI=0;

if(RB8==1)
{
SM2=1;
ES=1;
goto reti;
}
a=SBUF;
if(a==0x02)
{
if(tready==1)
SBUF=0x02;
else
SBUF=0x00;
while(TI!=1);
TI=0;

str();
goto reti;
}
else
{
SBUF=0x08;
while(TI!=1);
TI=0;
SM2=1;
ES=1;
}
reti:RI=0;
SM2=1;
ES=1;

}
void str(void)
{
uchar i;
tready=0;
while(1)
{

tmpchange(1);
tmpchange(2);
tmp1();
tmp2();
chan();
TemC();
display(temp1,temp2);
for(i=0;i<BN;i++)
{
SBUF=trbuf[i];
while(TI!=1);
TI=0;
}
while(RI!=1);
RI=0;
if(RB8==1)goto loop;
}
loop:SM2=1;
ES=1;
}

㈢ 真的很急!基於51單片機的DS18B20 溫度測控系統 C語言程序

#include<reg52.h> #include<math.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int;
/******************************************************************/
/* 定義埠 */
/******************************************************************/
sbit seg1=P2^0;
sbit seg2=P2^1;
sbit seg3=P2^2;
sbit DQ=P1^7;//ds18b20 埠
sfr dataled=0x80;//顯示數據埠
/******************************************************************/
/* 全局變數 */
/******************************************************************/
uint temp;
uchar flag_get,count,num,minute,second;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//7段數碼管段碼表共陽
uchar str[6];
/******************************************************************/
/* 函數聲明 */
/******************************************************************/
void delay1(uchar MS);
unsigned int ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);
/******************************************************************/
/* 主函數 */
/******************************************************************/
main()
{
unsigned char TempH,TempL;
TMOD|=0x01;//定時器設置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
P2=0x00;
count=0;
while(1)
{
str[5]=0x39; //顯示C符號
str[1]=tab[TempH/100]; //十位溫度
str[2]=tab[(TempH%100)/10]; //十位溫度
str[3]=tab[(TempH%100)%10]|0x80; //個位溫度,帶小數點
str[4]=tab[TempL];
if(flag_get==1) //定時讀取當前溫度
{
temp=ReadTemperature();
if(temp&0x8000)
{
str[0]=0x40;//負號標志
temp=~temp; // 取反加1
temp +=1;
}
else
str[0]=0;
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL*6/10;//小數近似處理
flag_get=0;
}
}
}

/******************************************************************/
/* 定時器中斷 */
/******************************************************************/
void tim(void) interrupt 1 using 1//中斷,用於數碼管掃描和溫度檢測間隔
{
TH0=0xef;//定時器重裝值
TL0=0xf0;
num++;
if (num==50)
{num=0;
flag_get=1;//標志位有效
second++;
if(second>=60)
{second=0;
minute++;
}
}
count++;
if(count==1)
{P2=0;
dataled=str[0];}//數碼管掃描
if(count==2)
{P2=1;
dataled=str[1];}
if(count==3)
{ P2=2;
dataled=str[2];
}
if(count==4)
{ P2=3;
dataled=str[3];
}
if(count==5)
{ P2=4;
dataled=str[4];
}
if(count==6)
{ P2=5;
dataled=str[5];
count=0;}
}
/******************************************************************/
/* 延時函數 */
/******************************************************************/
void delay(unsigned int i)//延時函數
{
while(i--);
}
/******************************************************************/
/* 初始化 */
/******************************************************************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復位
delay(8); //稍做延時
DQ = 0; //單片機將DQ拉低
delay(80); //精確延時 大於 480us
DQ = 1; //拉高匯流排
delay(10);
x=DQ; //稍做延時後 如果x=0則初始化成功 x=1則初始化失敗
delay(5);
}
/******************************************************************/
/* 讀一個位元組 */
/******************************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
/******************************************************************/
/* 寫一個位元組 */
/******************************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(5);
}
/******************************************************************/
/* 讀取溫度 */
/******************************************************************/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
//LZ,這是測溫並且用數碼管顯示程序,報警可以自己另行添加!主要程序就是這些!
()

㈣ 51單片機與DS18B20程序

#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit DQ = P2^2; //數據口define interface
sbit la = P2^6; //數碼管段選
sbit wela = P2^7; //數碼管位選

uint temp; //溫度值 variable of temperature

//不帶小數點
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//帶小數點
unsigned char code table1[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

/*************精確延時函數*****************/
void delay(unsigned char i)
{
while(--i);
}
/******************************************
此延時函數針對的是12Mhz的晶振
delay(0):延時518us 誤差:518-2*256=6
delay(1):延時7us (原帖寫"5us"是錯的)
delay(10):延時25us 誤差:25-20=5
delay(20):延時45us 誤差:45-40=5
delay(100):延時205us 誤差:205-200=5
delay(200):延時405us 誤差:405-400=5
*******************************************/

/*****************DS18B20******************/

void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command
{
DQ = 1; //DQ復位,不要也可行。
delay(1); //稍做延時
DQ = 0; //單片機拉低匯流排
delay(250); //精確延時,維持至少480us
DQ = 1; //釋放匯流排,即拉高了匯流排
delay(100); //此處延時有足夠,確保能讓DS18B20發出存在脈沖。
}

uchar Read_One_Byte() //讀取一個位元組的數據read a byte date
//讀數據時,數據以位元組的最低有效位先從匯流排移出
{
uchar i = 0;
uchar dat = 0;
for(i=8;i>0;i--)
{
DQ = 0; //將匯流排拉低,要在1us之後釋放匯流排
//單片機要在此下降沿後的15us內讀數據才會有效。
_nop_(); //至少維持了1us,表示讀時序開始
dat >>= 1; //讓從匯流排上讀到的位數據,依次從高位移動到低位。
DQ = 1; //釋放匯流排,此後DS18B20會控制匯流排,把數據傳輸到匯流排上
delay(1); //延時7us,此處參照推薦的讀時序圖,盡量把控制器采樣時間放到讀時序後的15us內的最後部分
if(DQ) //控制器進行采樣
{
dat |= 0x80; //若匯流排為1,即DQ為1,那就把dat的最高位置1;若為0,則不進行處理,保持為0
}
delay(10); //此延時不能少,確保讀時序的長度60us。
}
return (dat);
}

void Write_One_Byte(uchar dat)
{
uchar i = 0;
for(i=8;i>0;i--)
{
DQ = 0; //拉低匯流排
_nop_(); //至少維持了1us,表示寫時序(包括寫0時序或寫1時序)開始
DQ = dat&0x01; //從位元組的最低位開始傳輸
//指令dat的最低位賦予給匯流排,必須在拉低匯流排後的15us內,
//因為15us後DS18B20會對匯流排采樣。
delay(10); //必須讓寫時序持續至少60us
DQ = 1; //寫完後,必須釋放匯流排,
dat >>= 1;
delay(1);
}
}

uint Get_Tmp() //獲取溫度get the temperature
{
float tt;
uchar a,b;
Init_Ds18b20(); //初始化
Write_One_Byte(0xcc); //忽略ROM指令
Write_One_Byte(0x44); //溫度轉換指令
Init_Ds18b20(); //初始化
Write_One_Byte(0xcc); //忽略ROM指令
Write_One_Byte(0xbe); //讀暫存器指令
a = Read_One_Byte(); //讀取到的第一個位元組為溫度LSB
b = Read_One_Byte(); //讀取到的第一個位元組為溫度MSB
temp = b; //先把高八位有效數據賦於temp
temp <<= 8; //把以上8位數據從temp低八位移到高八位
temp = temp|a; //兩位元組合成一個整型變數
tt = temp*0.0625; //得到真實十進制溫度值
//因為DS18B20可以精確到0.0625度
//所以讀回數據的最低位代表的是0.0625度
temp = tt*10+0.5; //放大十倍
//這樣做的目的將小數點後第一位也轉換為可顯示數字
//同時進行一個四捨五入操作。
return temp;
}

/****************數碼碼動態顯示函數**************/

void Display(uint temp) //顯示程序
{
uchar A1,A2,A3;
A1 = temp/100; //百位
A2 = temp%100/10; //十位
A3 = temp%10; //個位

la = 0;
P0 = table[A1]; //顯示百位
la = 1; //打開段選,對應74573的鎖存位,高電平不鎖存
la = 0;

wela = 0;
P0 = 0x7e;
wela = 1; //打開位選
wela = 0;
delay(0);

la = 0;
P0 = table1[A2]; //顯示十位,使用的是有小數點的數組(因為temp值擴大了10倍,雖然是十位,實際為個位)
la = 1;
la = 0;

wela = 0;
P0 = 0x7d;
wela = 1;
wela = 0;
delay(0);

P0 = table[A3]; //顯示個位
la = 1;
la = 0;

P0 = 0x7b;
wela = 1;
wela = 0;
delay(0);
}

void main()
{
while(1)
{
Display(Get_Tmp());
}
}

㈤ 單片機51用DS18B20採集溫度的程序和圖

#include <intrins.h>
#include "delay.h"

sbit DS18B20 = P0^4;
bit isExternPower;

bit Init_DS18B20(void)
{
bit RstFlag;
bit EA_Save = EA;
RstFlag = 0;
DS18B20 = 0;
delay_us(500); //拉低匯流排至少480us完成復位
EA = 0;
DS18B20=1;
delay_us(60); //釋放匯流排15us-60us後讀取應答電平
if (DS18B20==0) RstFlag = 1;
EA = EA_Save;
delay_us(440);
return RstFlag;
}

void Write_DS18B20(unsigned char dat)
{
unsigned char i;
bit EA_Save = EA;
DS18B20=1;
delay_us(1);
for (i=8; i>0; i--)
{
EA = 0;
DS18B20 = 0; //拉低匯流排啟動操作
delay_us(10); //匯流排拉低後15us內置數據電平
DS18B20 = dat&0x01;
delay_us(50); //匯流排拉低後60us內釋放匯流排
DS18B20 = 1;
EA = EA_Save;
dat>>=1;
delay_us(3); //寫時隙間隔>1us
}
}

unsigned char Read_DS18B20(void)
{
unsigned char i=0;
unsigned char dat = 0;
bit EA_Save = EA;
DS18B20=1;
delay_us(1);
for (i=8; i>0; i--)
{
EA = 0;
DS18B20 = 0; //拉低匯流排啟動操作
delay_us(5);
DS18B20 = 1; //拉低匯流排至少1us後釋放匯流排
delay_us(5); //等待匯流排穩定
dat >>= 1;
if(DS18B20)
{
dat+=0x80; //在拉低匯流排的15us內讀匯流排電平
}
EA = EA_Save;
delay_us(50); //總的讀時隙要在60us以上
}
return(dat);
}

float get_temperature()
{
unsigned char a=0;
unsigned char b=0;
int temperature;
float temp = 0.1;
if(Init_DS18B20())
{
Write_DS18B20(0xcc); //跳過ROM
Write_DS18B20(0xbe); //讀溫度寄存器
a=Read_DS18B20(); //讀低8位
b=Read_DS18B20(); //讀高8位
temperature = b<<8;
temperature |= a;
temp = temperature * 0.0625;
}
if(Init_DS18B20())
{
Write_DS18B20(0xcc); //跳過ROM
Write_DS18B20(0x44); //啟動轉換
}
return temp;
}

㈥ 51單片機溫度感測器ds18b20、lcd1602液晶C程序

/*
必要操作:連接感測器DS18B20到U6
*/
#pragma db code
#include<AT89X52.H>
#include "INTRINS.H"
#define BUSY1 (DQ1==0) //定義busy信號
sbit LED_0=P1^0; //定義數碼管控制腳為P1口的0-3腳
sbit LED_1=P1^1;
sbit LED_2=P1^2;
sbit LED_3=P1^3;
sbit DQ1=P3^5; //定義18B20單匯流排引腳

void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4);//聲明顯示函數
void ds_reset_1(void); //聲明18B20復位函數
void wr_ds18_1(char dat); //聲明18B20寫入函數
void time_delay(unsigned char time);//聲明延時函數
int get_temp_1(void); //聲明18B20讀入溫度函數
void delay(unsigned int x); //聲明延時函數
void read_ROM(void); //聲明18B20讀ROM函數
int get_temp_d(void); //聲明獲取溫度函數
void ds_init(void); //聲明18B20初始化函數
void ds_getT(void); //聲明18B20獲得溫度顯示值函數
/*定義數碼管段碼=====0-9=====A-G=====*/
unsigned char a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//共陽極數碼管的段碼0 1 2 3 4 5 6 7 8 9 A B C D E F
/****************以下定義各種變數********************/
unsigned char ResultSignal;
int ResultTemperatureLH,ResultTemperatureLL,ResultTemperatureH;
unsigned char ROM[8];
unsigned char idata TMP;
unsigned char idata TMP_d;
unsigned char f;
unsigned char rd_ds18_1();
unsigned int TemH,TemL; //溫度的整數部分和小數部分
unsigned int count; //定義小數計算部分
void main()
{

ds_init(); //18B20初始化
while(1)
{
ds_getT(); //使用該函數獲得溫度,整數部分存儲到TemH,小數部分存儲到count的低8位
display((TemH/10)%10,TemH%10,((count/10)%10),(count%10));
//溫度發送到數碼管顯示
}
}
/***************18B20初始化函數***********************/
void ds_init(void)
{
unsigned int k=0;
ds_reset_1();
ds_reset_1(); //reset
wr_ds18_1(0xcc); //skip rom
_nop_();
wr_ds18_1(0x7f);
ds_reset_1();
wr_ds18_1(0xcc);
_nop_();
wr_ds18_1(0x44);
for(k=0;k<11000;k++)
time_delay(255);
ds_reset_1();
}
void ds_getT(void)
{
wr_ds18_1(0xcc);
wr_ds18_1(0xbe);
TemH=get_temp_1();
TemL=get_temp_d();
TemH&=0x00ff;
TemL&=0x00ff;
count=(TemH*256+TemL)*6.25;
}
/***************延時程序,單位us,大於10us*************/
void time_delay(unsigned char time)
{

time=time-10;
time=time/6;
while(time!=0)time--;
}

/*****************************************************/
/* reset ds18b20 */
/*****************************************************/
void ds_reset_1(void)
{
unsigned char idata count=0;
DQ1=0;
time_delay(240);
time_delay(240);
DQ1=1;
return;
}

void check_pre_1(void)
{
while(DQ1);
while(~DQ1);

time_delay(30);
}

void read_ROM(void)
{
int n;
ds_reset_1();
check_pre_1();
wr_ds18_1(0x33);
for(n=0;n<8;n++){ROM[n]=rd_ds18_1();}
}

/*****************************************************/
/* Read a bit from 1820 位讀取 */
/*****************************************************/
bit tmrbit_1(void)
{
idata char i=0;
bit dat;

DQ1=0;_nop_();

DQ1=1;

_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();

dat = DQ1;

time_delay(50);

return dat;
}

/*****************************************************/
/* read a bety from ds18b20 位元組讀取 */
/*****************************************************/
unsigned char rd_ds18_1()
{
unsigned char idata i,j,dat=0;
for(i=1;i<=8;i++)
{
j=tmrbit_1();
dat=(j<<(i-1))|dat;
}
return dat;
}

/*****************************************************/
/* write a bety from ds18b20 寫位元組 */
/****************************************************/
void wr_ds18_1(char dat)
{
signed char idata i=0;
unsigned char idata j;
bit testb;

for(j=1;j<=8;j++)
{
testb=dat & 0x01;
dat = dat>>1;
if(testb)
{
DQ1=0;
_nop_();
_nop_();
DQ1=1;
time_delay(60);
}

else
{
DQ1=0;
time_delay(50);

DQ1=1;
_nop_();
_nop_();
}
}
}

int get_temp_1(void)
{
unsigned char idata a=0,b=0;
unsigned char idata i;
EA=0;

ds_reset_1();
check_pre_1();

wr_ds18_1(0xcc);
wr_ds18_1(0x44);
while(BUSY1);

ds_reset_1();
check_pre_1();
wr_ds18_1(0xcc);
wr_ds18_1(0xbe);

a=rd_ds18_1();
b=rd_ds18_1();

i=b; /*若b為1則為負溫 */
i=(i>>4);
if(i==0)
{
f=0;
TMP=((a>>4)|(b<<4));
a=(a&0x0f);
if (a>8)
{
TMP=(TMP+1);
}
}
else
{
f=1;
a=a>>4;
b=b<<4;

TMP=(a|b);

TMP=~TMP;
TMP=(TMP+1);
}
EA=1;
return(TMP);
}

int get_temp_d(void)
{
unsigned char idata a=0,b=0;
unsigned char idata i,m;
EA=0;

ds_reset_1();//復位
check_pre_1();

wr_ds18_1(0xcc);
wr_ds18_1(0x44);
while(BUSY1);

ds_reset_1();
check_pre_1();
wr_ds18_1(0xcc);
wr_ds18_1(0xbe);

a=rd_ds18_1();
b=rd_ds18_1();

i=b; /*若b為1則為負溫 */
i=(i>>4);

if(i==0)
{
f=0;
TMP=((a>>4)|(b<<4));
a=(a&0x0f);
TMP_d=a;
}
else
{
f=1;
a=~a;
a=(a+1);
b=~b;
b=(b+1);

m=a;
a=a>>4;
b=b<<4;

TMP=(a|b);
m=(m&0x0f);
TMP_d=m;
}

EA=1;
return(TMP_d);
}void delay(unsigned int x)
{
unsigned int i;
for(i=0;i<x;i++);
}
void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4)
{
P0=a[d1];
LED_0=0;
delay(100);
LED_0=1;

P0=a[d2] & 0x7f;
LED_1=0;
delay(100);
LED_1=1;

P0=a[d3];
LED_2=0;
delay(100);
LED_2=1;

P0=a[d4];
LED_3=0;
delay(100);
LED_3=1;
}

㈦ 51單片機,LCD1602顯示單線接三個DS18B20的C語言編程

給你四個DS1B820的程序(單匯流排實現的)。LCD1602顯示,但是沒有報警哦。
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit RS=P3^5; //定義LCD埠
sbit RW=P3^6;
sbit E=P3^7;
sbit DQ=P3^4; //定義單匯流排埠
uchar LCD_3,LCD_2,LCD_1,LCD_0;
uchar ds18b20_romA[8]={0x8e,0x00,0x00,0x00,0xb8,0xc5,0x30,0x28};
//四個DS18B20的64位ROM地址
uchar ds18b20_romB[8]={0x52,0x00,0x00,0x00,0xb8,0xc5,0x34,0x28};
uchar ds18b20_romC[8]={0x65,0x00,0x00,0x00,0xb8,0xc5,0x35,0x28};
uchar ds18b20_romD[8]={0x3c,0x00,0x00,0x00,0xb8,0xc5,0x37,0x28};
uchar code LCDData[] ="0123456789";
//************************************
//延時程序
//************************************
void delay(unsigned int N)
{
unsigned int i;
for(i=0;i<N;i++);
}

//************************************
//LCD1602測忙
//************************************
void check_busy(void)
{
while(1)
{
P1=0xff;
E=0;
_nop_();
RS=0;
_nop_();
_nop_();
RW=1;
_nop_();
_nop_();
E=1;
_nop_();
_nop_();

_nop_();
_nop_();
if((P1&0x80)==0)
{
break;
}
E=0;
}
}
//************************************
//LCD1602寫命令
//************************************
void write_command(uchar tempdata)
{
E=0;
_nop_();
_nop_();
RS=0;
_nop_();
_nop_();
RW=0;
P1=tempdata;
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
E=0;
_nop_();
check_busy();
}
//************************************
//LCD1602寫數據
//************************************
void write_data(uchar tempdata)
{
E=0;
_nop_();
_nop_();
RS=1;
_nop_();
_nop_();
RW=0;
P1=tempdata;
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
E=0;
_nop_();
check_busy();
}
//************************************
//初始化LCD1602
//************************************
void init_lcd1602()
{
write_command(0x01); //清除屏幕
write_command(0x38); //功能設定(8位,2行,5*7點陣式)
write_command(0x0c); //顯示器ON,游標OFF,閃爍OFF
write_command(0x06);//地址加1
}
//************************************
//初始化ds18b20
//************************************
bit resetpulse(void)
{
DQ=0;
delay(40); //延時500us
DQ=1;
delay(4); //延時60us
return(DQ); //讀取P1.0的狀態
}
void ds18b20_init(void)
{
while(1)
{
if(!resetpulse()) //收到ds18b20的應答信號
{
DQ=1;
delay(40); //延時240us
break;
}
else
resetpulse(); //否則再發復位信號
}
}
//************************************
//讀ds18b20一位
//************************************
uchar read_bit(void)
{
DQ=0;
_nop_();
_nop_();
DQ=1;
delay(2);
return(DQ);
}
//************************************
//讀ds18b20一個位元組
//************************************
uchar read_byte(void)
{
uchar i,m,receive_data;
m=1;
receive_data=0;
for(i=0;i<8;i++)
{
if(read_bit())
{
receive_data=receive_data+(m<<i);
}
delay(7);
}
return(receive_data);
}
//************************************
//向ds18b20寫一位
//************************************
void write_bit(uchar bitval)
{
DQ=0;
if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}
//************************************
//向DS18B20寫一個位元組命令
//************************************
void write_byte(uchar val)
{
uchar i,temp;
for(i=0;i<8;i++)
{
temp=val>>i;
temp=temp&0x01;
write_bit(temp);
delay(5);
}
}
//*************************************
//64位的ROM序列號匹配
//*************************************
bit match_rom(uchar *rom)
{
uchar i;
ds18b20_init();
write_byte(0x55);
for(i=8;i>0;i--)
{
write_byte(*(rom+i-1));
}
return 1;
}

void main(void)
{
uchar temp_data_l,temp_data_h;
init_lcd1602();
while(1)
{
ds18b20_init();
write_byte(0xcc);
write_byte(0x44); //啟動溫度轉換
delay(700);
match_rom(ds18b20_romA); //匹配第一路
write_byte(0xbe); //讀溫度
temp_data_l= read_byte(); //溫度低8位
temp_data_h = read_byte(); //溫度高8位
convert_T(temp_data_h,temp_data_l);
first_line[2]=LCD_3; //溫度轉換後的各位
first_line[3]=LCD_2; //分別存入顯示緩存數組中
first_line[4]=LCD_1;
first_line[6]=LCD_0;
match_rom(ds18b20_romB); //匹配第二路
write_byte(0xbe); //讀溫度
temp_data_l= read_byte(); //溫度低8位
temp_data_h = read_byte(); //溫度高8位
convert_T(temp_data_h,temp_data_l);
first_line[10]=LCD_3; //溫度轉換後的各位
first_line[11]=LCD_2; //分別存入顯示緩存數組中
first_line[12]=LCD_1;
first_line[14]=LCD_0;
display();
match_rom(ds18b20_romC); //匹配第三路
write_byte(0xbe); //讀溫度
temp_data_l= read_byte(); //溫度低8位
temp_data_h = read_byte(); //溫度高8位
convert_T(temp_data_h,temp_data_l);
second_line[2]=LCD_3; //溫度轉換後的各位
second_line[3]=LCD_2; //分別存入顯示緩存數組中
second_line[4]=LCD_1;
second_line[6]=LCD_0;
match_rom(ds18b20_romD); //匹配第四路
write_byte(0xbe); //讀溫度
temp_data_l= read_byte(); //溫度低8位
temp_data_h = read_byte(); //溫度高8位
convert_T(temp_data_h,temp_data_l);
second_line[10]=LCD_3; //溫度轉換後的各位
second_line[11]=LCD_2; //分別存入顯示緩存數組中
second_line[12]=LCD_1;
second_line[14]=LCD_0;
display();
}
}

㈧ 求一個51單片機 用DS18B20晶元實現 的溫控程序

基於AT89S51單片機的數字溫度測量及顯示系統設計
程序
DI EQU P3.3
DO EQU P3.4
CLK EQU P3.5
CS EQU P3.6 ; LCD埠定義
D2RS EQU P2.7
D2RW EQU P2.6
D2E EQU P2.5
KEYPORT EQU P1 ; DS18B20埠定義
TEMPER_L EQU 36H
TEMPER_H EQU 35H
TEMPER_NUM EQU 38H
FLAG1 BIT 00H
DQ BIT P2.4
ORG 0000H
LJMP MAIN
ORG 0003H
JMP INT00
ORG 0038H
MAIN: MOV SP,#60H
SETB P2.0
SETB P2.1
SETB P2.2
SETB EA
SETB EX0
SETB P2.0
SEETB P2.1
SETB P2.2
MOV R0,#01H ;清屏並置地址計數器AC為0
LCALL DIS_CMD _WRT
MOV R0,#38H ;8位數據介面,雙行顯示,5*7點陣
LCALL DIS_CMD _WRT
CALL DIS_CUR_OFF
MOV 42H,#20
MOV 43H,#32
XIAN: LCALL GET_TEMPER
LCALL DISP
LCALL DELAY43MS
MOV A,TEMPER_NUM
SUBB A,42H
JC ZZZL
MOV A,TEMPER_NUM
SUBB A,43H
JNC ZZZ2
SETB P2.0
SETB P2.1
SETB P2.2
JMP XIAN
ZZZL: CLR P2.0
CLR P2.2
JMP XIAN
ZZZ2: CLR P2.0
CLR P2.1
JMP XIAN
INT0: ;掃描鍵盤程序
LCALL ASK
SAO: CLR 01H
LCALL KEY
JNB 01H,SAO
CJNE A,#10,PAN
LCALL ANSW
RETI
PAN: CJNE A,#12,SAO
RETI ;顯示函數部分,可供調用
DIS_CUR_OFF: MOV R0,#0CH
LCALL DIS_CMD_WRT
RET
DIS_CUR_ON: MOV R0,#0EH
LCALL DIS_CMD_WRT
RET
CHK_BUSY_FLG: MOV P0,#0FFH
CLR D2RS
NOP
NOP
NOP
LCALL DISPLAY_RD
JB ACC.7,CHK_BUSY_FLG
RET
CLEAR_DIS: MOV R0,#01H
LCALL DIS_CMD_WRT
RET
DIS_CMD_WRT: LCALL CHK_BUSY_FLG
MOV P0,R0
CLR D2RS
NOP
NOP
NOP
LCALL DISPLAY_WRT
RET
DIS_DATA_WRT: LCALL CHK_BUSY_FLG
CJNE A,#10H,DIS_DAT_WRT1
MOV P0,#0C0H ;1100,00000行起始地址為40
CLR D2RS
NOP
NOP
NOP
LCALL DISPLAY_WRT
DIS_DAT_WRT1: MOV P0,R0
SETB D2RS
NOP
NOP
NOP
LCALL DISPLAY_WRT
RET

DISPLAY_WRT: CLR D2RW
NOP
NOP
NOP
SETB D2E
NOP
NOP
NOP
CLR D2E
NOP
NOP
NOP
RET

DISPLAY_RD: SETB D2RW
NOP
NOP
NOP
SETB D2E
NOP
NOP
NOP
MOV A,P0
NOP
NOP
NOP
CLR D2E
NOP
NOP
NOP
RET

DIS_DATA_RD: LCALL CHK_BUSY_FLG
MOV P0,#0FFH
SETB D2RS
LCALL DISPLAY_RD
RET ;鍵盤程序,出口:A為按鍵值 01H:0無鍵按下 1 有鍵按下
KEY: MOV KEYPORT,#0FH
MOV A,KEYPOR
CJNE A,#0FH,KEYDOWN
MOV A,#0FFH
RET
KEYDOWN: LCALL DELAY43MS
MOV KEYPORT,#0FH
MOV A,KEYPORT
CJNE A,#0FH,KEYDOWN_YES
MOV A,#0FFH
RET
KEYDOWN _YES: MOV B,A
MOV KEYPORT,#0F0H
MOV A,KEYPORT
ORL A,B
PUSH 30H
MOV 30H,A
MOV R3,#10H
MOV DPTR,#KEYVALUE
NEXT_KEY: MOV A,R3
MOVC A,@a+dptr
CJNE A,30h,NEXTKEYVALUE
DEC R3
POP 30H
WAITKEY_F: MOV KEYPORT,#0FH
MOV A,KEYPORT
CJNE A,#0FH, WAITKEY_F
MOV A,R3
SETB 01H
RET
NEXTKEYVALUE: DJNZ R3,NEXT_KEY
DEC R3
POP 30H
WAITKEY_FREE: MOV KEYPORT,#0FH
MOV A,KEYPORT
CJNE A,#0FH, WAITKEY_FREE
MOV A,R3
SETB 01H
RET
KEYVALUE: DB 0FFH,7EH,7DH,7BH,77H,0BEH,0BDH,0BBH,0B7H,0DEH,0DDH,0DBH,0D7H,0EEH,0EDH,0EBH,0E7H
DELAY43MS: PUSH A
MOV A,R3
PUSH A
MOV A,R2
PUSH A
MOV R3,#43
DELAY: MOV R2,#0FAH
LOOP: NOP ;內層循環為1MS
NOP
DJNZ R2,LOOP
DJNZ R3, DELAY
POP A
MOV R2,A
POP A
MOV R3,A
POP A
RET ;確認是否修改溫度設定
ASK: MOV R0,#01H ;清屏並置地址計數器AC為0
LCALL DIS_CMD_WRT
MOV 40H,#0
ZDZ: MOV DPTR,#LINE
MOV A,40H
MOVC A,@A+DPTR
MOV R0,A
LCALL DIS_DATA_WRT
INC 40H
MOV A,40H
MOVC A,@A+DPTR
CJNE A,#00H,ZDZ
RET
LINE: DB " ARE YOU SURE
CHANGE T(Y/N)?",00H
ANSW: MOV R6,42H
MOV R7,43H
MOV R0,#01H
LCALL DIS_CMD_WRT
MOV R0,#44H
CALL DIS_DATA_WRT
MOV R0,#6FH
CALL DIS_DATA_WRT
MOV R0,#77H
CALL DIS_DATA_WRT
MOV R0,#6EH
CALL DIS_DATA_WRT
MOV R0,#3AH
CALL DIS_DATA_WRT
MOV 40H,#0
CLR 00H
JMP SAO1
GAI: MOV R0,#0FEH
CALL DIS_DATA_WRT
MOV R0,#55H
CALL DIS_DATA_WRT
MOV R0,#70H
CALL DIS_DATA_WRT
MOV R0,#3AH
CALL DIS_DATA_WRT
MOV 40H,#0
SAO1: CLR 01H
LCALL KEY
JNB 01H,SAO1
MOV R1,A
MOV B,#10
DIV AB
JZ NEXT2
MOV A,A1
CJNE A,#11,XU
JB 00H,DOWN
MOV 42H,40H
CPL 00H
JMP GAI
DOWN: MOV 43H,40H
RETI
XU: CJNE A,#12,SAO1
MOV 42H,R6
MOV 43H,R7
RETI
NEXT2: MOV A,R1
ADD A,#30H
MOV R0,A
LCALL DIS_DATA_WRT
MOV A,R1
XCH A,40H
MOV B,#10
MUL AB

NOP
CLR DQ

CLR C
WR1: CLR DQ
MOV R3,#6
DJNZ R3,$
RR R4,#2 R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET ; 將從DS18B20中讀出的溫度數據進行轉換
TEMPER_COV: MOV A,#0f0H
ANL A,TEMPER_L ; 捨去溫度低位中小數點後的四位溫度數值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1 ; 四捨五入去溫度值
INC TEMPER_NUM
TEMPER_COV1:MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A ; 保存變換後的溫度數據
RET ;AD0832:
SETB DI
SETB DO
SETB CLK
CLR CS
NOP
SETB CS

CLR CLK
CLR CS
CALL DELAY1
SETB DI
SETB CLK
NOP

CLR CLK
SETB DI
SETB CLK

NOP
CLR CLK
CLR DI
SETB CLK

NOP
CLR CLK
NOP
SETB CLK
NOP
CLR CLK
NOP

SETB CLK
MOV C,DO
CLR CLK
RLC A;7

SETB CLK
MOV C,DO
CLR CLK
RLC A 6

SETB CLK
MOV C,DO
CLR CLK
RLC A ;5

SETB CLK
MOV C,DO
CLR CLK
RLC A ;4

SETB CLK
MOV C,DO
CLR CLK
RLC A ;3

SETB CLK
MOV C,DO
CLR CLK
RLC A ;2

SETB CLK
MOV C,DO
CLR CLK
RLC A ;1

SETB CLK
MOV C,DO
CLR CLK
RLC A ;0

SETB CLK
NOP
CLR CLK ;1
NOP

SETB CLK
NOP
CLR CLK ;2
NOP

SETB CLK
NOP
CLR CLK ;3
NOP

SETB CLK
NOP
CLK ;4
NOP

SETB CLK
NOP
CLR CLK ;5
NOP

SETB CLK
NOP
CLR CLK ;6
NOP

SETB CLK
NOP
CLR CLK ;7
NOP

SETB CLK
NOP
CLR CLK
NOP
SETB CLK
NOP
CLR CLK
NOP
CALL DELAY1
SETB CS
RET
DELAY1: MOV R7,#10
DELAY2: NOP
NOP
DJNZ R7,DELAY2
RET

㈨ 給個51單片機單線掛載多個ds18b20溫度計的程序

//安裝目錄下的EXE文件打開後可在電腦上顯示當前溫度值
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2; //define interface
uint temp; // variable of temperature
uchar flag1; // sign of the result positive or negative
sbit la=P2^6;
sbit wela=P2^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};

void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
///////功能:串口初始化,波特率9600,方式1///////
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}

void dsreset(void) //send reset and initialization command
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}

bit tmpreadbit(void) //read a bit
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}

uchar tmpread(void) //read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里
}
return(dat);
}

void tmpwritebyte(uchar dat) //write a byte to ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}

}
}

void tmpchange(void) //DS18B20 begin change
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
}

uint tmp() //get the temperature
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}

void readrom() //read the serial
{
uchar sn1,sn2;
dsreset();
delay(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}

void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}

void display(uint temp) //顯示程序
{
uchar A1,A2,A2t,A3,ser;
ser=temp/10;
SBUF=ser;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
la=0;
P0=table[A1]; //顯示百位
la=1;
la=0;

wela=0;
P0=0x7e;
wela=1;
wela=0;
delay(1);

la=0;
P0=table1[A2]; //顯示十位
la=1;
la=0;

wela=0;
P0=0x7d;
wela=1;
wela=0;
delay(1);

P0=table[A3]; //顯示個位
la=1;
la=0;

P0=0x7b;
wela=1;
wela=0;
delay(1);
}

void main()
{
uchar a;
Init_Com();
do
{
tmpchange();
// delay(200);
for(a=10;a>0;a--)
{ display(tmp());
}
} while(1);
}

㈩ 基於51單片機的DS18B20程序(數碼管顯示)

#include <reg51.h>
#include"18b20.c"
sbit DQ =P1^0; //定義通信埠
unsigned char tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0, 1, 2 3 4 5 6 7 8 9

void delay(unsigned int i);//延時函數
Init_DS18B20(void); //初始化函數
ReadOneChar(void); //讀一個位元組
WriteOneChar(unsigned char dat); //寫一個位元組
ReadTemperature(void); //讀取溫度
void display(unsigned char i); //溫度顯示函數
unsigned char c=0,x=0;

//****主程序溫度顯示函數**********
void display(unsigned char i){
P0=tab[i/10];
P2=0x04;
delay(100);
P0=tab[i%10];
P2=0x02;
delay(100);
P0=tab[x];
P2=0x01;
delay(100);
}
void main(void){
unsigned char temp;
while(1){ //主循環
temp=ReadTemperature();
display(temp);
}
}

閱讀全文

與51單片機ds18b20程序相關的資料

熱點內容
被調侃的程序員 瀏覽:485
哪裡有無損音樂app下載 瀏覽:221
單片機如何使用proteus 瀏覽:991
java常用的伺服器 瀏覽:281
集結APP在哪裡下載 瀏覽:800
歐洲cf玩什麼伺服器 瀏覽:529
如何連接另一台電腦上的共享文件夾 瀏覽:681
如何讓桌面文件夾搬家到e盤 瀏覽:73
java自動格式化 瀏覽:619
ipad怎麼查看文件夾大小 瀏覽:583
手工粘土解壓球 瀏覽:552
在線視頻教育源碼 瀏覽:41
快四十學什麼編程 瀏覽:754
gnumakelinux 瀏覽:537
視易峰雲伺服器怎麼改系統 瀏覽:535
javamap取值 瀏覽:768
mac和win磁碟加密軟體 瀏覽:474
蘋果為什麼會連接不到伺服器 瀏覽:726
pdf格式文件如何保存 瀏覽:303
小霸王伺服器tx什麼意思 瀏覽:75