導航:首頁 > 操作系統 > 基於對單片機的溫度報警器

基於對單片機的溫度報警器

發布時間:2022-05-21 06:05:02

Ⅰ 基於單片機的數字報警溫度計

按你的要求設計了程序並且通過ProteUS模擬
無償提供原理圖,ProteUS模擬工程(可運行),供參考運行效果,及原理圖的設計。
推薦:01 基於單片機的數字報警溫度計( <a href="http://ishare.iask.sina.com.cn/f/11655563.html" target="_blank">http://ishare.iask.sina.com.cn/f/11655563.html</a> )

; 源程序為匯編
; 實時顯示溫度
; 高於高限,低於低限,進行聲光報警
; 溫度高低限可自由設定

; 上電顯示 543210
; 讀出溫度後實時顯示溫度
; 溫度高於上限溫度時,顯示"HH****", 並進行聲光報警
; 溫度低於下限溫度時,顯示"LL****", 並進行聲光報警
; 設定鍵 進行高低限設定 循環為 "實時溫度" 「L ***」 「H ***」
; 可用 -鍵進行修改報警值

Ⅱ 基於單片機at89c51溫度感測器ds18b20的溫度報警器,求程序和模擬圖。

你好!

你沒有說明具體功能要求:

ds18b20感測器用幾個?

顯示用數碼管或液晶?

報警是分上下限報警?

溫度感測器

Ⅲ 基於單片機C51的溫度報警器,主要是報警值可調的程序(需兩個按鍵,一個上調,一個下調)這個實驗的程序嗎

bb

Ⅳ 單片機溫度報警器沒有超值也報警

溫度報警器就是需要溫度感測器不停地對監控的對象進行檢測
單片機報警模塊是指的主要功能部分採用成品的模塊,所以比較容易製作。單片機報警模塊有遙控設定防盜、遙控關閉防盜自動鎖定引擎和防搶劫等功能。單片機報警模塊電源接通後按動遙控器防盜設定鍵A鍵,HY988A I/O端輸出跳變高電平經D3使T3導通HY-5高響度喇叭發聲作為回應信號。單片機報警模塊輸出端輸出高電平經R1為T1提供基電流,這時如果HY966受到輕微震動,其輸出端輸出高電平脈沖使T1導通。單片機報警模塊T1的導通使C1瞬間充電至+5V左右,此電壓高於比較器參考電壓,比較器反轉輸出高電平經 A1B 緩沖後驅動繼電器吸合、HY-5喇叭報警。單片機報警模塊此後如 HY966 不在受到震動C1經R4緩慢放電,當C1上的電壓放電至低於比較器參考電壓時,比較器反轉輸出低電平,繼電器釋放、報警停止,繼續警戒狀態。

Ⅳ 溫度報警器,用單片機實現,溫度范圍有用戶設定,要顯現出來並與實時溫度相比較進行報警, 怎麼實現呢

用18b20溫濕度檢測溫度的值,,然後和你設定的溫度值比較,如果超出了范圍就用給蜂鳴器賦值,觸發報警。。。

Ⅵ 用51單片機實現溫度報警器的程序,要正確的

/*使用舉例:數碼管
scan()
{
char k;
for(k=0;k<4;k++) //4位LED掃描控制
{
discan=0x00;
Disdata=dis_7[_1820display[k]]; //數據顯示
if (k==1){DIN=0;} //小數點顯示
discan=scan_con[k]; //位選
_18B20_delay(100);
}
}
main()
_18B20_init();//18B20初始化
while(1)
{
EA=0;//在利用18B20測試溫度時,要嚴格遵循時序,禁止一切中斷
_18B20_work(_18B20_read()); //處理溫度數據
EA=1;//測試完畢,恢復系統中斷
scan(); //顯示溫度值
}
*/
#include "intrins.h" //_nop_();延時函數用
//*****************//
//以下是DS18B20驅動程序
//*****************//
/**************************************************
** 功能描述: DS18B20驅動程序,使用12M晶體
** DQ佔用引腳資源P1^7
****************************************************/sbit DQ=P1^7; //溫度輸入口unsigned char data temp_data[2]={0x00,0x00}; //讀出溫度暫放
unsigned char data _1820display[5]={0x00,0x00,0x00,0x00,0x00}; //顯示單元數據,共4個數據和一個運算暫用
unsigned int temp;
//**************溫度小數部分用查表法***********//
unsigned char code ditab[16]=
{
0x00,0x01,0x01,0x02,
0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,
0x08,0x08,0x09,0x09
};/*****************11us延時函數*************************/
//
void _18B20_delay(unsigned int t)
{
for (;t>0;t--);
}/****************DS18B20復位函數************************/
_18B20_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;
_nop_();_nop_();//從高拉倒低
DQ=0;
_18B20_delay(50); //550 us
DQ=1;
_18B20_delay(6); //66 us
presence=DQ; //presence=0 復位成功,繼續下一步
}
_18B20_delay(45); //延時500 us
presence=~DQ;
}
DQ=1; //拉高電平
}/****************DS18B20寫命令函數************************/
//向1-WIRE 匯流排上寫1個位元組
void _18B20_write(unsigned char val)
{
unsigned char i;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();_nop_(); //從高拉倒低
DQ=0;
_nop_();_nop_();_nop_();_nop_(); //5 us
DQ=val&0x01; //最低位移出
_18B20_delay(6); //66 us
val=val/2; //右移1位
}
DQ=1;
_18B20_delay(1);
}/****************DS18B20讀1位元組函數************************/
//從匯流排上取1個位元組
unsigned char _18B20read_byte(void)
{
unsigned char i;
unsigned char value=0;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();_nop_(); //從高拉倒低
value>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_(); //4 us
DQ=1;
_nop_();_nop_();_nop_();_nop_(); //4 us
if(DQ)value|=0x80;
_18B20_delay(6); //66 us
}
DQ=1;
return(value);
}
_18B20_read() //讀出溫度函數
{
_18B20_reset(); //匯流排復位
_18B20_delay(200);
_18B20_write(0xcc); //發命令
_18B20_write(0x44); //發轉換命令
_18B20_reset();
_18B20_delay(1);
_18B20_write(0xcc); //發命令
_18B20_write(0xbe);
temp_data[0]=_18B20read_byte(); //讀溫度值的低位元組
temp_data[1]=_18B20read_byte(); //讀溫度值的高位元組
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 兩位元組合成一個整型變數。
return temp; //返回溫度值
}/****************溫度數據處理函數************************///二進制高位元組的低半位元組和低位元組的高半位元組組成一位元組,這個
//位元組的二進制轉換為十進制後,就是溫度值的百、十、個位值,而剩
//下的低位元組的低半位元組轉化成十進制後,就是溫度值的小數部分/********************************************************/
_18B20_work(unsigned int tem)
{
unsigned char n=0;
if(tem>6348) // 溫度值正負判斷
{
tem=65536-tem;
n=1;
} // 負溫度求補碼,標志位置1
_1820display[4]=tem&0x0f; // 取小數部分的值
_1820display[0]=ditab[_1820display[4]]; // 存入小數部分顯示值
_1820display[4]=tem>>4; // 取中間八位,即整數部分的值
_1820display[3]=_1820display[4]/100; // 取百位數據暫存
_1820display[1]=_1820display[4]%100; // 取後兩位數據暫存
_1820display[2]=_1820display[1]/10; // 取十位數據暫存
_1820display[1]=_1820display[1]%10;
/******************數碼管符號位顯示判斷**************************/
if(!_1820display[3])
{
_1820display[3]=0x0a; //最高位為0時不顯示
if(!_1820display[2])
_1820display[2]=0x0a; //次高位為0時不顯示
}
if(n)
_1820display[3]=0x0b; //負溫度時最高位顯示"-"
}
/******************1602液晶符號位顯示判斷**************************/
if(!_1820display[3])
{
_1820display[3]=' '-'0'; //最高位為0時不顯示
if(!_1820display[2])
_1820display[2]=' '-'0'; //次高位為0時不顯示
}
if(n)
_1820display[3]='-'-'0'; //負溫度時最高位顯示"-"
} _18B20_init()//18B20初始化
{
_18B20_reset(); //開機先轉換一次
_18B20_write(0xcc); //Skip ROM
_18B20_write(0x44); //發轉換命令
}

