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

基於單片機溫度報警器設計

發布時間:2023-01-09 23:13:06

『壹』 用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); //發轉換命令
}

『貳』 溫度報警器的原理

【1】溫度自動報警器工作原理是根據單片機語音數字聯網火災報警器設計的。

【2】主要是使用AT89C51單片機,選用集成溫度感測器AD590和氣體感測器TGS202作為敏感元件,利用多感測器信息融合技術,開發了可用於小型單位火災報警的語音數字聯網報警器。 關鍵詞:單片機;感測器;信號處理;火災報警器 1 引 言 我國的火災自動報警控制。如下圖所示:

『叄』 基於單片機的溫度控制器的畢業論文

溫度相關的畢業設計
·基於單片機的數字溫度計的設計
·基於MCS-51數字溫度表的設計
·單片機的數字溫度計設計
·基於單片機的空調溫度控制器設計
·基於數字溫度計的多點溫度檢測系統
·設施環境中溫度測量電路設計
·DS18B20數字溫度計的設計
·多點溫度採集系統與控制器設計
·基於PLC和組態王的溫度控制系統設計
·溫度監控系統的設計
·用單片機進行溫度的控制及LCD顯示系統的設計
·單片機電加熱爐溫度控制系統
·全氫罩式退火爐溫度控制系統
·數字溫度計的設計
·基於單片機AT89C51的語音溫度計的設計
·基於單片機的多點溫度檢測系統
·基於51單片機的多路溫度採集控制系統
·基於單片機的數字顯示溫度系統畢業設計論文
·基於MCS51單片機溫度控制畢業設計論文
·西門子S7-300在溫度控制中的應用
·燃氣鍋爐溫度的PLC控制系統
·焦爐立火道溫度軟測量模型設計
·溫度檢測控制儀器
·智能溫度巡檢儀的研製
·電阻爐溫度控制系統
·數字溫度測控儀的設計
·溫度測控儀設計
·多路溫度採集系統設計
·多點數字溫度巡測儀設計
·LCD數字式溫度濕度測量計
·64點溫度監測與控制系統
·溫度報警器的電路設計與製作
·基於單片機的數字溫度計的電路設計
·全氫煤氣罩式爐的溫度控制系統的研究與改造
·溫度檢測與控制系統
·紅外快速檢測人體溫度裝置的設計與研製
·具有紅外保護的溫度自動控制系統的設計
·基於單片機的溫度測量系統的設計
·數字溫度計設計
·DS18B20溫度檢測控制
·PN結(二極體)溫度感測器性能的實驗研究
·多功能智能化溫度測量儀設計
·軟膠囊的單片機溫度控制(硬體設計)
·空調溫度控制單元的設計
·大容量電機的溫度保護——軟體設計
·大容量電機的溫度保護 ——硬體電路的設計
·基於DS18B20溫度感測器的數字溫度計設計
·熱軋帶鋼卷取溫度反饋控制器的設計
·基於單片機的溫度採集系統設計
·多點溫度數據採集系統的設計
·基於單片機的數字式溫度計設計
·18B20多路溫度採集介面模塊
·基於單片機的戶式中央空調器溫度測控系統設計
·單片機電阻爐溫度控制系統設計
·基於單片機的電阻爐溫度控制系統設計
·基於ARM的嵌入式溫度控制系統的設計
·基於DS18B20的多點溫度巡迴檢測系統的設計
·基於單片機的多點無線溫度監控系統
·基於MSC1211的溫度智能溫度感測器
·用集成溫度感測器組成測溫控制系統
·室內溫度控制報警器
·自動溫度控制系統
·烤箱溫度控制系統
·基於單片機的電加熱爐溫度控制系統設計
·基於PLC的溫度監控系統設計
·基於無線傳輸技術的室溫控制系統設計——溫度控制器軟體設計
·溫度箱模擬控制系統
·基於無線傳輸技術的室溫控制系統設計——溫度控制器硬體設計
·數字式溫度計的設計
·溫度監控系統設計
·基於單片機的電阻爐溫度控制系統
·基於plc的溫度濕度檢測和顯示系統設計
·基於單片機的3KW電爐溫度控制系統的設計
·腔型腫瘤熱療儀溫度控制系統設計
·基於AT89S51單片機的數字溫度計設計
·吹塑薄膜擠出機溫度控制與檢測系統設計
·電加熱爐PLC溫度自適應控制系統的研究
·高壓母線溫度自動監測裝置的設計
·高壓母線溫度自動檢測裝置
·小型熱水鍋爐單片機溫度控制系統
·消毒櫃單片機溫度控制
·嵌入式系統在多點溫度控制中的應用
·單片機溫度控制系統
·上下限溫度報警器的設計
·基於單片機的飲水機溫度控制系統設計
·基於單片機的溫度測量系統設計

