資源簡介
用51單片機讀取DS18B20的溫度數據,并在1602上面顯示,包含完整工程和proteus仿真

代碼片段和文件信息
#include
#include
#include
#define uchar?unsigned?char
#define?uint?unsigned?int
#define?delay4us()?{_nop_();_nop_();_nop_();_nop_();}
sbit?DQ=P3^4;
uchar?code?df_Table[]={0112334456678899};?//溫度小數位對照表
uchar?CurrentT=0;//當前讀取的溫度整數部分
uchar?Temp_Value[]={0x000x00}; ???//從DS18B20讀取的溫度值
uchar?Display_Digit[11]={00000000000};???//待顯示的各溫度數位
bit?DS18B20_IS_OK=1;??//DS18B20正常標志
void?DelayXus(uint?x)??//延時1
{
??uchar?i;
??while(x--)
??{
??for(i=0;i<200;i++);
??}
}
void?Delay(uint?x)??//延時2
{
??while(x--);
}
uchar?Init_DS18B20()??//初始化18B20
{
??uchar?status;
??DQ=1;
??Delay(8);
??DQ=0;
??Delay(90);
??DQ=1;
??Delay(8);
??status=DQ;
??Delay(100);
??DQ=1;
??return?status;
}
uchar?ReadOneByte() ?//從DS18B20讀一字節數據
{
??uchar?idat=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)???//從DS18B20寫一字節數據
{
?uchar?i;
?for(i=0;i<8;i++)
??{
???DQ=0;
???DQ=dat&0x01;
???Delay(5);
???DQ=1;
???dat>>=1;
??}
}
void?Read_Temperature()//??????從DS18B20讀取溫度值
{
?if(Init_DS18B20()==1)???//DS18B20故障
???????DS18B20_IS_OK=0;
else
{
??WriteOneByte(0xcc);??//跳過序列號命令
??WriteOneByte(0x44);???//啟動溫度轉換命令
??Init_DS18B20();//復位DS18B20
??WriteOneByte(0xcc);//跳過序列號命令
??WriteOneByte(0xbe);//讀取溫度寄存器
??Temp_Value[0]=ReadOneByte();?//讀取溫度低字節
??Temp_Value[1]=ReadOneByte(); //讀取溫度高字節
??DS18B20_IS_OK=1;????//DS18B20正常
}
}
void?Display_Temperature()
{
uchar?i;
uchar?t=150ng=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[5]=df_Table[Temp_Value[0]&0x0f]+‘0‘;?//由低四位確定小數值
??CurrentT=(((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4));
??if(CurrentT/100==0)
??Display_Digit[1]=‘?‘;
??else
??Display_Digit[1]=CurrentT/100+‘0‘;
??Display_Digit[2]=(CurrentT%100)/10+‘0‘;
??Display_Digit[3]=CurrentT%10+‘0‘;
??Display_Digit[4]=‘.‘;
??Display_Digit[6]=‘0‘;
??Display_Digit[7]=‘0‘;
??Display_Digit[8]=‘?‘;
??Display_Digit[9]=‘c‘;
??if(ng==1)
??Display_Digit[0]=‘-‘;
??else
??Display_Digit[0]=‘+‘;
??LCD_Write_String(61Display_Digit);
??LCD_Write_String(20“thermometry“);
??LCD_Write_String(11“Temp“);
}
void?main()
{
LCD_Init();
Read_Temperature();
Delay(50000);
Delay(50000);
while(1)
?{
??Read_Temperature();
???if(DS18B20_IS_OK)
??????Display_Temperature();
??DelayXus(100);
??}?
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????12522??2015-08-02?08:35??DS18B20\DS18B20
?????文件???????2757??2015-08-02?08:35??DS18B20\DS18B20.c
?????文件???????2508??2015-08-02?08:35??DS18B20\DS18B20.hex
?????文件?????????62??2015-08-02?08:35??DS18B20\DS18B20.lnp
?????文件???????6001??2015-08-02?08:35??DS18B20\DS18B20.LST
?????文件??????19143??2015-08-02?08:35??DS18B20\DS18B20.M51
?????文件??????14055??2015-08-02?08:35??DS18B20\DS18B20.OBJ
?????文件????????159??2015-08-13?10:28??DS18B20\DS18B20.plg
????.......?????57076??2015-08-13?10:58??DS18B20\DS18B20.uvopt
?????文件??????13576??2015-07-31?22:40??DS18B20\DS18B20.uvproj
????.......?????56272??2015-08-12?23:11??DS18B20\DS18B20_uvopt.bak
?????文件??????????0??2015-07-31?19:14??DS18B20\DS18B20_uvproj.bak
?????文件?????121665??2015-07-31?22:40??DS18B20\Last?Loaded?show.DBK
?????文件???????3488??2014-05-08?15:35??DS18B20\lcd1602.h
?????文件?????121681??2015-08-02?08:36??DS18B20\show.DSN
?????文件???????1028??2015-08-13?10:58??DS18B20\show.PWI
?????文件???????6376??2005-03-22?15:22??DS18B20\STARTUP.A51
?????文件??????14049??2015-07-31?22:02??DS18B20\STARTUP.LST
?????文件????????749??2015-07-31?22:02??DS18B20\STARTUP.OBJ
?????文件?????819712??2015-07-31?21:04??DS18B20\參考資料.doc
?????目錄??????????0??2015-08-13?10:58??DS18B20
-----------?---------??----------?-----??----
??????????????1272879????????????????????21
- 上一篇:labview編寫的串口調試助手
- 下一篇:sed.exe 64位
評論
共有 條評論