Ⅶ 基於單片機的溫度檢測報警器


溫度感測器
AD0809
採集信號得到與之對應的
模擬信號
。A/D轉換電路對處理之後模擬信號數值化,將模擬信號轉換成數字信號。再由集成運放LM741對微弱的電信號進行放大處理,輸出電壓U0=2.732-UI,輸出電壓U1>2.732,是一個反向電壓。反向
比例運算電路
,其輸出電壓
UO=-2UI,U0是一個正電壓。再通過單片機(8951)對信號進行讀寫操作,經單片機處理後由
七段數碼管
顯示。並通過鍵盤輸入模塊向單片機設定高溫
臨界溫度
。當前環境溫度若超過設定的高溫臨界溫度,由單片機發出報警信號並驅動繼電器使風扇電機轉動。

Ⅷ 基於單片機的溫度控制系統的設計

利用溫度感測器DS18B20檢測環境溫度並直接輸出數字溫度信號給單片機AT89C52進行處理。

在LCD液晶上顯示當前環境溫度值、預設溫度值、使用者設定的溫度差以及目前風扇所處的檔位。其中預設溫度值只能為整數形式,檢測到的當前環境溫度可精確到小數點後一位。

同時採用PWM脈寬調制方式來改變直流風扇電機的轉速。

並通過兩個按鍵改變預設溫度值,一個提高預設溫度,另一個降低預設溫度值。通過另一個按鍵控制溫度差的大小。