『肆』 基於單片機控制的溫濕度報警器 有誰會設計么還有編程。。。

//DS18B20溫度檢測及其液晶顯示
#include<reg52.h> //包含單片機寄存器的頭文件
#include<intrins.h> //包含_nop_()函數定義的頭文件
unsigned char code digit[10]={"0123456789"}; //定義字元數組顯示數字
unsigned char code Str[]={"Test by DS18B20"}; //說明顯示的是溫度
unsigned char code Error[]={"Error!Check!"}; //說明沒有檢測到DS18B20
unsigned char code Temp[]={"Temp:"}; //說明顯示的是溫度
unsigned char code Cent[]={"Cent"}; //溫度單位
/*******************************************************************************
以下是對液晶模塊的操作程序
*******************************************************************************/
sbit RS=P2^0; //寄存器選擇位,將RS位定義為P2.0引腳
sbit RW=P2^1; //讀寫選擇位,將RW位定義為P2.1引腳
sbit E=P2^2; //使能信號位,將E位定義為P2.2引腳
sbit BF=P0^7; //忙碌標志位,,將BF位定義為P0.7引腳
/*****************************************************
函數功能:延時1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<4;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函數功能:延時若干毫秒
入口參數:n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函數功能:判斷液晶模塊的忙碌狀態
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
bit BusyTest(void)
{
bit result;
RS=0; //根據規定,RS為低電平,RW為高電平時,可以讀狀態
RW=1;
E=1; //E=1,才允許讀寫
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
result=BF; //將忙碌標志電平賦給result
E=0; //將E恢復低電平
return result;
}
/*****************************************************
函數功能:將模式設置指令或顯示地址寫入液晶模塊
入口參數:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根據規定,RS和R/W同時為低電平時,可以寫入指令
RW=0;
E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,
// 就是讓E從0到1發生正跳變,所以應先置"0"
_nop_();
_nop_(); //空操作兩個機器周期,給硬體反應時間
P0=dictate; //將數據送入P0口,即寫入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=1; //E置高電平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:指定字元顯示的實際地址
入口參數:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"
}
/*****************************************************
函數功能:將數據(字元的標准ASCII碼)寫入液晶模塊
入口參數:y(為字元常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS為高電平,RW為低電平時,可以寫入數據
RW=0;
E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,
// 就是讓E從0到1發生正跳變,所以應先置"0"
P0=y; //將數據送入P0口,即將數據寫入液晶模塊
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=1; //E置高電平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:對LCD的顯示模式進行初始化設置
***************************************************/
void LcdInitiate(void)
{
delaynms(15); //延時15ms,首次寫指令時應給LCD一段較長的反應時間
WriteInstruction(0x38); //顯示模式設置:16×2顯示,5×7點陣,8位數據介面
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x38);
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x38); //連續三次,確保初始化成功
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x0c); //顯示模式設置:顯示開,無游標,游標不閃爍
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x06); //顯示模式設置:游標右移,字元不移
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x01); //清屏幕指令,將以前的顯示內容清除
delaynms(5); //延時5ms,給硬體一點反應時間

}
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/
sbit DQ=P3^3;
unsigned char time; //設置全局變數,專門用於嚴格延時
/*****************************************************
函數功能:將DS18B20感測器初始化,讀取應答信號
出口參數:flag
***************************************************/
bit Init_DS18B20(void)
{
bit flag; //儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在
DQ = 1; //先將數據線拉高
for(time=0;time<2;time++) //略微延時約6微秒
;
DQ = 0; //再將數據線從高拉低,要求保持480~960us
for(time=0;time<200;time++) //略微延時約600微秒
; //以向DS18B20發出一持續480~960us的低電平復位脈沖
DQ = 1; //釋放數據線(將數據線拉高)
for(time=0;time<10;time++)
; //延時約30us(釋放匯流排後需等待15~60us讓DS18B20輸出存在脈沖)
flag=DQ; //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在)
for(time=0;time<200;time++) //延時足夠長時間,等待存在脈沖輸出完畢
;
return (flag); //返回檢測成功標志
}
/*****************************************************
函數功能:從DS18B20讀取一個位元組數據
出口參數:dat
***************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat; //儲存讀出的一個位元組數據
for (i=0;i<8;i++)
{

DQ =1; // 先將數據線拉高
_nop_(); //等待一個機器周期
DQ = 0; //單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序
dat>>=1;
_nop_(); //等待一個機器周期
DQ = 1; //將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備
for(time=0;time<2;time++)
; //延時約6us,使主機在15us內采樣
if(DQ==1)
dat|=0x80; //如果讀到的數據是1,則將1存入dat
else
dat|=0x00;//如果讀到的數據是0,則將0存入dat
//將單片機檢測到的電平信號DQ存入r[i]
for(time=0;time<8;time++)
; //延時3us,兩個讀時序之間必須有大於1us的恢復期
}
return (dat); //返回讀出的十進制數據
}
/*****************************************************
函數功能:向DS18B20寫入一個位元組數據
入口參數:dat
***************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=0; i<8; i++)
{
DQ =1; // 先將數據線拉高
_nop_(); //等待一個機器周期
DQ=0; //將數據線從高拉低時即啟動寫時序
DQ=dat&0x01; //利用與運算取出要寫的某位二進制數據,
//並將其送到數據線上等待DS18B20采樣
for(time=0;time<10;time++)
;//延時約30us,DS18B20在拉低後的約15~60us期間從數據線上采樣
DQ=1; //釋放數據線
for(time=0;time<1;time++)
;//延時3us,兩個寫時序間至少需要1us的恢復期
dat>>=1; //將dat中的各二進制位數據右移1位
}
for(time=0;time<4;time++)
; //稍作延時,給硬體一點反應時間
}
/******************************************************************************
以下是與溫度有關的顯示設置
******************************************************************************/
/*****************************************************
函數功能:顯示沒有檢測到DS18B20
***************************************************/
void display_error(void)
{
unsigned char i;
WriteAddress(0x00); //寫顯示地址,將在第1行第1列開始顯示
i = 0; //從第一個字元開始顯示
while(Error[i] != '\0') //只要沒有寫到結束標志,就繼續寫
{
WriteData(Error[i]); //將字元常量寫入LCD
i++; //指向下一個字元
delaynms(100); //延時100ms較長時間,以看清關於顯示的說明
}
while(1) //進入死循環,等待查明原因
;
}
/*****************************************************
函數功能:顯示說明信息
***************************************************/
void display_explain(void)
{
unsigned char i;
WriteAddress(0x00); //寫顯示地址,將在第1行第1列開始顯示
i = 0; //從第一個字元開始顯示
while(Str[i] != '\0') //只要沒有寫到結束標志,就繼續寫
{
WriteData(Str[i]); //將字元常量寫入LCD
i++; //指向下一個字元
delaynms(100); //延時100ms較長時間,以看清關於顯示的說明
}
}
/*****************************************************
函數功能:顯示溫度符號
***************************************************/
void display_symbol(void)
{
unsigned char i;
WriteAddress(0x40); //寫顯示地址,將在第2行第1列開始顯示
i = 0; //從第一個字元開始顯示
while(Temp[i] != '\0') //只要沒有寫到結束標志,就繼續寫
{
WriteData(Temp[i]); //將字元常量寫入LCD
i++; //指向下一個字元
delaynms(50); //延時1ms給硬體一點反應時間
}
}

