資源簡介
基于51和DS18B20的溫度采集,用到了DS18B20的search rom指令,可以自動搜索序列號。

代碼片段和文件信息
#include?
#include? ?
#define?uchar?unsigned?char
#define?uint?unsigned?int
#define?MAXNUM?4
sbit?DS=P2^1;
sbit?RS=P3^0;
sbit?RW=P3^1;
sbit?EN=P3^2;
sbit?P34=P3^4;
sbit?P35=P3^5;
sbit?P36=P3^6;
sbit?P37=P3^7;?
uchar?ID[4][8]={0};
uchar?funum=0;
uchar?code?tab3[16]={“searching?rom...“};
uchar?code?tab4[14]={“search?rom?OK!“};
uchar?code?tab5[13]={“The?total?is:“};
uchar?code?tab6[10]={“0123456789“};
uchar?code?tab7[14]={“No(?):???.???C“};
void?delay_ms(uchar?i)??//延時(j*2+1+2)*i+5?個機器周期????
{?uchar?j; ????//12MHz時,延時?0.5*i?ms
??do{j=248;? ?
?????do{j--;}while(j);?
?????i--;?
????}while(i);?
}
void?delay_2us(uchar?i) ??//延時?2*i+5?us
{
??while(--i);
}
void?LCD_com(uchar?com)?//向LCD寫指令
{
??RS=0;????????????????
??RW=0;
??P1=com;
??EN=1;
??EN=0;
??delay_2us(20);
}
void?LCD_data(uchar?dat)//向LCD寫數(shù)據(jù)
{
??RS=1;????????????????
??RW=0;
??P1=dat;?
??EN=1;
??EN=0;
??delay_2us(20);
}
void?LCD_init()??//初始化LCD
{
??LCD_com(0x38);?//8位數(shù)據(jù)總線,顯示兩行,5*7點陣
??LCD_com(0x0c);?//顯示功能打開,無光標(biāo)
??LCD_com(0x01);?//清屏,光標(biāo)歸位,地址計數(shù)器AC置0
??delay_ms(4);???//延時2ms,因為0x01清屏需要1.64ms
}
uchar?DS_init(void)???????//18B20復(fù)位,初始化函數(shù)
{
??uchar?presence;
??DS=0;??????????delay_2us(250);
??DS=1;??????????delay_2us(30);
??presence=DS;???delay_2us(250);
??return?(presence); ??//返回0則初始化成功,否則失敗
}
uchar?read_byte(void)???????//讀1字節(jié)
{
??uchar?ijdat=0;
??for(i=1;i<=8;i++)
????{DS=0;???_nop_();?????????
?????DS=1;???delay_2us(2);
?????j=DS;???delay_2us(30);
?????dat=(j<<7)|(dat>>1);???//讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在DAT里
????}
??return(dat);
}
uchar?read_2bit(void)???????//讀2位
{
??uchar?i=0j=0;
??DS=0;???_nop_();?????????
??DS=1;???delay_2us(2);
??j=DS;???delay_2us(30);
??DS=0;???_nop_();?????????
??DS=1;???delay_2us(2);
??i=DS;???delay_2us(30);
??i=j*2+i;??
??return(i);
} ?
void?write_byte(uchar?dat) //寫1字節(jié)
{??
??uchar?i;
??for(i=0;i<8;i++)
????{DS=0;
?????DS?=?dat&0x01;
?????delay_2us(50);
?????DS?=?1;
?????dat>>=1;
??? }
}
void?write_bit(bit?dat) //寫1位
{??
??DS=0;
??DS=dat;
??delay_2us(50);
??DS?=?1;
}
void?match_rom(uchar?j) ?????//匹配ROM
{
char?k;
write_byte(0x55); ?????//發(fā)送匹配ROM命令
for(k=0;k<8;k++)
??write_byte(ID[j][k]);?//發(fā)送18B20的序列號,先發(fā)送低字節(jié)?
}?
uint?convert(uchar?j)??????//讀取寄存器中存儲的溫度數(shù)據(jù)
{
??float?tt;
??uint?temp;
??uchar?ab;
??while(DS_init()); ???//發(fā)送指令,使18b20開始轉(zhuǎn)換溫度
??match_rom(j); ?
??write_byte(0x44);
??while(DS_init()); ???//發(fā)送指令,讀取溫度
??match_rom(j); ??
??write_byte(0xbe);
??a=read_byte();??????//讀低8位
??b=read_byte(); ??//讀高8位
??fu=0;
??if(b&0xf8)?fu=1;?????//判斷溫度正負(fù)?
??temp=b;
??temp<<=8;???????????//兩個字節(jié)組合為1個字
??temp=temp|a;
??if(fu)?temp=-temp;
??tt=temp*0.0625;?????//溫度在寄存器中是12位,分辨率是0.0625
??temp=tt*100+0.5;?????//乘100表示小數(shù)點后只取1位,加0.5是四舍五入
??return?temp;
}
uchar?search_rom(void)//遍歷搜索單線上所連的所有18b20的序列號
{?
??uchar?kl=0chongtuweimna;
??uchar?zhan[(MAXNUM+1)]={0};
??do
???{
?????DS_init();
?????write_by
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2011-06-05?00:16??第三版\
?????目錄???????????0??2011-06-15?21:01??第三版\LCD\
?????文件??????151126??2011-06-11?02:35??第三版\LCD\001.DSN
?????文件????????3271??2011-06-15?21:00??第三版\LCD\001.PWI
?????文件???????17535??2011-06-05?01:42??第三版\LCD\111
?????文件????????7362??2011-06-05?01:42??第三版\LCD\111.hex
?????文件??????????38??2011-06-05?01:42??第三版\LCD\111.lnp
?????文件???????20891??2011-06-05?01:42??第三版\LCD\111.M51
?????文件?????????184??2011-06-15?21:01??第三版\LCD\111.plg
?????文件???????57100??2011-06-15?21:01??第三版\LCD\111.uvopt
?????文件???????13234??2011-05-31?23:28??第三版\LCD\111.uvproj
?????文件???????57100??2011-06-15?19:26??第三版\LCD\111_uvopt.bak
?????文件???????????0??2011-05-31?10:00??第三版\LCD\111_uvproj.bak
?????文件????????6518??2011-06-05?01:42??第三版\LCD\222.c
?????文件???????11962??2011-06-05?01:42??第三版\LCD\222.LST
?????文件???????18957??2011-06-05?01:42??第三版\LCD\222.OBJ
?????文件??????????19??2011-05-31?19:29??第三版\LCD\ExtDll.iex
?????文件??????145645??2011-06-05?01:43??第三版\LCD\Last?Loaded?001.DBK
- 上一篇:仿360強力刪除
- 下一篇:AES加密算法Dll
評論
共有 條評論