|
學(xué)期末需要一個(gè)課程設(shè)計(jì)做平時(shí)成績(jī)用
做了一個(gè)基于51單片機(jī)的筆記本散熱風(fēng)扇,做了兩天,雖然做的不好,但是供有需要的朋友學(xué)習(xí),包括仿真、源程序以及功能說(shuō)明!!
基于單片機(jī)的筆記本電腦的智能底座設(shè)計(jì)
1.需求分析
筆記本電腦,便于攜帶,而且它的功能滿足大多數(shù)人的需要,隨著技術(shù)的近步帶來(lái)的成本下降,筆記本的價(jià)格也為大多數(shù)人所接受。隨著使用筆記本人數(shù)的增加,筆記本的各種問(wèn)題也暴露出來(lái),其中散熱問(wèn)題至關(guān)重要,它不僅關(guān)系著能耗更關(guān)系著筆記本的使用壽命。因此散熱成為最關(guān)鍵的因素,有時(shí)筆記本電腦會(huì)莫名奇妙的死機(jī),一般就是系統(tǒng)溫度過(guò)高導(dǎo)致。為了解決這個(gè)問(wèn)題,設(shè)計(jì)散熱底座,可以使筆記本產(chǎn)生的熱量盡快的擴(kuò)散到電腦外部,不影響筆記本的使用功能,保證筆記本電腦的正常工作。
2.實(shí)現(xiàn)功能
(1)檢測(cè)實(shí)時(shí)的溫度,如果高于一個(gè)閥值電壓,就要啟動(dòng)散熱設(shè)備。
(2)溫度達(dá)到一定值時(shí),進(jìn)行報(bào)警。
(3)溫度讀取的同時(shí)發(fā)送至串口,單片機(jī)進(jìn)行同步處理。
(4)顯示溫度,并且可對(duì)散熱設(shè)備進(jìn)行控制。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序如下:
- #include<reg51.h>
- #include<intrins.h> //包含頭文件
- #define uchar unsigned char
- #define uint unsigned int //宏定義
- ////////////////////
- sbit dj=P1^0;//電機(jī)控制端接口
- sbit Ds=P1^6;//溫度傳感器接口
- sbit buzz=P1^7;//蜂鳴器接口
- //////////按鍵接口/////////////////////////////////
- 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 wd; //溫度變量
- uint shang,xia; //對(duì)比溫度暫存變量
- uchar s;//開(kāi)關(guān)顯示
- uchar flag;
- uchar d1,d2,d3;//顯示數(shù)據(jù)暫存變量
- void delay(uint ms) //延時(shí)函數(shù),大約延時(shí)25us
- {
- uchar x;
- for(ms;ms>0;ms--)
- for(x=10;x>0;x--);
- }
- /***********ds18b20延遲子函數(shù)(晶振12MHz )*******/
- void delay_18B20(uint i)
- {
- while(i--);
- }
- /**********ds18b20初始化函數(shù)**********************/
- void Init_DS18B20()
- {
- uchar x=0;
- Ds=1; //DQ復(fù)位
- delay_18B20(8); //稍做延時(shí)
- Ds=0; //單片機(jī)將DQ拉低
- delay_18B20(80); //精確延時(shí) 大于 480us
- Ds=1; //拉高總線
- delay_18B20(14);
- x=Ds; //稍做延時(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--)
- {
- Ds=0; // 給脈沖信號(hào)
- dat>>=1;
- Ds=1; // 給脈沖信號(hào)
- if(Ds)
- dat|=0x80;
- delay_18B20(4);
- }
- return(dat);
- }
- /*************ds18b20寫(xiě)一個(gè)字節(jié)****************/
- void WriteOneChar(uchar dat)
- {
- uchar i=0;
- for (i=8;i>0;i--)
- {
- Ds=0;
- Ds=dat&0x01;
- delay_18B20(5);
- Ds=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(); //讀取溫度值高位
- wd=((b*256+a)>>4); //當(dāng)前采集溫度值除16得實(shí)際溫度值
- }
- void display()//顯示溫度
- {
- w1=0;P0=table[d1];delay(10); //第1位
- P0=0x00;w1=1;delay(1);
-
- w2=0;P0=table[16];delay(10);//第2位
- P0=0x00;w2=1;delay(1);
- w3=0;P0=table[d2]; delay(10);//第3位
- P0=0x00;w3=1;delay(1);
- w4=0;P0=table[d3];delay(10);//第4位
- P0=0x00;w4=1;delay(1);
- }
- 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);//松手檢測(cè) //按鍵釋放
- }
- while(flag==1) //進(jìn)入設(shè)置上限狀態(tài)
- {
- d1=18;d2=shang/10;d3=shang%10; //顯示字母H 和上限溫度值
- display(); //調(diào)用顯示函數(shù)
- 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+=5; //上限加5
- if(shang>=100)shang=100; //上限最大加到100
- }while(key2==0);//松手檢測(cè)
- }
- if(key3==0) //減鍵按下
- {
- delay(30); //延時(shí)去抖
- if(key3==0) //減鍵按下
- {
- shang-=1; //上限減1
- if(shang<=10)shang=10; //上限最小減到10
- }while(key3==0);//松手檢測(cè)
- }
- }
- while(flag==2) //設(shè)置下限
- {
- d1=17;d2=xia/10;d3=xia%10; //顯示字母L 顯示下限溫度值
- display(); //以下注釋同上
- if(key1==0)
- {
- delay(30);
- if(key1==0)flag=0;
- while(key1==0);//松手檢測(cè)
- }
- if(key2==0)
- {
- delay(30);
- if(key2==0)
- {
- xia+=5;
- if(xia>=95)xia=95;
- }while(key2==0);//松手檢測(cè)
- }
- if(key3==0)
- {
- delay(30);
- if(key3==0)
- {
- xia-=1;
- if(xia<=0)xia=0;
- }while(key3==0);//松手檢測(cè)
- }
- }
- }
- void zi_dong()//自動(dòng)溫控模式
- {
- uchar i;
- d1=s;d2=wd/10;d3=wd%10; //顯示檔位,顯示當(dāng)前溫度值
- zi_keyscan();//按鍵掃描函數(shù)
- display(); //調(diào)用顯示函數(shù)
- if(wd<xia){dj=0;s=0;buzz=1;}//低于下限 檔位為0 電機(jī)停止
- if((wd>=xia)&&(wd<=shang))//溫度大于下限,小于上限 1擋
- {
- s=1;
- buzz=1; //檔位置1
- for(i=0;i<3;i++){dj=0;display();zi_keyscan();} //PWM通過(guò)延時(shí)得到
- for(i=0;i<6;i++){dj=1;display();zi_keyscan();}
- }
- if(wd>shang){dj=1;s=2;buzz=1;}//高溫全速
- if(wd>50){buzz=0;dj=1;s=2;}
- }
- void main() //主函數(shù)
- {
- uchar j;
- dj=0; //電機(jī)開(kāi)
- shang=40;
- xia=20; //初始上下限值
- for(j=0;j<150;j++) //先讀取溫度值,防止開(kāi)機(jī)顯示85
- ReadTemperature();
- while(1) //進(jìn)入while循環(huán)
- {
- ReadTemperature(); //讀取溫度值
- for(j=0;j<100;j++)zi_dong();//自動(dòng)溫控模式
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
基于單片機(jī)的筆記本電腦的智能底座設(shè)計(jì).rar
(103.72 KB, 下載次數(shù): 106)
2018-4-19 00:00 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|