/*****************************************************
函數功能:顯示溫度的小數點
***************************************************/
void display_dot(void)
{
WriteAddress(0x49); //寫顯示地址,將在第2行第10列開始顯示
WriteData('.'); //將小數點的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示溫度的單位(Cent)
***************************************************/
void display_cent(void)
{
unsigned char i;
WriteAddress(0x4c); //寫顯示地址,將在第2行第13列開始顯示
i = 0; //從第一個字元開始顯示
while(Cent[i] != '\0') //只要沒有寫到結束標志,就繼續寫
{
WriteData(Cent[i]); //將字元常量寫入LCD
i++; //指向下一個字元
delaynms(50); //延時1ms給硬體一點反應時間
}
}
/*****************************************************
函數功能:顯示溫度的整數部分
入口參數:x
***************************************************/
void display_temp1(unsigned char x)
{
unsigned char j,k,l; //j,k,l分別儲存溫度的百位、十位和個位
j=x/100; //取百位
k=(x%100)/10; //取十位
l=x%10; //取個位
WriteAddress(0x46); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[j]); //將百位數字的字元常量寫入LCD
WriteData(digit[k]); //將十位數字的字元常量寫入LCD
WriteData(digit[l]); //將個位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示溫度的小數數部分
入口參數:x
***************************************************/
void display_temp2(unsigned char x)
{
WriteAddress(0x4a); //寫顯示地址,將在第2行第11列開始顯示
WriteData(digit[x]); //將小數部分的第一位數字字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:做好讀溫度的准備
***************************************************/
void ReadyReadTemp(void)
{
Init_DS18B20(); //將DS18B20初始化
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
for(time=0;time<100;time++)
; //溫度轉換需要一點時間
Init_DS18B20(); //將DS18B20初始化
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器,前兩個分別是溫度的低位和高位
}

/*****************************************************
函數功能:主函數
***************************************************/

void main(void)
{
unsigned char TL; //儲存暫存器的溫度低位
unsigned char TH; //儲存暫存器的溫度高位
unsigned char TN; //儲存溫度的整數部分
unsigned char TD; //儲存溫度的小數部分
LcdInitiate(); //將液晶初始化
delaynms(5); //延時5ms給硬體一點反應時間
if(Init_DS18B20()==1)
display_error();
display_explain();
display_symbol(); //顯示溫度說明
display_dot(); //顯示溫度的小數點
display_cent(); //顯示溫度的單位
while(1) //不斷檢測並顯示溫度
{

ReadyReadTemp(); //讀溫度准備
TL=ReadOneChar(); //先讀的是溫度值低位
TH=ReadOneChar(); //接著讀的是溫度值高位
TN=TH*16+TL/16; //實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16
//這樣得出的是溫度的整數部分,小數部分被丟棄了
TD=(TL%16)*10/16; //計算溫度的小數部分,將余數乘以10再除以16取整,
//這樣得到的是溫度小數部分的第一位數字(保留1位小數)
display_temp1(TN); //顯示溫度的整數部分
display_temp2(TD); //顯示溫度的小數部分
delaynms(10);
}

}

『伍』 求講解一下此單片機 製作的溫度報警器原理 有圖 89c51

1,左邊上面開始,是晶振線路,提供整個單片機時鍾信號,標准接法,每個都是
2,下面是復位,51單片機標准接法
3,下面是按鍵,也算是一種標准接法
4,右邊上,是排阻。51單片機P0需要上拉,標准接法
5,下面LED是供陰極,陽極驅動,標准接法
6,18B20是溫度感測器,通過D這個腳傳送數字訊號
7,不一定需要使用P1是按鍵,也可以是P0,P2,這個要看你程式怎麼寫

『陸』 基於單片機的智能溫度報警器

溫度范圍廣精度高的話用熱電偶,自己做著玩就選DS18B20,復位按鍵
單片機根據成本自己選擇stc的價格合適,報警器有數碼管顯示就行,蜂鳴器電子市場都有的。你可以買一個學習板,自己先測試一下,元件都不用買了。

『柒』 急求基於單片機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();
}

『捌』 STC89C52單片機,用C語言編溫度報警器的程序

我們可以給你提供。 //初始化DS18B20
//讓DS18B20一段相對長時間低電平, 然後一段相對非常短時間高電平, 即可啟動
void dsInit()
{
//對於11.0592MHz時鍾, unsigned int型的i, 作一個i++操作的時間大於8us
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 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()
{

int value; //存放溫度數值
float t;
unsigned char low, high;
sendReadCmd();
//連續讀取兩個位元組數據
low = readByte();
high = readByte();
tmpvalue = high;
tmpvalue <<= 8;
tmpvalue |= low;
value = tmpvalue;

//使用DS18B20的默認解析度12位, 精確度為0.0625度, 即讀回數據的最低位代表0.0625度
t = value * 0.0625;
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()
{
unsigned int tmp = abs(tempValue);

switch(sum)
{
case 1: PA8255=table[tmp % 10]; PB8255=0xfe; delay(1);
PA8255=table[ tmp % 100 / 10]; PB8255=0xfd; delay(1);
PA8255=tableWidthDot[ tmp % 1000 / 100]; PB8255=0xfb; delay(1);
PA8255=table[tmp % 10000 / 1000]; PB8255=0xf7; delay(1); PB8255=0xff;break; //顯示溫度

case 2: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[high%10]; PB8255=0xfd; delay(1);
PA8255=table[high/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //顯示上限溫度

case 3: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[low%10]; PB8255=0xfd; delay(1);
PA8255=table[low/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //顯示下限溫度

default: break;
}

} */

Into() interrupt 0
{ sum++;
if(sum==4)
sum=1;
}

uchar keyscan() //鍵盤掃描,調整溫度上下限
{
PC8255=0xfc;
if((PC8255&0xc0)!=0xc0)
{
delay(40);
if((PC8255&0xc0)!=0xc0)
PC8255=0xfe;
if((PC8255&0xc0)==0x80)
high++;
if((PC8255&0xc0)==0x40)
high--;
PC8255=0xfd;
if((PC8255&0xc0)==0x80)
low++;
if((PC8255&0xc0)==0x40)
low--;
}
}

void main()
{

unsigned int tmp ;

COM8255=0x88;
IT0=1; //外部中斷0,採用外部中斷0進行實時溫度,上限溫度和下限溫度之間的顯示切換
EX0=1;
EA=1;
P1_0=0x1;
sum=1;
high=22; //初始溫度上下限設定
low=10;
while(1)
{
//啟動溫度轉換
sendChangeCmd();
tempValue = getTmpValue();
keyscan();// 讀取鍵值
tmp = abs(tempValue); //讀取溫度
switch(sum)
{
case 1: PA8255=table[tmp % 10]; PB8255=0xfe; delay(1);
PA8255=table[ tmp % 100 / 10]; PB8255=0xfd; delay(1);
PA8255=tableWidthDot[ tmp % 1000 / 100]; PB8255=0xfb; delay(1);
PA8255=table[tmp % 10000 / 1000]; PB8255=0xf7; delay(1); PB8255=0xff;break; //顯示溫度

case 2: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[high%10]; PB8255=0xfd; delay(1);
PA8255=table[high/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //顯示上限溫度

case 3: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[low%10]; PB8255=0xfd; delay(1);
PA8255=table[low/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //顯示下限溫度

default: break;
}

if(tmp>(high*100)|tmp<(low*100) ) //&&tempValue>low) //超過溫度設定范圍,系統自動報警
{
P1_0=0;
}
else
P1_0=1; }

}

『玖』 我要做一個單片機溫度報警器,需要什麼材料,本人這是畢業設計。求大神幫忙下

首先是硬體問題啊,採集溫度必須要有一個溫度感測器,建議用ds18b20,這個感測器引腳簡單,而且是輸出數字量,這樣單片機或者外圍電路就可以不用帶AD轉換器了,你就可以用功能非常簡單的51系列單片機什麼STC80C51,STC80C52系列的都可以,又簡單易學,報警的話你還需要一個蜂鳴器,這個就隨便買哪個型號的反正原理都一樣。這幾樣東西買來了以後,當然你還要買很多電阻,電容,晶振,三極體什麼的元器件,你搜一下單片機最小系統,然後自己畫個簡單的電路圖,就可以開始搭建你的報警器了。

上述東西准備玩了,就是軟體問題了,你買ds18b20可以讓買家給你發個參考程序,或者自己在網上網路上搜,一搜一大堆,基本上都是可以直接拿來用的,因為用這個做畢業設計或者做項目的太多了。還有搞不好你可以直接找到這樣的畢業設計論文。。。

給你發個作為參考,基本上都一樣!

『拾』 單片機溫度報警器的溫度上下限按鍵調控的C語言程序怎麼編

溫度報警器就是需要溫度感測器不停地對監控的對象進行檢測,例如pt100溫度感測器,pt100感測器是不同溫度下,阻值會不同,在同一溫度下,阻值是相同的。根據這個原理通過電路轉換成電壓,然後模擬量轉換成數字量輸入到單片機,單片機根據讀取到的電壓值判斷實際溫度值,然後根據設定的報警值比較,如果超過 就進行報警動作。
在實際設計過程中那個報警溫度的設定,可以直接對那個變數進行加減的,例如
void actfuntion(unsigned char temp)
{
temp++;
}
然後在檢測到按鍵有電平跳變的時候,就調用這個含參子函數對定義的溫度設定值進行加操作,減操作也是一樣,還可以在調用的後面進行最大值或者最小值的判斷。
如果覺得這樣一下一下的按太麻煩了,可以對按鍵進行長按連續觸發進行判斷,就是在定時器里進行判斷按下時間,然後不停的調用這個子函數。
當然這個設定值是需要考慮掉電保存的,或者是按鍵保存。可以在設定好溫度值之後,在按下其他的按鍵,進行把溫度設定值 保存到單片機內部eeprom就可以了,不需要保存太多數據的情況下,現在市面上很多單片機都有的內部eeprom就夠用的了,不需要進行外部擴展。
然後在單片機上電,也就是主函數的開頭進行讀取eeprom中保存的設定值。

閱讀全文

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

熱點內容
未來最值得投資的加密貨幣 瀏覽:526
ascii碼是編譯的時候用嗎 瀏覽:779
壓縮機感應包可以通用嗎 瀏覽:410
方舟伺服器怎麼發布到搜索列表 瀏覽:270
xml防反編譯 瀏覽:239
數據傳輸加密系統技術方案 瀏覽:842
程序員沒有準備去面試 瀏覽:4
51單片機usb滑鼠 瀏覽:879
qq伺服器的ip地址查詢 瀏覽:112
java仿qq聊天 瀏覽:400
解壓的ipa重新打包 瀏覽:142
程序員那麼可愛vip版 瀏覽:239
程序員怎麼升職 瀏覽:243
圖形化命令按鈕vb 瀏覽:987
vcu盤加密怎麼設置 瀏覽:414
如何加密備份微信聊天記錄 瀏覽:529
安卓手機如何模擬鍵盤 瀏覽:932
查看dns地址命令 瀏覽:768
android錄屏工具 瀏覽:841
成都互動直播系統源碼 瀏覽:955