超聲波液位可控恒溫水浴系統(tǒng)
超聲波液位可控恒溫水浴系統(tǒng),超聲波,可控,恒溫,水浴,系統(tǒng)
超聲波液位可控恒溫水浴系統(tǒng)
733和諧宿舍隊(duì)
隊(duì)長:黃 姸
隊(duì)員:譚映彤
隊(duì)員:李美玲
二〇一四年五月
0
目錄
一、設(shè)計(jì)要求·····················································2
1.1 基本要求···················································2
1.2 擴(kuò)展要求···················································2
1.3 說明·······················································2
二、整體設(shè)計(jì)與創(chuàng)新·············································3
2.1 整體設(shè)計(jì)···················································3
2.2 創(chuàng)新功能···················································4
3、 方案比較······················································5
3.1 硬件方案···················································5
3.2 軟件方案···················································7
4、 設(shè)計(jì)與論證·················································10
電路圖及有關(guān)設(shè)計(jì)文件···········································10
5、 測試數(shù)據(jù)及測試結(jié)果分析··································14
5.1 測試方法與儀器············································14
5.2 測試數(shù)據(jù)及測試結(jié)果分析···································14
七、附錄························································15
一、設(shè)計(jì)要求
設(shè)計(jì)并制作出一個(gè)液位可調(diào),溫度可調(diào)的水浴系統(tǒng)。
容器形狀、材質(zhì)不限,高度不高于35cm,長寬不長于10cm,容積大于等于500ml。
在容器除頂面外的任意位置安裝半導(dǎo)體制冷器件(制冷片冷熱兩用),制冷片的外側(cè)面可加散熱片、小風(fēng)扇等加快熱交換的裝置。超聲波探頭安裝于容器底部,進(jìn)水口、出水口安裝位置不做要求。
1.1基本要求
1) 系統(tǒng)穩(wěn)定,有明顯溫控表現(xiàn),溫度可調(diào)節(jié)范圍為15℃~50℃(可寬于此范圍),最小設(shè)定分度為1℃。
2) 有明顯液位調(diào)控現(xiàn)象,液位可調(diào)范圍為15cm~30cm,最小設(shè)定分度為1cm。
3) 當(dāng)溫度或液位達(dá)到某一設(shè)定值并穩(wěn)定后,水溫的波動(dòng)控制在±2℃以內(nèi),液位的波動(dòng)控制在±1cm以內(nèi)。要求溫度或液位調(diào)控達(dá)到穩(wěn)定狀態(tài)時(shí),必須分別給出聲或光提示信號。
4) 在超調(diào)量<=10%的情況下,調(diào)節(jié)時(shí)間盡量短。
1.2擴(kuò)展要求
1) 溫度可調(diào)節(jié)范圍盡量寬;當(dāng)水溫達(dá)到某一設(shè)定值并穩(wěn)定后,其波動(dòng)控制在±1℃內(nèi)
2) 能記錄并實(shí)時(shí)顯示溫度和液位調(diào)節(jié)過程的曲線, 溫度顯示的誤差絕對值小于2℃,液位顯示的誤差絕對值小于1cm。
3) 在不影響以上水浴功能的情況下,增加必要器件(如小水泵等),改裝成水冷循環(huán)系統(tǒng),給外部發(fā)熱器件散熱。
1.3說明
1)系統(tǒng)電源可使用市售開關(guān)電源或者主辦方提供的學(xué)生電源。參賽隊(duì)亦可使用自制電源。
2)采用半導(dǎo)體致冷器件實(shí)現(xiàn)制冷或加熱(亦可通過向容器內(nèi)抽進(jìn)冷水降溫),如果單片功率不夠允許多片串聯(lián),最多不能超過3片。
3)測評時(shí),此題參賽者以5隊(duì)為一小組同時(shí)測評,可自帶檢測工具。測評時(shí),每隊(duì)注入相同體積熱水,測報(bào)當(dāng)前溫度后,先統(tǒng)一設(shè)定某一和較低溫度值制冷,同時(shí)向設(shè)定的某一較低液位調(diào)節(jié),再設(shè)定某一較高溫度值加熱,同時(shí)向設(shè)定的某一較高液位調(diào)節(jié)。
4)當(dāng)溫度或液位達(dá)到穩(wěn)定狀態(tài)的提示信號出現(xiàn)后立即檢測并記錄調(diào)控的溫度值和液位值,檢測時(shí)間延續(xù)120s,以記錄溫度波動(dòng)和液位波動(dòng)的最大值;能實(shí)時(shí)顯示溫度曲線或液位曲線的可直接記錄曲線。
5)超調(diào)量:輸出量的最大值減去穩(wěn)態(tài)值,所得之差與穩(wěn)態(tài)值之比的百分?jǐn)?shù)。
6)調(diào)節(jié)時(shí)間:響應(yīng)曲線達(dá)到并保持在偏離穩(wěn)態(tài)值±5%(或±2%)之內(nèi)所需要的最短時(shí)間。
7)以上液位值為超聲波探頭傳感器位置到液面位置的距離。
二、整體設(shè)計(jì)與創(chuàng)新
2.1整體設(shè)計(jì)
2.1.1超聲波液位可控恒溫水浴系統(tǒng)設(shè)計(jì)
超聲波液位可控恒溫水浴系統(tǒng)結(jié)構(gòu)圖如下:
提示部分:
1602液晶顯示
LED提示
蜂鳴器提示
Labview上位機(jī)監(jiān)控
開關(guān)電源
水冷循環(huán)系統(tǒng)
后臺處理:
DS18B20溫度傳感器
超聲波模塊
AT24C02掉電保護(hù)
MAX232串口通信
AT89C52
最小系統(tǒng)
繼電器控制:
進(jìn)水泵
出水泵
加熱片
制冷片
水箱:
(長*寬*高)
6cm*7cm*35cm
控制部分:
1*3鍵盤
根據(jù)題目要求,
1)水箱外形設(shè)計(jì)。
水箱設(shè)計(jì)為長6cm,寬7cm,高35cm。
2)溫度控制。
使用冷熱兩用的制冷片,一塊用來加熱,一塊用來制冷。制冷片外側(cè)加水冷循環(huán)系統(tǒng),用以散熱。
利用繼電器控制加熱片,制冷片的啟動(dòng)與停止。
使用DS18B20溫度傳感器測量當(dāng)前溫度。
3)液位控制。
在水箱靠上方安裝進(jìn)水泵,靠下方安裝出水泵。
利用繼電器控制進(jìn)水泵,出水泵的啟動(dòng)與停止。
使用超聲波模塊測量液位高度。
4)Labview上位機(jī)監(jiān)控。
為了能記錄并實(shí)時(shí)顯示溫度和液位調(diào)節(jié)過程的曲線,采用Lab view上位機(jī)監(jiān)控。
用芯片MAX232實(shí)現(xiàn)串口通信,使下位機(jī)單片機(jī)傳送數(shù)據(jù)給上位機(jī)Labview。
5)1*3按鍵控制。
按鍵1表示“確定”,按鍵2表示 “設(shè)定值加一”,按鍵3表示“設(shè)定值減一”。
6)提示部分。
1602液晶顯示當(dāng)前溫度temp,當(dāng)前液位S,期望溫度set_temp,期望液位set_S。提示當(dāng)前狀態(tài)HOT(加熱),COLD(降溫),ADD(加水),DRAW(出水),ON(確定),OFF(停止),OK(任務(wù)完成)。
LED有四個(gè),D2亮表示正在加熱,D3亮表示正在降溫,D4亮表示正在加水,D5亮表示正在出水。
當(dāng)?shù)竭_(dá)溫度或者液位的期望值時(shí),蜂鳴器會提示。
7)AT24C02掉電保護(hù)。
AT24C02實(shí)現(xiàn)掉電保護(hù)功能,當(dāng)溫度或液位調(diào)節(jié)過程中途停電,AT24C02會記錄掉電前所設(shè)定的期望值。待再次上電時(shí),程序會接著掉電前的狀態(tài)繼續(xù)進(jìn)行下去。
2.1.2超聲波液位可控恒溫水浴系統(tǒng)程序設(shè)計(jì)
程序設(shè)計(jì)結(jié)構(gòu)圖如下:
開始
測量當(dāng)前溫度temp
測量當(dāng)前液位S
設(shè)定期望溫度set_temp
設(shè)定期望液位set_S
NO
set_S-0.50x19) //若到達(dá)字串尾則退出
{
if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //顯示單個(gè)字符
ListLength++;
X++;
}
}
}
/***********************************DS18B20***********************************/
void dsInit()
{ uint i; // DS18B20初始化
ds = 0;
i = 100;
while(i>0) i--;
ds = 1;
i = 4;
while(i>0) i--;
}
void dsWait()
{
uint i;
while(ds);
while(~ds);
i = 4;
while(i > 0) i--;
}
bit readBit()//讀一位數(shù)據(jù)
{
uint i;
bit b;
ds = 0;i++;
ds = 1; i++; i++;
b = ds;
i = 8;
while(i>0) i--;
return b;
}
uchar readByte()
{
uint i;
uchar j, dat;
dat = 0;
for(i=0; i<8; i++)
{
j = readBit();
dat = (j << 7) | (dat >> 1);
}
return dat;
}
void writeByte(uchar dat)
{
uint i;
uchar j;
bit b;
for(j = 0; j < 8; j++)
{
b = dat & 0x01;
dat >>= 1;
if(b) //寫1
{
ds = 0;i++; i++;
ds = 1;
i = 8;
while(i>0) i--;
}
else //寫0
{
ds = 0;
i = 8; while(i>0) i--;
ds = 1;
i++; i++;
}
}
}
void sendChangeCmd()
{
dsInit();
dsWait();
delayMs(1);
writeByte(0xcc);
writeByte(0x44);
}
void sendReadCmd()
{
dsInit();
dsWait();
delayMs(1);
writeByte(0xcc);
writeByte(0xbe);
}
void getTmpValue()
{
uint tmpvalue;
//int value;
float t;
uchar low, high;
sendReadCmd();
low = readByte(); //讀低八位
high = readByte();//讀高八位
tmpvalue = high;
tmpvalue <<= 8;
tmpvalue |= low;
t = tmpvalue * 0.0625;
tmpvalue = t*10+ 0.5; //大于0加0.5, 小于0減0.5
ES=0;TI=1;
printf("%f\n",t);
while(!TI);
TI=0;ES=1;
temp=tmpvalue*0.1;
DisplayListChar(0, 0, "T:");
DisplayListChar(6, 0, "C");
//if(jdq_hot==1&&jdq_cold==1)
disbuff[3] = tmpvalue / 100;
disbuff[4] = tmpvalue %100/10;
disbuff[5] = tmpvalue%10;
DisplayOneChar(2, 0, ASCII[disbuff[3]]);
DisplayOneChar(3, 0, ASCII[disbuff[4]]);
DisplayOneChar(4, 0, ASCII[10]);
DisplayOneChar(5, 0, ASCII[disbuff[5]]);
/* if(tmpvalue<51&&tmpvalue>14){beep=1;}
else
{beep=0;
//DisplayListChar(5, 0, "--");
}*/
}
void changeT(int p)
{if(p<51&&p>14)//調(diào)節(jié)范圍:15-50
{setT[2]=p/10;
setT[3]=p%10;
//DisplayListChar(8, 0, "+");
DisplayOneChar(9, 0, ASCII[setT[2]]);
DisplayOneChar(10, 0, ASCII[setT[3]]);
}
else if(p<15){set_temp=14;DisplayListChar(9, 0, "14");}
else if(p>50){set_temp=50;DisplayListChar(9, 0, "50");}
}
/***********************************超聲波***********************************/
void Conut()
{int SS;
time=TH0*256+TL0;
TH0=0;
TL0=0;
ES=0;TI=1;
//SS=(time*1.7)/10;
//SS=325-SS; //1.7 ,算出來是CM
S=33.0- (time*1.78)/100;
SS=(int)(S*10.0);
printf("%f\n",S);
while(!TI);
TI=0;ES=1;
//if(S<14||S>30){beep=0;}
//else{beep=1;}
//set_S=S;
DisplayListChar(0, 1, "H:");
DisplayListChar(6, 1, "CM");
if(flag==1) //超出測量范圍顯示
{
flag=0;
//printf("-----\n");
//beep=0;
}
else if(jdq_add==1&&jdq_draw==1){
disbuff[0]=SS/100;
disbuff[1]=SS%100/10;//0/10;
disbuff[2]=SS%10;
DisplayOneChar(2, 1, ASCII[disbuff[0]]);
DisplayOneChar(3, 1, ASCII[disbuff[1]]);
DisplayOneChar(4, 1, ASCII[10]);
DisplayOneChar(5, 1, ASCII[disbuff[2]]);
}
}
void changeS(int p)
{if(p<31&&p>13)//調(diào)節(jié)范圍:14-30
{setT[0]=p/10;
setT[1]=p%10;
DisplayOneChar(9, 1, ASCII[setT[0]]);
DisplayOneChar(10, 1, ASCII[setT[1]]);
}
else if(p<14){set_S=14;DisplayListChar(9, 1, "14");}
else if(p>30){set_S=30;DisplayListChar(9, 1, "30");}
}
void StartModule() //啟動(dòng)模塊
{
TX=1; //啟動(dòng)一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
/***************************鍵盤control***************************/
int keyscan(int goal)//鍵盤掃描
{ if(up==0)
{delayMs(10);
if(up==0)
{goal++;
while(!up);
}
}
if(down==0)
{delayMs(10);
if(down==0)
{goal--;
while(!down);
}
}
return goal;
}
int stateT()//按鍵確定命令
{ int com=1;
if(on==0)
{delayMs(10);
if(on==0)
{com=0;
while(!on);
}
}
return com;
}
/******************************check***************************************/
void checkT()
{sendChangeCmd();
delayMs(1000); //溫度轉(zhuǎn)換時(shí)間需要750ms以上
getTmpValue();
}
void checkS()
{uint i;
//ET0=1;
//TR0=0;
for(i=5;i>0;i--){
StartModule();//啟動(dòng)模塊
while(!RX); //當(dāng)RX為零時(shí)等待
TR0=1; //開啟計(jì)數(shù)
while(RX); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
Conut(); //計(jì)算
delayMs(80);} //80MS
//ET0=0;
//TR0=0;
}
void main()
{ sendChangeCmd();
init(); //LCM初始化
TMOD=0x21; //設(shè)T0為方式1T1為方式2,GATE=1;
// SCON=0x50;
TH1=0xFD;//串口波特率9600
TL1=0xFD;
TH0=0;
TL0=0;
TR0=1;
ET0=1; //允許T0中斷
TR1=1; //開啟定時(shí)器
SM0=0;
SM1=1;
REN=1;
EA=1; //開啟總中斷
ES=1;
while(1)
{ //S=0;
checkT();
set_temp=(int)(temp+0.5);
checkS();
changeT(set_temp);
//set_S=20;
set_S=(int)(S+0.5);
changeS(set_S);
DisplayListChar(12, 0, "OFF&");
DisplayListChar(12, 1, "OFF");
do
{changeT(set_temp);
set_temp=keyscan(set_temp);
}while(stateT());
DisplayListChar(12, 0, "ON ");
DisplayListChar(12, 1, "OFF&");
do
{changeS(set_S);
set_S=keyscan(set_S);
}while(stateT());
DisplayListChar(12, 1, "ON ");
//checkS();
if((set_S-S>1.0)||(S-set_S>1.0))
{compareS();
}
checkS();
delayMs(1000);
checkT();
while(1)
{ float tmp = fabs(set_temp+0.0-temp);
if(tmp>0.7)
{compareT();}
checkT();
}
}
}
26
收藏