標題: 單片機溫控風扇源程序和電路圖 [打印本頁]
作者: 冬天好熱 時間: 2019-8-5 16:30
標題: 單片機溫控風扇源程序和電路圖
本系統可由用戶根據需要自由設置大小風檔的切換溫度值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程序
作者: admin 時間: 2019-8-5 22:31
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
久久亚洲国产
|
免费视频一区二区
|
久久精品国产亚洲
|
久久国产99|
性生活视频网站
|
亚洲一级片在线观看
|
日本免费高清视频
|
亚洲福利网
|
日韩高清中文字幕
|
国产精品一区二区不卡
|
亚洲va韩国va欧美va精品
|
国产超碰在线
|
色婷婷综合网
|
玖草在线|
青青国产在线
|
日本视频免费观看
|
亚洲二级片
|
精品欧美黑人一区二区三区
|
久久免费精品
|
中文字幕日韩一区
|
伊人久操
|
三级视频在线
|
欧美成人精品欧美一级乱黄
|
国产精品免费在线
|
狠狠干2021|
欧美国产一区二区
|
亚洲va视频
|
久久精品免费看
|
欧美精品乱码99久久蜜桃
|
久久不射网
|
黄色1级片
|
亚洲一区视频在线
|
精品国产一区二
|
午夜免费av
|
特级黄色片
|
国产免费黄色片
|
黄色a一级片
|
福利视频网站
|
久久精品视频国产
|
91禁蘑菇在线看
|
亚洲欧美在线播放
|