一、系統方案 1、本設計采用51單片機作為主控器。 2、DS18B20采集溫度值送到液晶1602顯示。 3、按鍵設置上下限,自動模式,低于下限,風扇不啟動,下限到上限之間,風扇1檔,大于上限風扇2檔。 4、手動模式,按鍵控制檔位切換。 5、藍牙模式,手機APP控制檔位切換。
二、硬件設計 原理圖如下: 三、單片機軟件設計 1、首先是系統初始化
void lcd_init()//***液晶初始化函數**** { uchar a; write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據 write_1602com(0x0c);//開顯示不顯示光標 write_1602com(0x06);//整屏不移動,光標自動右移 write_1602com(0x01);//清顯示
write_1602com(0x80);//日歷顯示固定符號從第一行第1個位置之后開始顯示 for(a=0;a<16;a++) { write_1602dat(tab1[a]);//向液晶屏寫日歷顯示的固定符號部分 delay(3); } write_1602com(0x80+0x40);//時間顯示固定符號寫入位置,從第2個位置后開始顯示 for(a=0;a<16;a++) { write_1602dat(tab2[a]);//寫顯示時間固定符號,兩個冒號 delay(3); }
} 2、液晶顯示程序 void write_1602com(uchar com)//****液晶寫入指令函數**** { RS=0;//數據/指令選擇置為指令 rw=0; //讀寫選擇置為寫 LCD1602=com;//送入數據 delay(1); EN=1;//拉高使能端,為制造有效的下降沿做準備 delay(1); EN=0;//en由高變低,產生下降沿,液晶執行命令 }
void write_1602dat(uchar dat)//***液晶寫入數據函數**** { RS=1;//數據/指令選擇置為數據 rw=0; //讀寫選擇置為寫 LCD1602=dat;//送入數據 delay(1); EN=1; //en置高電平,為制造下降沿做準備 delay(1); EN=0; //en由高變低,產生下降沿,液晶執行命令 }
3、按鍵程序 void KEY() { //功能鍵 if(SET==0) {
delay(10); if(SET==0) { Mode++; if(Mode==3) Mode=0;
} while(SET==0) { if(Mode==0) { // write_1602com(0x80+0x40+6); write_1602com(0x0c); } else if(Mode==1) { write_1602com(0x80+0x40+4); write_1602com(0x0f); } else { write_1602com(0x80+0x40+13); write_1602com(0x0f); } } } //增加 if(ADD==0&&Mode==1) {
delay(10); if(ADD==0) { TH++; if(TH>=99) TH=99; write_1602com(0x80+0x40+3); write_1602dat(TH/10+0x30); write_1602dat(TH%10+0x30); write_1602com(0x80+0x40+4);
} while(ADD==0);
} //減少 if(DEC==0&&Mode==1) {
delay(10); if(DEC==0) { TH--; if(TH==TL) TH=TL+1; write_1602com(0x80+0x40+3); write_1602dat(TH/10+0x30); write_1602dat(TH%10+0x30); write_1602com(0x80+0x40+4);
} while(DEC==0); } if(ADD==0&&Mode==2) {
delay(10); if(ADD==0) { TL++; if(TL==TH) TL=TH-1; write_1602com(0x80+0x40+12); write_1602dat(TL/10+0x30); write_1602dat(TL%10+0x30); write_1602com(0x80+0x40+13);
} while(ADD==0);
} //減少 if(DEC==0&&Mode==2) {
delay(10); if(DEC==0) { TL--; if(TL<=0) TL=0; write_1602com(0x80+0x40+12); write_1602dat(TL/10+0x30); write_1602dat(TL%10+0x30); write_1602com(0x80+0x40+13);
} while(DEC==0); } //增加 if(key1==0) {
delay(10); if(key1==0) { //led=!led; number++; if(number>2) number=0; dangwei2 = 0; PWM2=1; TR0=0; pwm1(0); //控制PWM輸出,進而控制電機的速度 } while(key1==0);
} if(key2==0) {
delay(10); if(key2==0) { s1num++; if(s1num>2) s1num=0; } while(key2==0);
}
} 4、核心算法程序 if(number==0) { led1=1;led2=1; } if(number==1) { led1=0;led2=1; } if(number==2) { led1=1;led2=0; } if(number==1) { if(receiveData=='1') { dangwei2 = 1;
PWM2=0; TR0=1; pwm1(50); //控制PWM輸出,進而控制電機的速度 } if(receiveData=='2') { dangwei2 = 2;
PWM2=0; TR0=1; pwm1(100); //控制PWM輸出,進而控制電機的速度 } if(receiveData=='0') { dangwei2 = 0;
PWM2=1; TR0=0; pwm1(0); //控制PWM輸出,進而控制電機的速度 } } if(number==2) { if(s1num==1) { dangwei2 = 1;
PWM2=0; TR0=1; pwm1(50); //控制PWM輸出,進而控制電機的速度 } if(s1num==2) { dangwei2 = 2;
PWM2=0; TR0=1; pwm1(100); //控制PWM輸出,進而控制電機的速度 } if(s1num==0) { dangwei2 = 0;
PWM2=1; TR0=0; pwm1(0); //控制PWM輸出,進而控制電機的速度 } } 四、 proteus仿真設計 Proteus軟件是一款應用比較廣泛的工具,它可以在沒有硬件平臺的基礎上通過自身的軟件仿真出硬件平臺的運行情況,這樣就可以通過軟件仿真來驗證我們設計的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達到我們設定的目的,避免我們搭建實物的時候,如果當初選擇的方案有問題,我們器件都已經焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費人力和物力,也給開發者帶來一定困惑,Proteus仿真軟件就很好的解決這個問題,我們在設計之初,就使用該軟件進行模擬仿真,測試,選擇滿足我們設計的最優方案。最后根據測試沒問題的仿真圖紙,焊接實物,調試,最終完成本設計的作品。
|