今天是母親節(jié),祝福我的母親健康長壽。
/*DS18B20讀取溫度字節(jié)程序 本函數(shù)花了我不少時間,主要問題是在51可以的情況下他卻不行,知道今天才解決,原來是部分延時函數(shù)數(shù)值不對,造成的
所以雖然做過也未見得好用,切不可粗心大意,AVR內部8M晶振,20110508 天津第四項目部宿舍 */
#include <iom16v.h>
#define uchar unsigned char
#define uint unsigned int
#define get_bit(a,b) a&(1<<b)
#define set_bit(a,b) a|=(1<<b)
#define clr_bit(a,b) a&=~(1<<b)
void delay600us()
{
uint a;
for(a=1600;a;a--);
}
void delay60us()
{uchar a;
for(a=160;a;a--);
}
/* 復位18B20 */
/* 無參 */
/* 無返回 */
void rest_18b20()
{
set_bit(DDRA,4);//開啟PA口得輸出模式
set_bit(PORTA,4);
;;
clr_bit(PORTA,4);
delay600us();
set_bit(PORTA,4);
delay60us();
clr_bit(DDRA,4);
while(get_bit(PINA,4));//判斷有無器件在單總線上
delay600us();
set_bit(DDRA,4);
}
/*寫DS18B20函數(shù)*/
/*傳遞參數(shù)為dat表示要向1820寫入的數(shù)據(jù)字節(jié)*/
/*無返回值*/
void write_18b20(uchar dat)
{
uchar i,j;
set_bit(DDRA,4);
for(j=0;j<8;j++)
{
clr_bit(PORTA,4);
for(i=26;i;i--);
if(get_bit(dat,j))
{set_bit(PORTA,4);}
else
clr_bit(PORTA,4);
for(i=160;i;i--);
set_bit(PORTA,4);
}
}
/*讀DS18B20函數(shù)*/
/*無參*/
/*返回讀出的溫度值*/
uchar read_18b20()
{
uchar date,i,k;
for(i=0;i<8;i++)
{
set_bit(DDRA,4);
clr_bit(PORTA,4);
for(k=10;k;k--);
set_bit(PORTA,4);
for(k=18;k;k--);
clr_bit(DDRA,4);
if(get_bit(PINA,4))
{ set_bit(date,i); }
else
clr_bit(date,i);
for(k=160;k;k--);
}
return (date);
}
void delay100ms()
{
unsigned char a,b,c;
for(c=95;c>0;c--)
for(b=138;b>0;b--)
for(a=29;a>0;a--);
}
void main()
{
DDRC=0xff;
DDRA=0xff;
PORTA=0xff;
while(1)
{
rest_18b20();
write_18b20(0xcc);
write_18b20(0x44);
delay100ms(); //主要是讓1820有足夠的時間去處理內部AD
rest_18b20();
write_18b20(0xcc);
write_18b20(0xbe);
PORTC=read_18b20();//簡單的顯示 僅此而已
}
}
|