一、系統方案 本設計采用STC15單片機作為主控器,液晶1602顯示,DS18B20采集溫度,光敏電阻采集光照、按鍵設置溫度上下限,測量溫度小于下限,啟動加熱,測量溫度大于上限,啟動降溫。
二、硬件設計 原理圖如下: 三、單片機軟件設計 1、首先是系統初始化 uint count=0; uint16 TempPhoto; uint8 strPhoto[6]; uint wendu=0; P3M0 = 0x00; P3M1 = 0x00; lcd_init(); //LCD1602初始化 delay_ms(10); //初始化后延時 DisplayListChar(0, 0, table1); //在LCD1602屏第一行顯示table1內容 DisplayListChar(0, 1, table2); //在LCD1602屏第二行顯示table2內容
InitADC(); InitUart(); //初始化串口 2、液晶顯示程序 /************************************** 功能描述:LCD1602寫命令函數 入口參數int8 com 返回值:無 ***************************************/ void lcd_wcom(uint8 com) { lcd1602_rs=0; //選擇指令寄存器 lcd1602_rw=0; //選擇寫 P0=com; //把命令字送入P0 delay_ms(1); //延時一小會兒,讓1602準備接收數據 lcd1602_en=1; //使能線電平變化,命令送入1602的8位數據口 lcd1602_en=0; }
/************************************** 功能描述:LCD1602寫數據函數 入口參數:uint8 dat 返回值:無 ***************************************/ void lcd_wdat(uint8 dat) { lcd1602_rs=1; //選擇數據寄存器 lcd1602_rw=0; //選擇寫 P0=dat; //把要顯示的數據送入P0 delay_ms(1); //延時一小會兒,讓1602準備接收數據 lcd1602_en=1; //使能線電平變化,數據送入1602的8位數據口 lcd1602_en=0; }
/************************************** 功能描述:LCD1602初始化函數 入口參數:無 返回值:無 ***************************************/ void lcd_init(void) { lcd_wcom(0x38); //8位數據,雙列,5*7字形 lcd_wcom(0x0c); //開啟顯示屏,關光標,光標不閃爍 lcd_wcom(0x06); //顯示地址遞增,即寫一個數據后,顯示位置右移一位 lcd_wcom(0x01); //清屏 }
3、按鍵程序 void keyscan() //按鍵掃描 { if(K1==0) //功能鍵 { delayms(5); if(K1==0) { keyflag_1++; //鍵一按下,標志位加1 if(keyflag_1>3) keyflag_1=0; lcd_init(); if( keyflag_1==0) { DisplayListChar(0, 0, table1); //在LCD1602屏第一行顯示table1內容 DisplayListChar(0, 1, table2); //在LCD1602屏第二行顯示table2內容 } if( keyflag_1==1) { DisplayListChar(0, 0, " SET TEMP HIGH");
} if( keyflag_1==2) { DisplayListChar(0, 0, " SET TEMP LOW");
} while(!K1); } }
if(keyflag_1!=0) { if(K2==0) //限值加鍵 { delayms(5); //按鍵消除抖動判斷 if(K2==0) {
if(keyflag_1==1) //進入設置模式 { max++; if(max==100) max=0;
} if(keyflag_1==2) //進入設置模式 { min++; if(min==100) min=0;
} while(!K2); //松手檢測 } } if(K3==0) //限值減鍵 { delayms(5); //按鍵消除抖動判斷 if(K3==0) {
if(keyflag_1==1) //進入設置模式 { max--; if(max==0) max=99;
} if(keyflag_1==2) //進入設置模式 { min--; if(min==0) min=99;
}
while(!K3); //松手檢測 } } } } /*** 4、核心算法程序 int main(void) { uint count=0; uint16 TempPhoto; uint8 strPhoto[6]; uint wendu=0; P3M0 = 0x00; P3M1 = 0x00; lcd_init(); //LCD1602初始化 delay_ms(10); //初始化后延時 DisplayListChar(0, 0, table1); //在LCD1602屏第一行顯示table1內容 DisplayListChar(0, 1, table2); //在LCD1602屏第二行顯示table2內容
InitADC(); InitUart(); //初始化串口 Init_DS18B20();
while (1) { keyscan(); if(keyflag_1==0) { count++; if(count>10)//讀取溫度值 {
wendu=ReadTemperature(); count=0; } Disp_Temperature(wendu) ; memset(strPhoto, 0, sizeof(strPhoto)); //strTemp數組清零 TempPhoto =GetADCResultint(1); //實時讀取P1.1通道的AD轉換結果 TempPhoto=TempPhoto*5.0*20/1023;
strPhoto[0] = TempPhoto/1000+48; //千位 strPhoto[1] = (TempPhoto%1000)/100+48; //百位 strPhoto[2] = (TempPhoto%1000)%100/10+48; //十位
strPhoto[3] = (TempPhoto%10)+48; //個位
//在LCD1602上顯示 DisplayOneChar(6, 0, strPhoto[0]); //在LCD1602屏第二行顯示千位值 DisplayOneChar(7,0, strPhoto[1]); //在LCD1602屏第二行顯示百位值 DisplayOneChar(8, 0, strPhoto[2]); //在LCD1602屏第二行顯示十位值 DisplayOneChar(9, 0, strPhoto[3]); //在LCD1602屏第二行顯示個位值 DisplayOneChar(10,0,'l'); DisplayOneChar(11,0,'u'); DisplayOneChar(12,0,'x');
} if(keyflag_1==1) { DisplayOneChar(6, 1, max/100+0x30); //在LCD1602屏第二行顯示百位值 DisplayOneChar(7,1, max%100/10+0x30); //在LCD1602屏第二行顯示十位值 DisplayOneChar(8, 1, max%10+0x30); //在LCD1602屏第二行顯示個位值
} if(keyflag_1==2) { DisplayOneChar(6, 1, min/100+0x30); //在LCD1602屏第二行顯示百位值 DisplayOneChar(7,1, min%100/10+0x30); //在LCD1602屏第二行顯示十位值 DisplayOneChar(8, 1, min%10+0x30); //在LCD1602屏第二行顯示個位值 }
SendString("guangz:"); SendData( strPhoto[0]);//顯示濕度值 SendData( strPhoto[1]); SendData( strPhoto[2]); SendData( strPhoto[3]); SendData( 'l'); SendData( 'u'); SendData( 'x'); SendData( 0x0d); SendData( 0x0a);
} } 四、 proteus仿真設計 Proteus軟件是一款應用比較廣泛的工具,它可以在沒有硬件平臺的基礎上通過自身的軟件仿真出硬件平臺的運行情況,這樣就可以通過軟件仿真來驗證我們設計的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達到我們設定的目的,避免我們搭建實物的時候,如果當初選擇的方案有問題,我們器件都已經焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費人力和物力,也給開發者帶來一定困惑,Proteus仿真軟件就很好的解決這個問題,我們在設計之初,就使用該軟件進行模擬仿真,測試,選擇滿足我們設計的最優方案。最后根據測試沒問題的仿真圖紙,焊接實物,調試,最終完成本設計的作品。
|