設有紅外熱釋感測器檢測環境范圍內是否有人,如果有人確定出風方向,如果無人,降低轉速或一定時間內自動關閉。

回答

正如你所說的,一共用了DS18B20模塊,LCD模塊,紅外感測模塊,按鍵,直流電機模塊,程序方面只有一個PWM。現在一一為你分析:

DS18B20模塊:

下圖是它的原理圖,採用單匯流排來進行開發,不像電賽的哪個溫度感測器需要AD轉換,它是可以直接傳出數字信號的。

Ⅸ 急求基於單片機AT89C51的數字溫度報警器,具有上下限的在-20度到70度之間的匯編程序或C語言程序!拜託

;單片機DS18B20溫度計C語言程序

#include<reg51.h>
#include<intrins.h>
#include <math.H> //要用到取絕對值函數abs()
//通過DS18B20測試當前環境溫度, 並通過數碼管顯示當前溫度值, 目前顯示範圍: -55~ +125度
sbit wela = P2^7; //數碼管位選
sbit la = P2^6; //數碼管段選
sbit ds = P2^2;
int tempValue;

//0-F數碼管的編碼(共陽極)
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//0-9數碼管的編碼(共陽極), 帶小數點
unsigned char code tableWidthDot[]={0x40, 0x79, 0x24, 0x30,

0x19, 0x12, 0x02,0x78, 0x00, 0x10};
//延時函數, 對於11.0592MHz時鍾, 例i=10,則大概延時10ms.
void delay(unsigned int i)
{
unsigned int j;
while(i--)
{
for(j = 0; j < 125; j++);
}
}

//初始化DS18B20
//讓DS18B20一段相對長時間低電平, 然後一段相對非常短時間高電平, 即可啟動
void dsInit()
{
//對於11.0592MHz時鍾, unsigned int型的i, 作一個i++操作的時間大於?us
unsigned int i;
ds = 0;
i = 100; //拉低約800us, 符合協議要求的480us以上
while(i>0) i--;
ds = 1; //產生一個上升沿, 進入等待應答狀態
i = 4;
while(i>0) i--;
}

void dsWait()
{
unsigned int i;
while(ds);
while(~ds); //檢測到應答脈沖
i = 4;
while(i > 0) i--;
}

//向DS18B20讀取一位數據
//讀一位, 讓DS18B20一小周期低電平, 然後兩小周期高電平,
//之後DS18B20則會輸出持續一段時間的一位數據
bit readBit()
{
unsigned int i;
bit b;
ds = 0;
i++; //延時約8us, 符合協議要求至少保持1us
ds = 1;
i++; i++; //延時約16us, 符合協議要求的至少延時15us以上
b = ds;
i = 8;
while(i>0) i--; //延時約64us, 符合讀時隙不低於60us要求
return b;
}

//讀取一位元組數據, 通過調用readBit()來實現
unsigned char readByte()
{
unsigned int i;
unsigned char j, dat;
dat = 0;
for(i=0; i<8; i++)
{
j = readBit();
//最先讀出的是最低位數據
dat = (j << 7) | (dat >> 1);
}
return dat;
}

//向DS18B20寫入一位元組數據
void writeByte(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit b;
for(j = 0; j < 8; j++)
{
b = dat & 0x01;
dat >>= 1;
//寫"1", 將DQ拉低15us後, 在15us~60us內將DQ拉高, 即完成寫1
if(b)
{
ds = 0;
i++; i++; //拉低約16us, 符號要求15~60us內
ds = 1;
i = 8; while(i>0) i--; //延時約64us, 符合寫時隙不低於60us要求
}
else //寫"0", 將DQ拉低60us~120us
ds = 0;
i = 8; while(i>0) i--; //拉低約64us, 符號要求
ds = 1;
i++; i++; //整個寫0時隙過程已經超過60us, 這里就不用像寫1那樣, 再延時64us了

}
}

