資源簡介
控制蔬菜大棚的溫度在一定的范圍內(nèi)變化,過高或者過低就進(jìn)行報(bào)警
代碼片段和文件信息
#include
#include
sbit?DQ?=?P2^5;???????????????? //定義ds18b20通信端口
unsigned?char?result_18b20;?????//ds18b20初始化結(jié)果
signed?int?temKLKHKL1KH1;???//溫度
sbit?sda=P2^7;?????????????????//串行數(shù)據(jù)/地址
sbit?scl=P2^6;?????????????????//串行時(shí)鐘
sbit?P2_0=P2^0;????????????????//數(shù)碼管選擇
sbit?P2_1=P2^1;
sbit?P2_2=P2^2;
sbit?P2_3=P2^3;????????????????//“負(fù)號“數(shù)碼管控制
sbit?P2_4=P2^4;
sbit?P3_2=P3^2;????????????????//控制紅色發(fā)光二極管
sbit?P3_3=P3^3;????????????????//控制藍(lán)色發(fā)光二極管
?
unsigned?char?baishige;?????//數(shù)據(jù)的百位?十位?個(gè)位
unsigned?int?z=0;?????????????//用于控制那個(gè)藍(lán)色按鈕按下是偶數(shù)次還是奇數(shù)次
/***********ds18b20延遲子函數(shù)(晶振12MHz)延時(shí)時(shí)間為n乘以15us****************/?
void?delay_18B20(unsigned?int?n)
{
do{
???_nop_();
???????_nop_();
???????_nop_();
???????_nop_();
???????_nop_();
???????_nop_();
???????_nop_();
???????_nop_();
???????_nop_();
???????_nop_();
???????_nop_();
???????_nop_();
???????_nop_();
???n--;
???}while(n);
}
/***************************ds18b20初始化函數(shù)*********************************/
void?Init_DS18B20(void)?
{
??????????DQ?=?0;????????????????//單片機(jī)將DQ拉低
??delay_18B20(36);????????//延時(shí)540us
??DQ?=?1;?????????????????//拉高總線
??delay_18B20(6);?????????//延時(shí)90us
??result_18b20=DQ;????????//稍做延時(shí)后如果result_18B20=0則初始化成功result_18B20=1則初始化失敗
??delay_18B20(18);????????//延時(shí)270us
}
/***************************ds18b20讀一個(gè)字節(jié)**********************************/??
unsigned?char?ReadOneChar(void)
{
unsigned?char?ij;
????unsigned?char?dat?=?0;
for?(i=8;i>0;i--)
?{
??dat>>=1;
??????????DQ?=?0;?????????????????//?拉低總線產(chǎn)生讀信號
??for(j=2;j>0;j--);???????//延時(shí)4us
??DQ?=?1;?????????????????//?釋放總線準(zhǔn)備讀數(shù)據(jù)
??????????for?(j=4;j>0;j--);??????//延時(shí)8微秒讀數(shù)據(jù)
??if(DQ==1)
??dat|=0x80;
??delay_18B20(4);
??????????DQ?=?1;????????????????//拉高總線準(zhǔn)備下一位數(shù)據(jù)的讀取.
?}
? return(dat);?????????????????//返回讀到的數(shù)據(jù)
}
/************************ds18b20寫一個(gè)字節(jié)***********************************/??
void?WriteOneChar(unsigned?char?dat)
{
? unsigned?char?ij;
? for?(i=8;?i>0;?i--)
? {
?? DQ?=?0;????????????????//拉低總線產(chǎn)生寫信號
????????for?(j=2;j>0;j--);?????//延時(shí)4us
? DQ?=?dat&0x01;?????????//發(fā)送1位
???? delay_18B20(5);????????//延時(shí)75us
? DQ?=?1;????????????????//釋放總線等待總線恢復(fù)
???? dat>>=1;???????????????//準(zhǔn)備下一位數(shù)據(jù)的傳送
?}
}
/*******************讀取ds18b20當(dāng)前溫度,tem中為測得的溫度值****************************/
void?ReadTemperature(void)
{
unsigned?char?a=0b=0;
float?x;
????signed?int?t=0;
Init_DS18B20();?????????//初始化
WriteOneChar(0xCC);???? //跳過讀序號列號的操作
WriteOneChar(0x44);? //啟動(dòng)溫度轉(zhuǎn)換
Init_DS18B20();?????????//初始化
WriteOneChar(0xCC);? //跳過讀序號列號的操作
WriteOneChar(0xBE);? //讀取溫度寄存器等,前兩個(gè)就是溫度
a=ReadOneChar();???? //讀取溫度值低位
b=ReadOneChar();??? //讀取溫度值高位
t=b;
t=t<<8;
t=t+a;?????????????????//將溫度高低位合成
????
if(t<0)????????????????//判斷溫度t為正還是負(fù)
{t=-t;
?x=t*0.0625;???????????//當(dāng)前采集溫度值除16得實(shí)際溫度值
?????tem=x*10+0.5;?????????//將溫度放大十倍,并精確到小數(shù)點(diǎn)后一位
評論
共有 條評論