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