設(shè)計任務(wù)及要求
設(shè)計任務(wù):
以51單片機(jī)為核心,設(shè)計和制作一個溫度報警器,能在LCD上顯示環(huán)境的溫度與希望溫度上下限閥值,并能設(shè)置希望溫度上下限閥值,系統(tǒng)上電的時候顯示的是當(dāng)前環(huán)境溫度和設(shè)定的溫度閥值,通過按鍵來修改溫度上下限閥值,再次上電時保持上一次的溫度設(shè)置。根據(jù)溫度傳感器測得的溫度做如下處理:溫度當(dāng)溫度低于設(shè)定下限溫度時,蜂鳴器發(fā)出報警聲和綠光報警,并且通過繼電器控制加熱設(shè)備提升溫度至正常溫度,然后加熱設(shè)備停止工作;當(dāng)溫度高于設(shè)定上限溫度時,蜂鳴器發(fā)出報警聲和紅光報警,并且通過繼電器控制散熱設(shè)備降低溫度至正常溫度,然后散熱設(shè)備停止工作。
設(shè)計要求:
(1)確定系統(tǒng)設(shè)計方案;
(2)進(jìn)行系統(tǒng)的硬件設(shè)計;
(3)完成應(yīng)用程序設(shè)計;
(4)應(yīng)用系統(tǒng)的硬件和軟件的調(diào)試;
硬件原理圖
部分程序代碼
main.c文章來源:http://www.zghlxwxcb.cn/news/detail-503639.html
#include "public.h"
#include "lcd.h"
#include "temp.h"
#include "i2c.h"
sbit k3=P3^2; //設(shè)置溫度上下限
sbit k1=P3^4; //加
sbit k2=P3^5; //減
sbit ledL=P1^0;
sbit ledH=P1^1;
sbit led=P2^4; //電源指示燈
sbit beep=P1^5; //蜂鳴器報警
sbit relay=P1^4; //加熱或散熱設(shè)備
char set_templ=22,set_temph=40; //設(shè)定溫度上下限默認(rèn)值
u16 temp_val; //檢測的實(shí)際溫度
u8 mode; //溫度模式
void Temp_DataPros()
{
short temp;
u8 temp_buf[5];
temp=Ds18b20ReadTemp();
temp_val=temp;
if(temp<0)
{
temp=-temp;
LCD_Dispstring(2+5,0,"-");
}
else
{
LCD_Dispstring(2+5,0," ");
}
temp_buf[0]=temp/100+0x30;
temp_buf[1]=temp%100/10+0x30;
temp_buf[2]='.';
temp_buf[3]=temp%100%10+0x30;
temp_buf[4]='\0';
LCD_Dispstring(2+6,0,temp_buf); //顯示檢測的溫度xx.x
temp_buf[0]=set_temph/10+0x30;
temp_buf[1]=set_temph%10+0x30;
temp_buf[2]='\0';
LCD_Dispstring(5,1,temp_buf); //顯示設(shè)定的溫度上限值xx
temp_buf[0]=set_templ/10+0x30;
temp_buf[1]=set_templ%10+0x30;
temp_buf[2]='\0';
LCD_Dispstring(14,1,temp_buf); //顯示設(shè)定的溫度下限值xx
}
#define K1_MODE 1
#define K2_ADD 2
#define K3_DEC 3
//mode: 0-單次掃描 1-連續(xù)掃描
u8 KEY_Scan(u8 mode)
{
static u8 key=1;
if(key&&(k1==0||k2==0||k3==0))
{
delay(1000); //消抖
key=0;
if(k3==0)
{
return K1_MODE;
}
else if(k1==0)
{
return K2_ADD;
}
else if(k2==0)
{
return K3_DEC;
}
}
else if(k1==1&&k2==1&&k3==1)
{
key=1;
}
if(mode)
{
key=1;
}
return 0;
}
void KEY_Pros()
{
u8 key;
u8 temph_buf[3];
key=KEY_Scan(0);
if(key==K1_MODE) //模式選擇
{
mode++;
LCD_Clear();
if(mode==1)
{
LCD_Dispstring(0,0,"SETH: C");
}
else if(mode==2)
{
LCD_Dispstring(0,1,"SETL: C");
}
else
{
mode=0;
LCD_Dispstring(2,0,"Temp: C");
LCD_Dispstring(0,1,"SETH: ");
LCD_Dispstring(9,1,"SETL: ");
}
}
if(mode==1) //溫度上限設(shè)置
{
switch(key)
{
case K2_ADD: //加
set_temph++;
if(set_temph>=80)set_temph=80;
break;
case K3_DEC: //減
set_temph--;
if(set_temph<=0)set_temph=0;
break;
}
temph_buf[0]=set_temph/10+0x30;
temph_buf[1]=set_temph%10+0x30;
temph_buf[2]='\0';
LCD_Dispstring(6,0,temph_buf);
At24c02Write(0,set_temph);
}
else if(mode==2) //溫度下限設(shè)置
{
switch(key)
{
case K2_ADD: //加
set_templ++;
if(set_templ>=80)set_templ=80;
break;
case K3_DEC: //減
set_templ--;
if(set_templ<=0)set_templ=0;
break;
}
temph_buf[0]=set_templ/10+0x30;
temph_buf[1]=set_templ%10+0x30;
temph_buf[2]='\0';
LCD_Dispstring(6,1,temph_buf);
At24c02Write(2,set_templ);
}
}
void sound()
{
u8 i=50;
while(i--)
{
beep=!beep;
delay(10);
}
}
void TempData_Compare()
{
if(temp_val>set_temph*10) //實(shí)際溫度高于上限值 報警
{
relay=0;
ledH=0;
ledL=1;
sound();
}
else if(temp_val<set_templ*10) //實(shí)際溫度低于下限值 報警
{
relay=0;
ledH=1;
ledL=0;
sound();
}
else //實(shí)際溫度在下限值和上限值之間 取消報警 取消加熱 取消散熱
{
ledH=1;
ledL=1;
relay=1;
}
}
void kai_display()
{
if(At24c02Read(255)!=18)
{
At24c02Write(0,set_temph);
At24c02Write(2,set_templ);
At24c02Write(255,18);
}
else
{
set_temph=At24c02Read(0);
set_templ=At24c02Read(2);
}
LCD_Dispstring(2,0,"Temp: C");
LCD_Dispstring(0,1,"SETH: ");
LCD_Dispstring(9,1,"SETL: ");
}
void main()
{
ledH=1;
ledL=1;
relay=1;
led=0;
LCD_Init();
kai_display();
while(1)
{
if(mode==0)
Temp_DataPros();
KEY_Pros();
TempData_Compare();
}
}
如需具體工程代碼可評論區(qū)留言文章來源地址http://www.zghlxwxcb.cn/news/detail-503639.html
到了這里,關(guān)于基于51單片機(jī)的溫度報警器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!