新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STC12C5A60S2單片機(jī)的DS18B20的C程序

STC12C5A60S2單片機(jī)的DS18B20的C程序

作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò) 收藏

最近在搞18B20,發(fā)現(xiàn)其對(duì)CPU的不兼容性很高,由于其對(duì)時(shí)間信號(hào)的敏感引起的

本文引用地址:http://m.butianyuan.cn/article/201611/320752.htm

由于STC單片機(jī)的速度比8051速度快,屬于1個(gè)時(shí)鐘/機(jī)器周期高速單片機(jī)。速度快當(dāng)然是它的優(yōu)點(diǎn),但對(duì)于要移植傳統(tǒng)的8051程序而言,需要修改時(shí)序來(lái)實(shí)現(xiàn)某功能.

以下程序是ds18b20簡(jiǎn)單的驅(qū)動(dòng)程序,其實(shí)是在網(wǎng)上Down的,經(jīng)本人稍作修改之后,在STC12C5A60S2中調(diào)試通過(guò)的,最后讀溫度返回一個(gè)unsigned int,低12位就是溫度數(shù)據(jù)。在主程序里進(jìn)行運(yùn)算即可得到實(shí)際溫度值。呵呵~~

void delay_18B20(unsigned int i)
{
while(i--);
}

void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復(fù)位
delay_18B20(80); //稍做延時(shí)
DQ = 0; //單片機(jī)將DQ拉低
delay_18B20(800); //精確延時(shí) 大于 480us
DQ = 1; //拉高總線
delay_18B20(140);
x=DQ; delay_18B20(200);
}

unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號(hào)
dat>>=1;
DQ = 1; // 給脈沖信號(hào)
if(DQ)
dat|=0x80;
delay_18B20(40); //40
}
return(dat);
}

void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(50); //50
DQ = 1;
dat>>=1;
}
}

unsigned int ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int temp_value=0;

Init_DS18B20();
WriteOneChar(0xCC);

WriteOneChar(0x44);

delay_18B20(1000);

Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);

delay_18B20(1000);

a=ReadOneChar(); //讀取溫度值低位
b=ReadOneChar(); //讀取溫度值高位

temp_value = b<<8;
temp_value |= a;
return temp_value;

}



評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