標(biāo)題:
基于51單片機(jī)DS18B20溫度報(bào)警器代碼
[打印本頁]
作者:
YAKI27
時(shí)間:
2021-1-18 10:49
標(biāo)題:
基于51單片機(jī)DS18B20溫度報(bào)警器代碼
這個(gè)是我學(xué)習(xí)單片機(jī)制作的,代碼硬件參考多位作者,修修改改而成。代碼如有侵犯,請(qǐng)聯(lián)系本人,立即刪除。本作品僅供參考,學(xué)習(xí)。不喜勿噴,退出即可。
主要功能:
1. 基本工作量:電源部分、單片機(jī)最小系統(tǒng)、編程電路、溫度采集;
2. 顯示部分(顯示溫度值,保留一位小數(shù))
3. 串口通信(向上位機(jī)發(fā)送溫度值)
4. 繼電器控制(超過一定溫度值,繼電器閉合或者斷開)
5. 蜂鳴器報(bào)警(超過一定溫度值,繼電器閉合或者斷開)
單片機(jī)源程序如下:
#include <reg52.h>
#include "alarm.h"
void main()
{
do
{
temp=Temper();
}
while(temp==850); //因?yàn)镈S18B20上電之后會(huì)讀出來850,但不是溫度值,所以等待讀出溫度值
delay(1000);
H=byte_read(0x2000);
L=byte_read(0x2200);
if((H>99)||(L>99)||(L>=H)) //讀EEROM里面的數(shù)據(jù)
{
H=35;
L=16; //如果數(shù)據(jù)不對(duì),賦予初始值
}
TMOD=0x20|0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1; //設(shè)置定時(shí)器與中斷
SerialInit();
while(1)
{
key();
alarm();
Send_data();
}
}
復(fù)制代碼
#include "alarm.h"
uchar datas[4]={0,0,0,0};
uchar ms; //定時(shí)器0計(jì)數(shù)
char H,L; //用于設(shè)置上下限度 上下限度與要比較的數(shù)據(jù)類型最好相同
uchar flag; //狀態(tài)
int temp; //存儲(chǔ)讀出來的溫度,與H,L上下限度數(shù)據(jù)類型相同
uchar rtemp,sflag;
void delay(uint T)
{
while(T--);
}
void display()
{
if(flag==0&&temp>=0) //溫度為正數(shù)時(shí)執(zhí)行
{
if(temp>999) Nixietube(ss[temp/1000%10],ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
if(temp>99) Nixietube(0xff,ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
if(temp<99&&temp/100%10<=0) Nixietube(0xff,0xff,ss1[temp/10%10],ss[temp%10]);
}
if(flag==0&&temp<0) //溫度為負(fù)數(shù)時(shí)
{
if(temp*-1/100%10<=0) Nixietube(0xff,ss1[12],ss1[temp*-1/10%10],ss[temp*-1%10]);
if(temp*-1/100%10>0) Nixietube(ss1[12],ss[temp*-1/100%10],ss1[temp*-1/10%10],ss[temp*-1%10]);
}
if(flag==1) //flag==0顯示溫度 =1 顯示上限 =2 顯示下限
{
if(H>99) Nixietube(ss1[11],ss[H/100],ss[H%100/10],ss[H%10]); //溫度范圍是125~-55 ,當(dāng)上限值大于99時(shí)執(zhí)行
if(H>=10&&H<=99) Nixietube(ss1[11],0xff,ss[H/10],ss[H%10]); //當(dāng)上限值大于12小于99時(shí)執(zhí)行 不顯示最高位
if(H<10&&H>=0) Nixietube(ss1[11],0xff,0xff,ss[H%10]); //不顯示百位 十位
if(H<0&&H>=-9) Nixietube(ss1[11],0xff,ss1[12],ss[H*-1%10]); //設(shè)置的為負(fù)數(shù)且介于0~-9之間時(shí)執(zhí)行 不顯示十位
if(H<0&&H<-9) Nixietube(ss1[11],ss1[12],ss[H*-1%100/10],ss[H*-1%10]); //最低可以到55
}
if(flag==2) //同上
{
if(L>99) Nixietube(ss1[10],ss[L/100],ss[L%100/10],ss[L%10]);
if(L>=10&&L<=99) Nixietube(ss1[10],0xff,ss[L/10],ss[L%10]);
if(L<10&&L>=0) Nixietube(ss1[10],0xff,0xff,ss[L%10]);
if(L<0&&L>=-9) Nixietube(ss1[10],0xff,ss1[12],ss[L*-1%10]);
if(L<0&&L<-9) Nixietube(ss1[10],ss1[12],ss[L*-1%100/10],ss[L*-1%10]);
}
}
void key() //按鍵處理
{
if(!key1) //設(shè)置上限
{
delay(500);
if(!key1)
{
while(!key1);
if(flag==1)
{
if(H<125)H++;
SectorErase(0x2000); //每修改一次上下限數(shù)據(jù)就寫進(jìn)EEROM
byte_write(0x2000,H);
}
else if (flag==2)
{
if(L<H-1) L++; //原則是下限不超過上限
SectorErase(0x2200);
byte_write(0x2200,L);
}
}
}
if(!key2) //設(shè)置下限
{
delay(500);
if(!key2)
{
while(!key2);
if(flag==1)
{
if(H>L+1) H--; //原則上限不低于下限
SectorErase(0x2000); //每修改一次上下限數(shù)據(jù)就寫進(jìn)EEROM
byte_write(0x2000,H);
}
else if (flag==2)
{
if(L>-55)L--;
SectorErase(0x2200);
byte_write(0x2200,L);
}
}
}
if(!key3) //設(shè)置上限下限切換按鍵
{
delay(1000);
if(!key3)
{
while(!key3);
flag=(flag+1)%3;
}
}
}
void alarm() //報(bào)警
{
if(temp/10>=H||temp/10<=L) //超過上下限蜂鳴器報(bào)警 ,正常的LED燈關(guān)閉
{
beep_1=0;
}
else
{
beep_1=1;
} //正常情況下,蜂鳴器關(guān)閉
if(temp/10>=H) //上限,當(dāng)測(cè)得的值,大于等于設(shè)定值得時(shí)候,
{
led_0=0;
}
else
{
led_0=1;
}
if(temp/10<=L) //下限 當(dāng)實(shí)際值小于等于下限值時(shí)
{
led_2=0;
}
else
{
led_2=1;
}
}
//*************************************************
void TIMER_1() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256; //一次定時(shí)10MS 十進(jìn)制65536-50000=15536 折合十六進(jìn)制3cb0 高位3c低位b0
ms++;
display(); // 完全消影可以開啟這個(gè),屏蔽主函數(shù)大循環(huán)里的顯示函數(shù)
if(ms>100) //數(shù)據(jù)一秒刷新一次
{
ms=0;
temp=Temper(); //讀溫度
}
if(ms%5==0)
{
if(beep_1==0) //蜂鳴器設(shè)置
{
beep=!beep;
}
else
{
beep=1;
}
}
if(ms%7==0)
{
if(beep_1==0) //蜂鳴器設(shè)置
{
relay=!relay;
}
else
{
relay = 1;
}
}
}
void SerialInit()
{
TMOD=0x20|0x01; //工作模式2
TH1=0xfd;
TL1=0xfd;
TR1=1; //啟動(dòng)定時(shí)器1
SM0=0;
SM1=1;
REN=1; //允許接收
PCON=0x00; //關(guān)閉倍頻
ES=1; //開串口中斷
EA=1; //開總中斷
}
void SerialService() interrupt 4
{
if(RI==1)
{
RI = 0;
sflag = 1;
}
}
void Send_data()
{
datas[0] = temp%10000/1000;
datas[1] = temp%1000/100;
datas[2] = temp%100/10;
datas[3] = temp%10;
if(sflag==1)
{
ES = 0; //發(fā)送期間關(guān)閉串口中斷
sflag = 0;
if(temp<0)
{
SBUF = '-';
while(!TI);
TI = 0;
}
else
{
SBUF = '+';
while(!TI);
TI = 0;
}
SBUF = '0'+datas[0];
while(!TI);
TI = 0;
SBUF = '0'+datas[1];
while(!TI);
TI = 0;
SBUF = '0'+datas[2];
while(!TI);
TI = 0;
SBUF = '.';
while(!TI);
TI = 0;
SBUF = '0'+datas[3];
while(!TI);
TI = 0;
ES = 1;
}
}
復(fù)制代碼
所有資料51hei提供下載:
DS18B20.rar
(70.83 KB, 下載次數(shù): 50)
2021-1-18 10:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
基于51單片機(jī)溫度報(bào)警51hei設(shè)計(jì).pdf
(1.71 MB, 下載次數(shù): 35)
2021-1-18 10:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1