一、系統(tǒng)方案 本設(shè)計(jì)采用STC15單片機(jī)作為主控器,液晶1602顯示,DS18B20采集溫度,光敏電阻采集光照、按鍵設(shè)置溫度上下限,測量溫度小于下限,啟動加熱,測量溫度大于上限,啟動降溫。
1.jpg (5.25 KB, 下載次數(shù): 23)
下載附件
2023-11-5 16:36 上傳
二、硬件設(shè)計(jì) 原理圖如下:
2.jpg (59.94 KB, 下載次數(shù): 30)
下載附件
2023-11-5 16:36 上傳
三、單片機(jī)軟件設(shè)計(jì) 1、首先是系統(tǒng)初始化 uint count=0; uint16 TempPhoto; uint8 strPhoto[6]; uint wendu=0; P3M0 = 0x00; P3M1 = 0x00; lcd_init(); //LCD1602初始化 delay_ms(10); //初始化后延時(shí) DisplayListChar(0, 0, table1); //在LCD1602屏第一行顯示table1內(nèi)容 DisplayListChar(0, 1, table2); //在LCD1602屏第二行顯示table2內(nèi)容
InitADC(); InitUart(); //初始化串口 2、液晶顯示程序 /************************************** 功能描述:LCD1602寫命令函數(shù) 入口參數(shù)int8 com 返回值:無 ***************************************/ void lcd_wcom(uint8 com) { lcd1602_rs=0; //選擇指令寄存器 lcd1602_rw=0; //選擇寫 P0=com; //把命令字送入P0 delay_ms(1); //延時(shí)一小會兒,讓1602準(zhǔn)備接收數(shù)據(jù) lcd1602_en=1; //使能線電平變化,命令送入1602的8位數(shù)據(jù)口 lcd1602_en=0; }
/************************************** 功能描述:LCD1602寫數(shù)據(jù)函數(shù) 入口參數(shù):uint8 dat 返回值:無 ***************************************/ void lcd_wdat(uint8 dat) { lcd1602_rs=1; //選擇數(shù)據(jù)寄存器 lcd1602_rw=0; //選擇寫 P0=dat; //把要顯示的數(shù)據(jù)送入P0 delay_ms(1); //延時(shí)一小會兒,讓1602準(zhǔn)備接收數(shù)據(jù) lcd1602_en=1; //使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口 lcd1602_en=0; }
/************************************** 功能描述:LCD1602初始化函數(shù) 入口參數(shù):無 返回值:無 ***************************************/ void lcd_init(void) { lcd_wcom(0x38); //8位數(shù)據(jù),雙列,5*7字形 lcd_wcom(0x0c); //開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍 lcd_wcom(0x06); //顯示地址遞增,即寫一個(gè)數(shù)據(jù)后,顯示位置右移一位 lcd_wcom(0x01); //清屏 }
3、按鍵程序 void keyscan() //按鍵掃描 { if(K1==0) //功能鍵 { delayms(5); if(K1==0) { keyflag_1++; //鍵一按下,標(biāo)志位加1 if(keyflag_1>3) keyflag_1=0; lcd_init(); if( keyflag_1==0) { DisplayListChar(0, 0, table1); //在LCD1602屏第一行顯示table1內(nèi)容 DisplayListChar(0, 1, table2); //在LCD1602屏第二行顯示table2內(nèi)容 } 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) //進(jìn)入設(shè)置模式 { max++; if(max==100) max=0;
} if(keyflag_1==2) //進(jìn)入設(shè)置模式 { min++; if(min==100) min=0;
} while(!K2); //松手檢測 } } if(K3==0) //限值減鍵 { delayms(5); //按鍵消除抖動判斷 if(K3==0) {
if(keyflag_1==1) //進(jìn)入設(shè)置模式 { max--; if(max==0) max=99;
} if(keyflag_1==2) //進(jìn)入設(shè)置模式 { 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); //初始化后延時(shí) DisplayListChar(0, 0, table1); //在LCD1602屏第一行顯示table1內(nèi)容 DisplayListChar(0, 1, table2); //在LCD1602屏第二行顯示table2內(nèi)容
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數(shù)組清零 TempPhoto =GetADCResultint(1); //實(shí)時(shí)讀取P1.1通道的AD轉(zhuǎn)換結(jié)果 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; //個(gè)位
//在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屏第二行顯示個(gè)位值 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屏第二行顯示個(gè)位值
} 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屏第二行顯示個(gè)位值 }
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仿真設(shè)計(jì) Proteus軟件是一款應(yīng)用比較廣泛的工具,它可以在沒有硬件平臺的基礎(chǔ)上通過自身的軟件仿真出硬件平臺的運(yùn)行情況,這樣就可以通過軟件仿真來驗(yàn)證我們設(shè)計(jì)的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達(dá)到我們設(shè)定的目的,避免我們搭建實(shí)物的時(shí)候,如果當(dāng)初選擇的方案有問題,我們器件都已經(jīng)焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費(fèi)人力和物力,也給開發(fā)者帶來一定困惑,Proteus仿真軟件就很好的解決這個(gè)問題,我們在設(shè)計(jì)之初,就使用該軟件進(jìn)行模擬仿真,測試,選擇滿足我們設(shè)計(jì)的最優(yōu)方案。最后根據(jù)測試沒問題的仿真圖紙,焊接實(shí)物,調(diào)試,最終完成本設(shè)計(jì)的作品。
3.jpg (57.95 KB, 下載次數(shù): 24)
下載附件
2023-11-5 16:36 上傳
|