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