一、系統方案 1、本設計采用這51單片機作為主控器。 2、DS18B20采集溫度值送到液晶1602顯示。 3、按鍵設置報警值。 4、溫度控制風扇檔位。
二、硬件設計 原理圖如下:
三、單片機軟件設計 1、首先是系統初始化 /*******************T0初始化********************/ void init_t0() { //TMOD=0x01;//定時器0工作方式1 TH0=(65536-100)/256;//賦初值定時 TL0=(65536-100)%256;//0.01ms EA=1;//開總中斷 ET0=1;//開定時器0中斷 TR0=1;//啟動定時器0
SCON = 0X50; //UART方式1;8位UART REN = 1; //允許串行口接收數據 PCON = 0x00; //SMOD=0;波特率不加倍 TMOD = 0x21; //T1方式2,用于產生波特率 TH1 = 0xFD; //裝初值 TL1 = 0xFD; TR1 = 1; //啟動定時器1 EA = 1; //打開全局中斷控制 ES = 1; //打開串行口中斷
} 2、液晶顯示程序 /******************************************************************* 寫命令 ************************************************************************/ void xiemingling(unsigned char mingling) { en=0; rs=0; rw=0; P0=mingling; delayxms(5); en=1; delayxms(10); en=0; } /******************************************************************* 寫數據 ************************************************************************/ void xieshuju(unsigned char shuju) { en=0; rs=1; rw=0; P0=shuju; delayxms(5); en=1; delayxms(10); en=0; } /******************************************************************* 液晶初始化 ************************************************************************/ void chushihua() { en=0; xiemingling(0x38);//設置16*2顯示,5*7點陣,8位數據接口 delayxms(20); xiemingling(0x0c);//設置開顯示,不顯示光標 delayxms(20); xiemingling(0x06);//寫一個字符后地址指針加1 delayxms(20); xiemingling(0x01);//顯示清零,數據指針清零 delayxms(20); xiemingling(0x80);//指定字符顯示的實際地址,,,顯示位置的確定方法規定為"80H+地址碼x" delayxms(20); } /***********************lcd1602上顯示這字符函數************************/ void write_string(uchar hang,uchar add,uchar *p) { if(hang==1) xiemingling(0x80+add); else xiemingling(0x80+0x40+add); while(1) { if(*p == '\0') break; xieshuju(*p); p++; } } /***********************lcd1602上顯示2位十進制數************************/ void write_num2(uchar hang,uchar add,uint date) { if(hang==1) xiemingling(0x80+add); else xiemingling(0x80+0x40+add); xieshuju(0x30+date/10); xieshuju(0x30+date%10); } /***********************lcd1602上顯示1位十進制數************************/ void write_num1(uchar hang,uchar add,uint date) { if(hang==1) xiemingling(0x80+add); else xiemingling(0x80+0x40+add); xieshuju(0x30+date%10); } 3、DS18B20程序 /***************************初始化****************************************/ Init_DS18B20(void) { DQ = 1; //DQ復位 Delay(8); //稍做延時 DQ = 0; //將DQ拉低 Delay(90); //精確延時 大于 480us DQ = 1; //拉高總線 Delay(8); presence = DQ; //讀取存在信號 Delay(100); DQ = 1; return(presence); //返回信號,0=presence,1= no presence } /***************************讀一位****************************************/ uchar read_bit(void) { uchar i; DQ = 0; //將DQ 拉低開始讀時間隙 DQ = 1; // then return high for (i=0; i<3; i++); // 延時15μs return(DQ); // 返回 DQ 線上的電平值 } /***************************讀一個字節****************************************/ uchar ReadOneChar(void) { uchar i = 0; uchar dat = 0;
for (i=0;i<8;i++) { // 讀取字節,每次讀取一個字節 if(read_bit()) dat|=0x01<<i; // 然后將其左移
Delay(4); } return (dat); } /***************************寫一位****************************************/ void write_bit(uchar bitval) { DQ = 0; // 將DQ 拉低開始寫時間隙 if(bitval==1) DQ =1; // 如果寫1,DQ 返回高電平 Delay(5); // 在時間隙內保持電平值, DQ = 1; // Delay函數每次循環延時16μs,因此delay(5) = 104μs } /***************************寫一個字節****************************************/ void WriteOneChar(uchar dat) { uchar i = 0; uchar temp;
for (i=0; i<8; i++) // 寫入字節, 每次寫入一位 { temp = dat>>i; temp &= 0x01; write_bit(temp); } Delay(5); } /*------------------------------------------------ 單個DS18B20 讀取溫度 ------------------------------------------------*/ int ReadTemperature() { uchar a; uchar b; Init_DS18B20(); WriteOneChar(0xCC); // 跳過讀序號列號的操作 WriteOneChar(0x44); // 啟動溫度轉換 delayxms(10); Init_DS18B20(); WriteOneChar(0xCC); //跳過讀序號列號的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度 a = ReadOneChar(); //低位 b = ReadOneChar(); //高位 t = b; t <<= 8; t |= a;
if(t < 0) //溫度為負數 { flag_temp = 1; t -= 1; t = ~t; t = t * 0.0625;//溫度值擴大-倍,精確到-位小數 } else { flag_temp = 0; t = t * 0.0625;//溫度值擴大-倍,精確到-位小數 } return(t); } 4、核心算法程序 if(number==0) { /*根據溫度控制檔位*/ if(t<alarm) { dangwei = 0;
PWM1=0; TR0=0; pwm(0); //控制PWM輸出,進而控制電機的速度
} else if(t<alarm+5) { dangwei = 1;
TR0=1; pwm(20); //控制PWM輸出,進而控制電機的速度 } else if(t<alarm+10) { dangwei = 2;
TR0=1; pwm(50); //控制PWM輸出,進而控制電機的速度 } else { dangwei = 3;
TR0=1; pwm(99); //控制PWM輸出,進而控制電機的速度 } 四、 proteus仿真設計 Proteus軟件是一款應用比較廣泛的工具,它可以在沒有硬件平臺的基礎上通過自身的軟件仿真出硬件平臺的運行情況,這樣就可以通過軟件仿真來驗證我們設計的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達到我們設定的目的,避免我們搭建實物的時候,如果當初選擇的方案有問題,我們器件都已經焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費人力和物力,也給開發者帶來一定困惑,Proteus仿真軟件就很好的解決這個問題,我們在設計之初,就使用該軟件進行模擬仿真,測試,選擇滿足我們設計的最優方案。最后根據測試沒問題的仿真圖紙,焊接實物,調試,最終完成本設計的作品。
|