資源簡介
基于AT89S52單片機的數字溫度計基于AT89S52單片機的數字溫度計基于AT89S52單片機的數字溫度計
代碼片段和文件信息
//ds18b20做的溫度計(共陰四位數碼管)
#include
#define??uchar??unsigned?char
sbit?DQ=0xB0;????//已修改為p3的0號端口
uchar?data????temp_data[2]={0x000x00};???//?用來存放從18B20讀得的高8位和低8位數據
uchar?data????display[5]={0x000x000x000x000x00};
unsigned?char?code?ditab[16]={0x000x010x010x020x030x030x04
??????????????????????????????0x040x050x060x060x070x080x080x090x09};?//共陰數碼管
uchar?code?table[11]?={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f0x00};
????//?0123456789百位或當最高位十位為0時不顯示
uchar?code?table1[10]=?{0xcf0x860xdb0xcf0xe60xed0xfd0x870xff0xef};
????//?0.,1.,2.,3.,4.,5.,6.,7.,8.,9.各位帶有小數點的顯示
void?delay_18b20(unsigned?int?i)
{
while(i--);
}
//初始化函數
Init_DS18B20(void)
{
unsigned?char?x=0;
DQ?=?1;?????//DQ復位
delay_18b20(8);???//稍做延時
DQ?=?0;?????//單片機將DQ拉低
delay_18b20(80);??//精確延時?大于?480us
DQ?=?1;?????//拉高總線
delay_18b20(14);
x=DQ;???????//稍做延時后?如果x=0則初始化成功?x=1則初始化失敗
delay_18b20(20);
}
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_18b20(4)?;
????}
??????return?(dat)?;
}
WriteOneChar(unsigned?char?dat)
{
????unsigned?char?i?=?0?;
????for?(i?=?8?;?i?>?0?;?i--)
????{
??????DQ?=?0?;
??????DQ?=?dat&0x01?;
?????delay_18b20(5)?;
??????DQ?=?1?;
??????dat>>=1?;
????}
}
Read_Temperature(void)
{?
???????Init_DS18B20()?;
?
???????WriteOneChar(0xCC)?;????//?跳過讀序號列號的操作
???????WriteOneChar(0x44)?;????//?啟動溫度轉換
???????Init_DS18B20()?;
???????WriteOneChar(0xCC)?;????//跳過讀序號列號的操作
???????WriteOneChar(0xBE)?;????//讀取溫度寄存器?
???????temp_data[0]?=?ReadOneChar()?;?????//溫度低8位
???????temp_data[1]?=?ReadOneChar()?;
評論
共有 條評論