① 電路設計題,內容: 設計一個溫度監測和顯示報警電路。獎勵會讓回答者滿意的,先謝謝了,一旦採納會追加
用單片機做很簡單的,我做過這個項目,溫度感測器可以採用模擬溫度感測器,如LM35系列或者MCP9700系列,都可以滿足你的說的0~100℃;對應輸出電壓0~10V(參考值)。
也可用數字溫度感測器如18B20。單片機用51也行,更高的AVR或PIC。顯示部分用三位共陰數碼管顯示,報警電路用蜂鳴器和三極體就可以搞定,電源用5V就可以了,整個電路也就5V搞定,需另購一個開關電源5V的。下面是一個報警電路圖。
② 用數碼管與DS18B20設計溫度報警器的軟體設計圖(各種流程框圖)
程序你都有了,可以直接按程序執行過程寫出方框圖嘛
③ 用數碼管與DS18B20設計溫度報警器
ds18b20網路很多常式的,就是時序讀寫問題,去看看吧。
④ 設計一個溫度報警器,利用51單片機和DS18B20,下圖為原理圖,假如要在硬體上加個數碼管用於設置溫度上下限
這個來簡單啊,你要這樣顯示我建議你自有液晶,看著會更好看點,也霸氣。用數碼管其實沒必要向你說的1 2,用同一個顯示就行了啊,在你設置上下限的時候顯示設置值,正常時候顯示當前溫度值,超限實現聲光報警。用獨立按鍵實現設置值的加減。這是原來做畢設時的一部分,呵呵。
⑤ 誰有DS18B20數字溫度計設計方案啊希望能有電路圖原理,和源程序!謝謝
電路很簡單,一個引腳接電源一個接地一個接個4.7K左右的電阻上拉後接到單片機的IO口即可,程序只是時序要求有點復雜的,注意延時就行了,可以參考
C程序:http://blog.ednchina.com/etiger/13268/message.aspx
匯編:http://www.51hei.com/mcu/118.html
DS18B20相關參考:
http://ke..com/view/1341776.htm
http://tieba..com/f?kz=162306215
⑥ 用1602LCD與DS18B20設計的溫度報警器的源程序
/************************************************************************
名稱:用數碼管與DS18B20設計溫度報警器
**************************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^6;
sbit D1=P1^4;
sbit D2=P1^5;
uchar code DSY_CODE[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00};//共陰數碼管段碼及空白顯示
uchar code df_Table[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//溫度小數位對照表
uchar CurrentT=0;//當前讀取的溫度整數部分
uchar Temp_Value[]={0X00,0X00};//從DS18B20讀取的溫度值
uchar Display_Digit[]={0,0,0,0};//待顯示的各溫度數位
bit DS18B20_IS_OK=1;//感測器正常標志
/************************************************************************
程序名稱:延時子程序
**************************************************************************/
void Delay(uint t)
{
for(;t>0;t--);
}
/************************************************************************
程序名稱:初始化DS18B20;可參考DS18B20的初始化時序圖讀懂程序
************************************************************************/
uchar Init_DS18B20()
{
uchar status;
DQ=1;
_nop_();_nop_();//從高拉倒低
DQ=0;
Delay(50);
DQ=1;
Delay(6);
status=DQ;
Delay(45);
DQ=1;
return status; //初始化成功返回0
}
/*************************************************************************
程序名稱:讀一位元組
*************************************************************************/
uchar ReadOneByte()
{
uchar i,dat=0;
DQ=1;_nop_();
for(i=0;i<8;i++)
{
DQ=0;dat>>=1;
DQ=1;_nop_();_nop_();
if(DQ)dat|=0X80;
Delay(6);
DQ=1;
}
return dat;
}
/*************************************************************************
程序名稱:寫一位元組
*************************************************************************/
void WriteOneByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0X01;
Delay(5);
DQ=1;
dat>>=1;
}
}
/*************************************************************************
程序名稱:讀取溫度值
*************************************************************************/
void Read_Temperature()
{
if(Init_DS18B20( )==1)
DS18B20_IS_OK=0; //DS18B20故障
else
{
WriteOneByte(0XCC); //跳過序列號
WriteOneByte(0X44); //啟動溫度轉換
Init_DS18B20();
WriteOneByte(0XCC); //跳過序列號
WriteOneByte(0XBE); //讀取溫度寄存器
Temp_Value[0]=ReadOneByte(); //溫度低8位
Temp_Value[1]=ReadOneByte(); //溫度高8位
DS18B20_IS_OK=1;
}
}
/*************************************************************************
程序名稱:在數碼管上顯示溫度
*************************************************************************/
void Display_Temperture()
{
uchar i;
uchar t=150; //延時值
uchar ng=0,np=0; //負數標識及負號顯示位置
char Signed_Current_Temp;
if((Temp_Value[1]&0XF8)==0XF8) //如果為負數則取反加1,並設置負號標識及負號顯示位置
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0X00) Temp_Value[1]++;
ng=1;np=0XF7; //默認負號顯示在左邊第1位
}
Display_Digit[0]=df_Table[Temp_Value[0] & 0X0F];//查表得到溫度小數部分
CurrentT=((Temp_Value[0] & 0xF0)>>4)|((Temp_Value[1] & 0x07))<<4;//獲取溫度整數部分(高位元組中的低3位與低位元組中的高4位,無符號)
Signed_Current_Temp=ng? -CurrentT:CurrentT;//有符號的當前溫度值
Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT%100/10;
Display_Digit[1]=CurrentT%10;
if(Display_Digit[3]==0)
{
Display_Digit[3]=10;
np=0XF7;
if(Display_Digit[2]==0)
{
Display_Digit[2]=10;
np=0XFB; //調整負號位置
}
}
for(i=0;i<30;i++) //刷新顯示若干時間
{
P0=DSY_CODE[Display_Digit[0]]; //小數位
P2=0XFE;Delay(t);P2=0XFF;
P0=(DSY_CODE[Display_Digit[1]])|0X80; //個位及小數點
P2=0XFD;Delay(t);P2=0XFF;
P0=DSY_CODE[Display_Digit[2]]; //十位
P2=0XFB;Delay(t);P2=0XFF;
P0=DSY_CODE[Display_Digit[3]]; //百位
P2=0XF7;Delay(t);P2=0XFF;
if(ng) //如果為負,則在調整後的位置顯示
{
P0=0X40;P2=np;Delay(t);P2=0XFF;
}
}
if(CurrentT>=125)
D1=0;
else if(ng=1&&CurrentT>=55)
D2=0;
}
/*************************************************************************
主程序
*************************************************************************/
void main(void)
{
Read_Temperature();
Delay(50000);
Delay(50000);
while(1)
{
Read_Temperature();
if(DS18B20_IS_OK) Display_Temperture();
else P0=P2=0X00;
}
}
⑦ DS18B20數字溫度計的設計(LCD)顯示
/***************************************
128 64 lcd顯示8×16 的數字內容
***************************************/
void dispshuzi0(uchar ix,uchar page0,uchar lie0)
{
uchar ii,j;
ii=ix*16;
wrlie(lie0);
wrpage(page0);
for(j=0;j<8;j++)
{
wrdate(shuzi[ii]);
ii++;
}
wrlie(lie0);
wrpage(page0+1);
for(j=0;j<8;j++)
{
wrdate(shuzi[ii]);
ii++;
}
}
⑧ 基於18B20的多點溫度顯示系統
範例二 環境溫度監測系統
一、設計要求
環境溫度監測系統廣泛地用於住宅小區、樓宇建築和設備內部等。其主要功能和指標如下:
1、可以監測8點環境溫度信號,可以擴充;
2、測量范圍為0.00℃~99.9℃,可以擴充到-55℃~+125℃,精度為±0.5℃;
3、用4位數碼管進行循環顯示,其中最高位顯示通道提示符A~H,低3位顯示實際溫度值,每秒切換一個通道進行輪流顯示;
4、 可以隨時查看指定通道的溫度值(擴充功能)。
二、設計指導
1、方案選擇
該系統主要由溫度檢測和數據採集兩部分組成。下面列舉兩種實現方案:
方案一:溫度檢測可以使用低溫熱偶或鉑電阻,數據採集部分則使用帶有A/D通道的單片機。考慮到一般的A/D輸入通道都只能接收大信號,所以還應設計相應的放大電路。此方案的軟體簡單,但硬體復雜,且檢測點數追加時,成本會有較大增長幅度。
方案二:使用單片機和單匯流排溫度感測器構成。單匯流排溫度感測器可以採用DALLAS公司生產的DS18B20系列,這類溫度感測器直接輸出數字信號,且多路溫度感測器可以掛在1條匯流排上,共同佔用單片機的1條I/O線即可實現介面。在提升單片機I/O線驅動能力的前提下,理論上可以任意擴充檢測的溫度點數。
比較兩個方案後可以發現,方案二更適合於用作本系統的實施方案。盡管方案二不需要A/D,但考慮到系統擴充等因素,單片機可以選用ADuc812,以便於在需要的時候擴充參數存儲、 D/A輸出、溫度控制等功能。
2、 硬體設計
採用方案二的硬體設計比較簡單,系統構成如圖1所示,原理圖如圖5所示。單片機的P0口用作4位數碼管的段碼線,P3.4~P3.7用作4位數碼管的位選線(ADuc812的P3有允許8mA的灌電流,可以不加驅動)。P2.4用作DS18B20的數據輸入/輸出線。
DS18B20的引腳定義和封裝形式之一如圖2所示。DQ為數字信號輸入/輸出端;GND為電源地;VDD為外接電源
。
DS18B20的光刻ROM中存有64位序列號,它可以看作是該DS18B20的地址序列碼。64位光刻ROM的排列是:開始8位(28H)是產品類型標號,接著的48位是該DS18B20自身的序列號,最後8位是前面56位的循環冗餘校驗碼(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一個DS18B20擁有惟一的地址序列碼,以確保在一根匯流排上掛接多個DS18B20。
DS18B20內部集成了暫存寄存器(或稱為暫存RAM)和EEPROM兩類存儲器。暫存RAM為9個位元組,其地址分配及其相關說明如表1所示。
單片機通過命令實現對DS18B20的控制,其支持的主要命令如表2所示。DS18B20的復位操作、讀寫操作都必須遵從嚴格的時序,其復位時序、讀寫時序分別如圖3和圖4所示。關於DS18B20的詳細介紹和使用方法可以參考其數據手冊。
表1 DS18B20暫存RAM地址分配及其說明
寄存器名稱 地址 說 明
溫度低位元組 0 溫度測量值的低8位,即b7 b6 b5 b4 b3 b2 b1 b0
溫度高位元組 1 溫度測量值的高3位及符號位,即S S S S S b10 b9 b8
溫度高限 2 溫度報警上限,也可以用作自定義位元組
溫度高限 3 溫度報警下限,也可以用作自定義位元組
配置寄存器 4 格式為0 R1 R0 1 1 1 1 1,R1和R0為00、01、10、11對應的解析度分別為9、10、11和12位(包括符號位)
保留 5 未定義
保留 6 未定義
保留 7 未定義
校驗碼 8 按X8+X5+X4+1對前8個位元組進行CRC校驗
表2 DS18B20主要命令及其功能說明
命令碼 功能說明 命令碼 功能說明
33H 讀ROM中的64位地址序列碼 BEH 讀9位元組暫存寄存器
55H 只有地址碼匹配的DS18B2才能接受後續的命令 4EH 寫入溫度上/下限,緊隨其後是2位元組數據,對應上限和下限值
F0H 鎖定匯流排上DS18B20的個數和識別其ROM中的64位地址序列碼 48H 將9位元組暫存寄存器的第3和4位元組復制到EEPROM中
ECH 只有溫度超過上限或下限的DS18B20才做出響應 B8H 將EEPROM的內容恢復到暫存寄存器的第3和4位元組
44H 啟動DS18B20進行溫度轉換,結果存入9位元組的暫存寄存器 B4H 讀供電模式,寄生供電時DS18B20發送0,外接電源時DS18B20發送1
CCH 忽略地址序列碼,適合單片DS18B20
圖5 系統原理圖
3、 軟體設計
1、 軟體模塊的劃分
該系統的控制軟體可以分為單片機初始化程序、定時中斷服務程序和DS18B20介面程序等模塊。單片機初始化程序由主函數實現,主要完成定時器T0、T1的初始化、中斷系統的初始化等功能。定時器T0中斷函數每隔5ms執行1次,動態顯示1位數碼管;定時器T1中斷函數每隔50ms中斷1次,每中斷20次(1秒)即讀取1路DS18B20的溫度代碼,轉換為溫度值,再拆分成單個數碼後送入顯示緩沖區。DS18B20介面程序主要由復位函數、讀位函數、讀位元組函數、寫位函數、寫位元組函數、讀溫度函數等組成。
2、 參考程序
#include <ac812.h>
#include <intrins.h>
sbit led0=P3^4; //P3.4~P3.7用作4位LED的位選線
sbit led1=P3^5;
sbit led2=P3^6;
sbit led3=P3^7;
sbit DQ = P2^4; //P2.4用作DS18B20的數據線DQ
float data TMP[2]={0,0}; //讀取後的2個溫度值,將其除以2即可得出實際溫度;
unsigned char data f[2]={0,0}; //結果是否為負溫,"0"為正溫,"1"為負溫。
unsigned char data disp_buf[4]={0,0,0,0}; //4位數碼管對應的值放入該緩沖區
unsigned char data dot_position=0;
unsigned char data chno=0; //對應某路DS18B20
//存各路DS18B20的地址序列號,為便於調試,只設計了2路,可以擴充到8路或更多
unsigned char code SN[2][8]={ {16, 62,148,60,0,0,0, 247},{16,229,146,60,0,0,0, 87} };
//數字0~9和通道提示符A~H的段碼
unsigned char code seg_table[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x6f,0x76};
unsigned char code CH[ ]={10,11,12,13,14,15,16,17}; //通道提示符的段碼偏移量
//將0.00~999之間的浮點數轉為單個數碼,並送顯示緩沖區和返回小數點的位置
void ftochar(float valp)
{
if(valp<10.0)
{
dot_position=1;
valp *=100.0;
}
else if((valp>=10.0)&&(valp<100.0))
{
dot_position=2;
valp *=10.0;
}
else if((valp>=100.0)&&(valp<1000.0)) dot_position=3;
disp_buf[1]=(int)valp/100;
disp_buf[2]=((int)valp%100)/10;
disp_buf[3]=((int)valp%100)%10;
}
//延時15微妙的函數
void delay(unsigned char n)
{
do {
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //_nop_()的頭文件為intrins.h
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
n--;
}while(n);
}
//DS18B20復位函數,按復位時序進行設計
void ow_reset(void)
{
DQ = 0; // DQ置為低電平
delay(36); // 保持480μs
DQ = 1; // DQ置為高電平
delay(24); // 延時,等DS18B20輸出低電平
}
//DS18B20讀位函數,按讀位時序進行設計
unsigned char read_bit(void)
{
unsigned char i;
DQ = 0; // DQ置為低電平
DQ = 1; // DQ置為高電平
for (i=0; i<5; i++); // 延時 15μs
return(DQ); // 返回DQ 線的電平狀態
}
// DS18B20寫位函數,按寫位時序進行設計
void write_bit(char bitval)
{
DQ = 0; // DQ置為低電平
if(bitval==1) DQ =1; // 如果寫1則DQ置為高電平
delay(6); // 延時以維持電平狀態
DQ = 1; // DQ置為高電平
}
// 從DS18B20讀取位元組的函數
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++)
{
if(read_bit()) value|=0x01<<i; //調用讀位函數,讀出的8個位移位成1個位元組
delay(11); //延時以讀餘下的位
}
return(value);
}
//寫位元組到DS18B20的函數
void write_byte(char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++) //每次寫1位,1個位元組分8次完成
{
temp = val>>i;
temp &= 0x01;
write_bit(temp); //調用寫位函數
}
delay(10); //延時
}
// 從DS18B20讀物溫度代碼
void read_temp ()
{
unsigned char i,j;
unsigned char a,b;
int mr;
for(j=0;j<2;j++) //為便於調試,僅以2路為例,改循環次數即可擴充到8路或更多,
{
ow_reset(); //調用復位函數
delay(20);
write_byte (0x55); //發送ROM匹配命令
for(i=0;i<8;i++)
{
write_byte(SN[j][i]); //發送64位序列號
}
write_byte (0xbe); //發送讀取暫存寄存器的命令
a = read_byte(); //連續讀取兩位溫度,餘下數據沒有讀,實際使用時應讀出所有數
b = read_byte(); //據,並進行校驗,以提高可靠性
mr=b*256+a;
if((mr&0xf800)!=0) mr=-mr+1;
TMP[j]=mr*0.5;
}
}
//定時器T0中斷函數,每中斷1次,顯示1位數碼管
void Time_disp(void) interrupt 1
{
static unsigned char dispno=0; //數碼管位號
TH0=0xee; //主頻為11.0592,定時5ms的時間常數為EE00H
TL0=0x00;
P3|=0xf0;
P0=seg_table[disp_buf[dispno]]; //查當前數碼管的顯示數字對應的段碼
if(dispno==dot_position) P0|=0x80; //當前位有小數點,則段碼最高位置1
switch(dispno) //根據當前顯示的數碼管,接通位選線
{
case 0 : led0=0; break;
case 1 : led1=0; break;
case 2 : led2=0; break;
case 3 : led3=0; break;
}
dispno++;
if(dispno==4) dispno=0;
}
//定時器T1中斷服務函數,每50ms中斷1次
void Timer1(void) interrupt 3
{
static unsigned int count;
TH1=0x4c; //50ms對應的時間常數為4C00H
TL1=0x00;
count++;
if(count>=20) //中斷20次即為1秒
{
count=0;
ftochar(TMP[chno]); //當前通道對應的溫度值轉換為單個數碼送顯示緩沖區
disp_buf[0]=CH[chno]; //當前通道的提示符的段碼偏移量送顯示緩沖區首地址
chno++;
if(chno= =2) chno=0; //修改此判斷對應的數值,即可擴充到8路或更多
}
}
//主函數
main( )
{
TMOD=0x11; //定時器T0和T1按方式1工作
EA=1;
ET0=1;
ET1=1;
TH0=0xee; //5ms對應的時間常數
TL0=0x00;
TH1=0x4c; //50ms對應的時間常數
TL1=0x00;
TR0=1;
TR1=1;
do {
ow_reset( ); //復位DS18B20
write_byte(0xcc);
write_byte(0x44); //啟動1820
read_temp( ); //調用讀取溫度的函數,結果存於TMP[ ]數組中
}while(1);
}