加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶(hù)
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入

基于51單片機(jī)的溫控風(fēng)扇

10/21 09:30
1671
服務(wù)支持:
技術(shù)交流群

完成交易后在“購(gòu)買(mǎi)成功”頁(yè)面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長(zhǎng)和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購(gòu)買(mǎi)后不支持退換且無(wú)法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
  • 相關(guān)文件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

設(shè)計(jì)要求:

1.本設(shè)計(jì)基于STC89C51/52(與AT89S51/52、AT89C51/52通用,可任選)單片機(jī)

2.采用DS18B20溫度傳感器測(cè)溫(0-99.9°C),三極管驅(qū)動(dòng)數(shù)碼管顯示溫度和風(fēng)扇的檔位。

3.共3個(gè)按鍵:設(shè)置、加、減。按一下設(shè)置可以設(shè)置上限,再按下設(shè)置下限,均可以按鍵加減調(diào)整。

4.利用PWM調(diào)速,當(dāng)溫度低于下限時(shí),風(fēng)扇不轉(zhuǎn)動(dòng),當(dāng)溫度處于上、下限之間時(shí)1檔轉(zhuǎn)動(dòng)(50%的轉(zhuǎn)速),當(dāng)溫度超過(guò)上限時(shí),全速轉(zhuǎn)動(dòng)。

使用說(shuō)明: 一共3個(gè)按鍵:設(shè)置、加、減 按下設(shè)置鍵的時(shí)候才可以加減。 按一下設(shè)置鍵,是設(shè)置溫度的上限,再按下設(shè)置鍵,是設(shè)置溫度的下限,再按下設(shè)置鍵是退出并保存。

部分程序:

#include<reg51.h>

#include<intrins.h> //包含頭文件

#define uchar unsigned char

#define uint unsigned int //宏定義

#include "eeprom52.h"

sbit dj=P1^0;//電機(jī)控制端接口

sbit DQ=P1^6;//溫度傳感器接口

//按鍵接口/

sbit key1=P3^5;//設(shè)置溫度

sbit key2=P3^6;//溫度加

sbit key3=P3^7;//溫度減

//

sbit w1=P2^4;

sbit w2=P2^5;

sbit w3=P2^6;

sbit w4=P2^7; //數(shù)碼管的四個(gè)位

/共陰數(shù)碼管段選//

uchar table[22]=

{0x3F,0x06,0x5B,0x4F,0x66,

0x6D,0x7D,0x07,0x7F,0x6F,

0x77,0x7C,0x39,0x5E,0x79,0x71,

0x40,0x38,0x76,0x00,0xff,0x37};//'-',L,H,滅,全亮,n 16-21

uint wen_du; //溫度變量

uint shang,xia; //對(duì)比溫度暫存變量

uchar dang;//檔位顯示

uchar flag;

uchar d1,d2,d3;//顯示數(shù)據(jù)暫存變量

uchar m;

uchar js;

/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/

void write_eeprom()

{

SectorErase(0x2000); //清除扇區(qū)

byte_write(0x2000, shang); //寫(xiě)上限數(shù)值到扇區(qū)

byte_write(0x2001, xia); //寫(xiě)下限數(shù)值到扇區(qū)

byte_write(0x2060, a_a); //寫(xiě)初始變量到扇區(qū)指定位置

}

/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*****************/

void read_eeprom()

{

shang = byte_read(0x2000); //從扇區(qū)讀取上限數(shù)據(jù)

xia = byte_read(0x2001); //從扇區(qū)讀取下限數(shù)據(jù)

a_a = byte_read(0x2060); //從扇區(qū)讀取初始變量

}

/**************開(kāi)機(jī)自檢eeprom初始化*****************/

void init_eeprom()

{

read_eeprom(); //先讀扇區(qū)的數(shù)據(jù)

if(a_a != 1) //判斷是否是新單片機(jī)(原理:新的單片機(jī)扇區(qū)里的數(shù)據(jù)都是0,這里判斷是否不等于1。如果是不等于1,就是等于0,那就是新單片機(jī)了,就會(huì)執(zhí)行下面的上下限值初始化數(shù)值的語(yǔ)句,并讓a_a變成1,下次開(kāi)機(jī)就會(huì)知道是用過(guò)的單片機(jī)了就會(huì)讀取EEPROM里的上下限數(shù)據(jù)了)

{

shang = 30; //上限數(shù)值初始為30

xia = 20; //下限數(shù)值初始為20

a_a = 1; //初始值變量賦值1,下次開(kāi)機(jī)就會(huì)直接讀取EEPROM內(nèi)的上下限數(shù)據(jù)

write_eeprom(); //將初始的數(shù)據(jù)保存進(jìn)單片機(jī)的EEPROM

}

}

void delay(uint ms) //延時(shí)函數(shù),大約延時(shí)1ms

{

uchar x;

for(ms;ms>0;ms--)

for(x=121;x>0;x--);

}

/***********ds18b20延遲子函數(shù)(晶振12MHz )*******/

void delay_18B20(uint i)

{

while(i--);

}

/**********ds18b20初始化函數(shù)**********************/

void Init_DS18B20()

{

uchar x=0;

DQ=1; //DQ復(fù)位

delay_18B20(8); //稍做延時(shí)

DQ=0; //單片機(jī)將DQ拉低

delay_18B20(80); //精確延時(shí) 大于 480us

DQ=1; //拉高總線(xiàn)

delay_18B20(14);

x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗

delay_18B20(20);

}

/***********ds18b20讀一個(gè)字節(jié)**************/

uchar ReadOneChar()

{

uchar i=0;

uchar dat=0;

for (i=8;i>0;i--)

{

DQ=0; // 給脈沖信號(hào)

dat>>=1;

DQ=1; // 給脈沖信號(hào)

if(DQ)

dat|=0x80;

delay_18B20(4);

}

return(dat);

}

/*************ds18b20寫(xiě)一個(gè)字節(jié)****************/

void WriteOneChar(uchar dat)

{

uchar i=0;

for (i=8;i>0;i--)

{

DQ=0;

DQ=dat&0x01;

delay_18B20(5);

DQ=1;

dat>>=1;

}

}

/**************讀取ds18b20當(dāng)前溫度************/

void ReadTemperature()

{

uchar a=0;

uchar b=0;

uchar t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作

WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換

delay_18B20(100); // this message is wery important

Init_DS18B20();

WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作

WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度

delay_18B20(100);

a=ReadOneChar(); //讀取溫度值低位

b=ReadOneChar(); //讀取溫度值高位

wen_du=((b*256+a)>>4); //當(dāng)前采集溫度值除16得實(shí)際溫度值

}

void zi_keyscan()//自動(dòng)模式按鍵掃描函數(shù)

{

if(key1==0) //設(shè)置鍵按下

{

delay(80); //延時(shí)去抖

if(key1==0)

{

flag=1; //再次判斷按鍵,按下的話(huà)進(jìn)入設(shè)置狀態(tài)

while(key1==0);//松手檢測(cè) //按鍵釋放

}

}

while(flag==1) //進(jìn)入設(shè)置上限狀態(tài)

{

d1=18;d2=shang/10;d3=shang%10; //顯示字母H 和上限溫度值

?紛傳文章借鑒與此

  • 有需要資料的可了解一下.docx

相關(guān)推薦

電子產(chǎn)業(yè)圖譜