//向DS18B20發送溫度轉換命令
void sendChangeCmd()
{
dsInit(); //初始化DS18B20, 無論什麼命令, 首先都要發起初始化
dsWait(); //等待DS18B20應答
delay(1); //延時1ms, 因為DS18B20會拉低DQ 60~240us作為應答信號
writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
writeByte(0x44); //寫入溫度轉換命令字 Convert T
}

//向DS18B20發送讀取數據命令
void sendReadCmd()
{
dsInit();
dsWait();
delay(1);
writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
writeByte(0xbe); //寫入讀取數據令字 Read Scratchpad
}

//獲取當前溫度值
int getTmpValue()
{
unsigned int tmpvalue;
int value; //存放溫度數值
float t;
unsigned char low, high;
sendReadCmd();
//連續讀取兩個位元組數據
low = readByte();
high = readByte();
//將高低兩個位元組合成一個整形變數
//計算機中對於負數是利用補碼來表示的
//若是負值, 讀取出來的數值是用補碼表示的, 可直接賦值給int型的

value
tmpvalue = high;
tmpvalue <<= 8;
tmpvalue |= low;
value = tmpvalue;

//使用DS18B20的默認解析度12位, 精確度為0.0625度, 即讀回數據的最低位代表0.0625度
t = value * 0.0625;
//將它放大100倍, 使顯示時可顯示小數點後兩位, 並對小數點後第三進行4舍5入
//如t=11.0625, 進行計數後, 得到value = 1106, 即11.06 度
//如t=-11.0625, 進行計數後, 得到value = -1106, 即-11.06 度
value = t * 100 + (value > 0 ? 0.5 : -0.5); //大於0加0.5, 小於0減0.5
return value;
}

unsigned char const timeCount = 3; //動態掃描的時間間隔
//顯示當前溫度值, 精確到小數點後一位
//若先位選再段選, 由於IO口默認輸出高電平, 所以當先位選會使數碼管出現亂碼
void display(int v)
{
unsigned char count;
unsigned char datas[] = {0, 0, 0, 0, 0};
unsigned int tmp = abs(v);
datas[0] = tmp / 10000;
datas[1] = tmp % 10000 / 1000;
datas[2] = tmp % 1000 / 100;
datas[3] = tmp % 100 / 10;
datas[4] = tmp % 10;
if(v < 0)
{
//關位選, 去除對上一位的影響
P0 = 0xff;
wela = 1; //打開鎖存, 給它一個下降沿量
wela = 0;
//段選
P0 = 0x40; //顯示"-"號
la = 1; //打開鎖存, 給它一個下降沿量
la = 0;

//位選
P0 = 0xfe;
wela = 1; //打開鎖存, 給它一個下降沿量
wela = 0;
delay(timeCount);
}
for(count = 0; count != 5; count++)
{
//關位選, 去除對上一位的影響
P0 = 0xff;
wela = 1; //打開鎖存, 給它一個下降沿量
wela = 0;
//段選
if(count != 2)
{

P0 = table[datas[count]]; //顯示數字
}
else
{
P0 = tableWidthDot[datas[count]]; //顯示帶小數點數字
}
la = 1; //打開鎖存, 給它一個下降沿量
la = 0;

//位選
P0 = _crol_(0xfd, count); //選擇第(count + 1) 個數碼管
wela = 1; //打開鎖存, 給它一個下降沿量
wela = 0;
delay(timeCount);
}
}

void main()
{
unsigned char i;

while(1)
{
//啟動溫度轉換
sendChangeCmd();
//顯示5次
for(i = 0; i < 40; i++)
{
display(tempValue);
}
tempValue = getTmpValue();
}

閱讀全文

與基於對單片機的溫度報警器相關的資料

熱點內容
雲伺服器建設原理 瀏覽:258
javajunit4for 瀏覽:845
華為伺服器如何進陣列卡配置 瀏覽:435
apache伺服器ip地址訪問 瀏覽:718
如何買到安卓手機預裝軟體 瀏覽:537
冤罪百度雲不要壓縮 瀏覽:86
蘇州雲存儲伺服器 瀏覽:175
解壓收納原聲 瀏覽:385
java注冊驗證 瀏覽:375
火花app怎麼上推薦 瀏覽:980
什麼app能游戲投屏到電視上 瀏覽:455
伺服器託管到雲端是什麼意思 瀏覽:836
app保存草稿怎麼用 瀏覽:808
安卓如何進入proumb 瀏覽:144
主機虛擬雲伺服器 瀏覽:619
刪除分區加密的空間會不會恢復 瀏覽:706
京東app客戶上門怎麼看搜索量 瀏覽:741
怎麼在農行app購買黃金 瀏覽:46
c型開發板和單片機 瀏覽:146
虛擬機建立用戶的模板文件夾 瀏覽:905