|
本系統可由用戶根據需要自由設置大小風檔的切換溫度值TH,TL,硬件上設計了3個按鍵,按下一次設置鍵K1,進入溫度上限設置,此時按下“加”鍵K2,加一,按下“減”鍵K3,減一。再按一次設置鍵K1進入溫度下限設置狀態,此時按下“加”鍵K2,加一,按下“減”鍵K3,減一。再按一次設置鍵K1退出下限溫度設置狀態,恢復到當前溫度顯示狀態。 注:溫度上下限以及當前溫度顯示格式為H-XX L-XXD-XX. XX為溫度值;D為檔位值。
單片機源程序如下:
- /**************************************************************************************
- * DS18B20溫度傳感器實驗 *
- 實現現象:下載程序后,在溫度傳感器接口處,按照絲印方向插好溫度傳感器,數碼管就會顯示
- 檢測的溫度值,
- 注意事項:
- ***************************************************************************************/
- #include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
- #include"temp.h"
- #include<intrins.h>
- typedef unsigned int u16; //對數據類型進行聲明定義
- typedef unsigned char u8;
- char i;
- sbit dj=P1^0;//電機
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit key1=P3^1;//設置溫度
- sbit key2=P3^0;//溫度加
- sbit key3=P3^2;//溫度減
- u8 wen_du;//溫度變量
- u8 shang,xia; //對比溫度暫存變量
- u16 dang;//檔位顯示
- u16 flag;
- u16 d1,d2,d3;//顯示溫度暫存變量
- u8 DisplayData[8];
- u8 code smgduan[22]={0x3F,0x06,0x5B,0x4F,0x66,
- 0x6D,0x7D,0x07,0x7F,0x6F,
- 0x77,0x7C,0x39,0x5E,0x79,0x71,
- 0x40,0x38,0x76,0x00,0xff,0x37};
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函數名 :DigDisplay()
- * 函數功能 :數碼管顯示函數
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void DigDisplay()
- {
- u8 i;
- for(i=0;i<4;i++)
- {
- switch(i) //位選,選擇點亮的數碼管,
- {
- case(3):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(2):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(1):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(0):
- LSA=1;LSB=1;LSC=0; break;//顯示第3位
- }
- Ds18b20ReadTemp();
- P0=smgduan[DisplayData[i]];//發送數據
- delay(100); //間隔一段時間掃描
- P0=0x00;//消隱
- }
- }
- /*******************************************************************************
- * 函 數 名 : Delay1ms
- * 函數功能 : 延時函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Delay1ms(uint y)
- {
- uint x;
- for( ; y>0; y--)
- {
- for(x=110; x>0; x--);
- }
- }
- /*******************************************************************************
- * 函 數 名 : Ds18b20Init
- * 函數功能 : 初始化
- * 輸 入 : 無
- * 輸 出 : 初始化成功返回1,失敗返回0
- *******************************************************************************/
- uchar Ds18b20Init()
- {
- uchar i;
- DSPORT = 0; //將總線拉低480us~960us
- i = 70;
- while(i--);//延時642us
- DSPORT = 1; //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
- i = 0;
- while(DSPORT) //等待DS18B20拉低總線
- {
- Delay1ms(1);
- i++;
- if(i>5)//等待>5MS
- {
- return 0;//初始化失敗
- }
-
- }
- return 1;//初始化成功
- }
- /*******************************************************************************
- * 函 數 名 : Ds18b20WriteByte
- * 函數功能 : 向18B20寫入一個字節
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Ds18b20WriteByte(uchar dat)
- {
- uint i, j;
- for(j=0; j<8; j++)
- {
- DSPORT = 0; //每寫入一位數據之前先把總線拉低1us
- i++;
- DSPORT = dat & 0x01; //然后寫入一個數據,從最低位開始
- i=6;
- while(i--); //延時68us,持續時間最少60us
- DSPORT = 1; //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值
- dat >>= 1;
- }
- }
- /*******************************************************************************
- * 函 數 名 : Ds18b20ReadByte
- * 函數功能 : 讀取一個字節
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- uchar Ds18b20ReadByte()
- {
- uchar byte, bi;
- uint i, j;
- for(j=8; j>0; j--)
- {
- DSPORT = 0;//先將總線拉低1us
- i++;
- DSPORT = 1;//然后釋放總線
- i++;
- i++;//延時6us等待數據穩定
- bi = DSPORT; //讀取數據,從最低位開始讀取
- /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
- byte = (byte >> 1) | (bi << 7);
- i = 4; //讀取完之后等待48us再接著讀取下一個數
- while(i--);
- }
- return byte;
- }
- /*******************************************************************************
- * 函 數 名 : Ds18b20ChangTemp
- * 函數功能 : 讓18b20開始轉換溫度
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Ds18b20ChangTemp()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0x44); //溫度轉換命令
- //Delay1ms(100); //等待轉換成功,而如果你是一直刷著的話,就不用這個延時了
-
- }
- /*******************************************************************************
- * 函 數 名 : Ds18b20ReadTempCom
- * 函數功能 : 發送讀取溫度命令
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Ds18b20ReadTempCom()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0xbe); //發送讀取溫度命令
- }
- /*******************************************************************************
- * 函 數 名 : Ds18b20ReadTemp
- * 函數功能 : 讀取溫度
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- int Ds18b20ReadTemp()
- {
- int temp = 0;
- uchar tmh, tml;
- Ds18b20ChangTemp(); //先寫入轉換命令
- Ds18b20ReadTempCom(); //然后等待轉換完后發送讀取溫度命令
- tml = Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節
- tmh = Ds18b20ReadByte();//再讀高字節
- wen_du=((tmh*256+tml)>>4);
- temp = tmh;
- temp <<= 8;
- temp |= tml;
- return temp;
- }
- void zi_keyscan() //自動模式按鍵掃描函數
- {
- if(key1==0) //設置鍵按下
- {
- delay(30); //延時去抖
- if(key1==0)flag=1; //再次判斷按鍵,按下的話進入設置狀態
- while(key1==0);//???? //按鍵釋放
- }
- //顯示上限溫度H
- while(flag==1) //進入設置按鍵上限狀態
- {
- d1=18;d2=shang/10;d3=shang%10; //顯示字母H 和上線溫度值
- DisplayData[0]=d1; //調用顯示函數
- DisplayData[1]=16;
- DisplayData[2]=d2;
- DisplayData[3]=d3;
- DigDisplay();
- if(key1==0) //判斷設置鍵是否按下
- {
- delay(30); //延時去抖
- if(key1==0)flag=2; //按鍵按下,進入設置下限模式
- while(key1==0);//松手檢測
- }
- if(key2==0) //加鍵按下
- {
- delay(30); //延時去抖
- if(key2==0) //加鍵按下
- {
- shang+=1; //上限加5
- if(shang>=40)shang=40; //上線最大加到100
- }while(key2==0);//松手檢測
- }
- if(key3==0) //減鍵按下
- {
- delay(30); //延時去抖
- if(key3==0) //減鍵按下
- {
- shang-=1; //上限減1
- if(shang<=15)shang=15; //上限最小減到10
- }while(key3==0);//松手檢測
- }
- }
- //顯示下限溫度L
- while(flag==2) //設置下限
- {
- d1=17;d2=xia/10;d3=xia%10; //顯示字母L 顯示下限溫度值
- DisplayData[0]=d1; //調用顯示函數
- DisplayData[1]=16;
- DisplayData[2]=d2;
- DisplayData[3]=d3;
- DigDisplay();
- if(key1==0)
- {
- delay(30);
- if(key1==0)flag=0;
- while(key1==0);
- }
- if(key2==0)
- {
- delay(30);
- if(key2==0)
- {
- xia+=1;
- if(xia>=40)xia=40;
- }while(key2==0);//????
- }
- if(key3==0)
- {
- delay(30);
- if(key3==0)
- {
- xia-=1;
- if(xia<=15)xia=15;
- }while(key3==0);//????
- }
- }
- }
- void zi_dong() //傳感器采集溫度以及擋位顯示
- {
- u16 i;
- d1=dang;d2=wen_du/10;d3=wen_du%10; //顯示檔位,顯示當前溫度值
- zi_keyscan(); //按鍵掃描函數
- DisplayData[0]=d1; //調用顯示函數
- DisplayData[1]=16;
- DisplayData[2]=d2;
- DisplayData[3]=d3;
- DigDisplay(); //調用顯示函數
- if(wen_du<xia){dj=0;dang=0;} //低于下限 顯示為0 電機停止
- if((wen_du>=xia)&&(wen_du<=shang))//溫度大于下限,小于上限 1檔
- {
- dang=1;
- for(i=0;i<2;i++){dj=0;DigDisplay();zi_keyscan();} //PWM通過延時降低風扇轉速
- for(i=0;i<4;i++){dj=1;DigDisplay();zi_keyscan();}
- }
- if(wen_du>shang){dj=1;dang=2;}//高溫全速
- }
- void main() //主函數
- {
- u16 j;
- dj=0; //電機開
- shang=30;
- xia=20; //初始上下限值
- for(j=0;j<80;j++) //現讀取溫度值,防止開機顯示85
- Ds18b20ReadTemp();
- while(1) //進入while循環
- {
- Ds18b20ReadTemp(); //讀取溫度值
- for(j=0;j<100;j++)zi_dong();//自動溫控模式
- }
- }
復制代碼
所有資料51hei提供下載:
|
-
-
fengshan (3).zip
2019-8-5 16:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
22.81 KB, 下載次數: 10, 下載積分: 黑幣 -5
溫控風扇
-
-
溫控風扇.7z
2019-8-6 15:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
79.63 KB, 下載次數: 12, 下載積分: 黑幣 -5
電路仿真圖,51程序
評分
-
查看全部評分
|