導航:首頁 > 操作系統 > 基於單片機的溫度檢測

基於單片機的溫度檢測

發布時間:2022-08-30 20:49:58

⑴ 基於STM32單片機設計結合軟硬體說明溫度檢測過程

硬體電路部分可以使用數字式溫度感測器如DS18B20,DHT11等,也可以使用熱電阻如PT100等,數字式溫度感測器只需要與單片機的IO直接連接即可,在內部編寫通訊協議就可以完成溫度採集,而使用熱電阻等溫度感測器則需要使用模數轉換器。

⑵ 用單片機做溫度檢測系統 論文,

用DS18B20做的電子溫度計,非常簡單。

#include <reg51.h>
#include\"AscLed.h\"
#include <intrins.h>
#include <stdio.h>
//********************************************************
#define Seck (500/TK) //1秒中的主程序的系數
#define OffLed (Seck*5*60) //自動關機的時間5分鍾!
//********************************************************
#if (FHz==0)
#define NOP_2uS_nop_()
#else
#define NOP_2uS_nop_();_nop_()
#endif
//**************************************
#define SkipK 0xcc //跳過命令
#define ConvertK 0x44 //轉化命令
#define RdDs18b20K 0xbe //讀溫度命令
//*******************************************
extern LedOut(void);
//*************************************************
sbit PNP1=P3^4;
sbit PNP2=P3^5;
sbit BEEP=P3^2;
//***********************************
#defineDQ PNP2 //原來的PNP2 BEEP
//***********************************
static unsigned char Power=0;
//************************************
union{
unsigned char Temp[2]; //單位元組溫度
unsigned int Tt; //2位元組溫度
}T;
//***********************************************
typedef struct{
unsigned char Flag; //正數標志 0;1==》負數
unsigned char WenDu; //溫度整數
unsigned int WenDuDot; //溫度小數放大了10000

}WENDU;
//***********************************************
WENDU WenDu;
unsigned char LedBuf[3];
//----------------------------------
//功能:10us 級別延時
// n=1===> 6Mhz=14uS 12MHz=7uS
//----------------------------------
void Delay10us(unsigned char n){

do{
#if (FHz==1)
NOP_2uS;NOP_2uS;
#endif
}while(--n);
}
//-----------------------------------
//功能:寫18B20
//-----------------------------------
void Write_18B20(unsigned char n){
unsigned char i;
for(i=0;i<8;i++){
DQ=0;
Delay10us(1);//延時13us 左右
DQ=n & 0x01;
n=n>>1;
Delay10us(5);//延時50us 以上
DQ=1;
}
}
//------------------------------------
//功能:讀取18B20
//------------------------------------
unsigned char Read_18B20(void){
unsigned char i;
unsigned char temp;
for(i=0;i<8;i++){
temp=temp>>1;
DQ=0;
NOP_2uS;//延時1us
DQ=1;
NOP_2uS;NOP_2uS;//延時5us
if(DQ==0){
temp=temp&0x7F;
}else{
temp=temp|0x80;
}
Delay10us(5);//延時40us
DQ=1;
}
return temp;
}
//-----------------------------------
void Init (void){
DQ=0;
Delay10us(45);//延時500us
DQ=1;
Delay10us(9);//延時90us
if(DQ){ //0001 1111b=1f
Power =0; //失敗0
}else{
Power++;
DQ=1;
}
}
//----------------------------------
void Skip(void){
Write_18B20(SkipK);
Power++;
}
//----------------------------------
void Convert (void){
Write_18B20(ConvertK);
Power++;
}
//______________________________________
void Get_Ds18b20L (void){
T.Temp[1]=Read_18B20(); //讀低位
Power++;
}
//______________________________________
void Get_Ds18b20H (void){
T.Temp[0]=Read_18B20(); //讀高位
Power++;
}
//------------------------------------
//規范化成浮點數
// sssss111;11110000
// sssss111;1111(0.5,0.25,0.125,0.0625)
//------------------------------------
void ReadTemp (void){
unsigned char i;
unsigned intF1=0;
char j=1;
code int Code_F[]={6250,1250,2500,5000};

WenDu.Flag=0;

if (T.Temp[0] >0x80){ //負溫度
T.Tt =~T.Tt+1; //取反+1=源嗎 +符號S
WenDu.Flag=-1;
}
T.Tt <<= 4; //左移4位
WenDu.WenDu=T.Temp[0]; // 溫度整數
//**************************************************
T.Temp[1]>>=4;
//---------------------------
for (i=0;i<4;i++){ //計算小數位
F1 +=(T.Temp[1] & 0x01)*Code_F;
T.Temp[1]>>=1;
}
WenDu.WenDuDot=F1; //溫度的小數
Power=0;
}
//----------------------------------
void Delay1S (void){
static unsigned int i=0;

if (++i==Seck) {i=0ower++;}
}
//----------------------------------
void ReadDo (void){
Write_18B20(RdDs18b20K);
Power++;
}
/**********************************
函數指針定義
***********************************/
code void (code *SubTemp[])()={
Init,Skip,Convert,Delay1S,Init,Skip,ReadDo,Get_Ds18b20L,
Get_Ds18b20H,ReadTemp
};
//**************************************
void GetTemp(void){
(*SubTemp[Power])();
}
//---------------------------------------------------
//將溫度顯示,小數點放大了10000.
void GetBcd(void){
LedBuf[0]=WenDu.WenDu / 10;
LedBuf[1]=WenDu.WenDu % 10 +DotK;
LedBuf[2]=(WenDu.WenDuDot/1000)%10;

if(LedBuf[0]==0)LedBuf[0]=Black;

if(WenDu.Flag==0) return;
if(LedBuf[0] !=Black){
LedBuf[2]=LedBuf[1];
LedBuf[1]=LedBuf[0];
LedBuf[0]=Led_Pol; //'-'
}else{
LedBuf[0]=Led_Pol; //'-'
}
}
/*
//---------------------------------------------------
void JbDelay (void){
static long i;
if (++i>=OffLed){
P1=0xff;
P2=0xff;
PCON=0x02;
}
}
*/
/*****************************************************
主程序開始
1:2002_10_1 設計,採用DS18B20測量
2:採用函數數組讀取DS18B20.LED數碼管顯示正常!
3:改變FHz可以用6,12MHz工作!
******************************************************/
code unsigned char Stop[3] _at_ 0x3b;
void main (void){
P1=0xff;
WenDu.WenDu=0;
while (1){
GetTemp();
GetBcd();
// JbDelay();
LedOut();
}
}
復制代碼
20091012_[1].jpg (12 KB)

2009-10-21 23:21 上傳
下載次數:0

⑶ 基於單片機的溫度檢測,使用熱敏電阻和ADC0809,已知電阻和溫度的關系,不知道怎麼通過數字量顯示溫度。

這個好辦:
256個數字量表示的是0到100°,
即第1個數字量表示0°,
第256個數字量表示100°,
O(∩_∩)O~
這個就得知道溫度和輸出電壓的關系了,
這個可以通過溫度—電阻—電壓的關系找出來,
找出來之後,由於輸出電壓和數字量是線性的,可以列一個表,上面表示數字量和溫度的對應關系,
其中第一個數字量對應0℃,第256個數字量對應100℃是不變的。

⑷ 基於單片機的溫度檢測及其顯示電路板要哪些元件用的C51單片機。DS18B20溫度感測器。1602液晶顯示器,

你可以買現成的851開發板,從幾十到200元的都有,還附帶各種程序。給你個截圖

#include<REG52.H>程序太長傳不完,把時鍾部分刪了,其他自己看吧

#include<intrins.h>

#defineuintunsignedint

#defineucharunsignedchar

sbitDS1302_CLK=P1^1;//實時時鍾時鍾線引腳

sbitDS1302_IO=P1^2;//實時時鍾數據線引腳

sbitDS1302_RST=P1^3;//實時時鍾復位線引腳

sbitwireless_1=P3^0;

sbitwireless_2=P3^1;

sbitwireless_3=P3^2;

sbitwireless_4=P3^3;

sbitACC0=ACC^0;

sbitACC7=ACC^7;

charhide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;//秒,分,時到日,月,年位閃的計數

sbitSet=P3^4;//模式切換鍵

sbitUp=P3^5;//加法按鈕

sbitDown=P3^6;//減法按鈕

sbitout=P3^7;//立刻跳出調整模式按鈕

sbitDQ=P1^0;//溫度傳送數據IO口

chardone,count,temp,flag,up_flag,down_flag;

uchartemp_value;//溫度值

ucharTempBuffer[5],week_value[2];

voidshow_time();//液晶顯示程序

/***********1602液晶顯示部分子程序****************/

sbitLcdRs =P2^2;

sbitLcdRw =P2^1;

sbitLcdEn =P2^0;

sfrDBPort =0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據埠

//內部等待函數**************************************************************************

unsignedcharLCD_Wait(void)

{

LcdRs=0;

LcdRw=1; _nop_();

LcdEn=1; _nop_();

LcdEn=0;

returnDBPort;

}

//向LCD寫入命令或數據************************************************************

#defineLCD_COMMAND 0//Command

#defineLCD_DATA 1//Data

#defineLCD_CLEAR_SCREEN 0x01//清屏

#defineLCD_HOMING 0x02//游標返回原點

voidLCD_Write(bitstyle,unsignedcharinput)

{

LcdEn=0;

LcdRs=style;

LcdRw=0; _nop_();

DBPort=input; _nop_();//注意順序

LcdEn=1; _nop_();//注意順序

LcdEn=0; _nop_();

LCD_Wait();

}

//設置顯示模式************************************************************

#defineLCD_SHOW 0x04//顯示開

#defineLCD_HIDE 0x00//顯示關

#defineLCD_CURSOR 0x02 //顯示游標

#defineLCD_NO_CURSOR 0x00//無游標

#defineLCD_FLASH 0x01//游標閃動

#defineLCD_NO_FLASH 0x00//游標不閃動

voidLCD_SetDisplay(unsignedcharDisplayMode)

{

LCD_Write(LCD_COMMAND,0x08|DisplayMode);

}

//設置輸入模式************************************************************

#defineLCD_AC_UP 0x02

#defineLCD_AC_DOWN 0x00//default

#defineLCD_MOVE 0x01//畫面可平移

#defineLCD_NO_MOVE 0x00//default

voidLCD_SetInput(unsignedcharInputMode)

{

LCD_Write(LCD_COMMAND,0x04|InputMode);

}

//初始化LCD************************************************************

voidLCD_Initial()

{

LcdEn=0;

LCD_Write(LCD_COMMAND,0x38);//8位數據埠,2行顯示,5*7點陣

LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//開啟顯示,無游標

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC遞增,畫面不動

}

//液晶字元輸入的位置************************

voidGotoXY(unsignedcharx,unsignedchary)

{

if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);

if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40));

}

//將字元輸出到液晶顯示

voidPrint(unsignedchar*str)

{

while(*str!='')

{

LCD_Write(LCD_DATA,*str);

str++;

}

}

/***********DS1302時鍾部分子程序******************/

typedefstruct__SYSTEMTIME__

{

unsignedcharSecond;

unsignedcharMinute;

unsignedcharHour;

unsignedcharWeek;

unsignedcharDay;

unsignedcharMonth;

unsignedcharYear;

unsignedcharDateString[11];

unsignedcharTimeString[9];

}SYSTEMTIME; //定義的時間類型

SYSTEMTIMECurrentTime;

#defineAM(X) X

#definePM(X) (X+12) //轉成24小時制

#defineDS1302_SECOND 0x80//時鍾晶元的寄存器位置,存放時間

#defineDS1302_MINUTE 0x82

#defineDS1302_HOUR 0x84

#defineDS1302_WEEK 0x8A

#defineDS1302_DAY 0x86

#defineDS1302_MONTH 0x88

#defineDS1302_YEAR 0x8C

voidDS1302InputByte(unsignedchard) //實時時鍾寫入一位元組(內部函數)

{

unsignedchari;

ACC=d;

for(i=8;i>0;i--)

{

DS1302_IO=ACC0; //相當於匯編中的RRC

DS1302_CLK=1;

DS1302_CLK=0;

ACC=ACC>>1;

}

}

unsignedcharDS1302OutputByte(void) //實時時鍾讀取一位元組(內部函數)

{

unsignedchari;

for(i=8;i>0;i--)

{

ACC=ACC>>1; //相當於匯編中的RRC

ACC7=DS1302_IO;

DS1302_CLK=1;

DS1302_CLK=0;

}

return(ACC);

}

voidWrite1302(unsignedcharucAddr,unsignedcharucDa) //ucAddr:DS1302地址,ucData:要寫的數據

{

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

DS1302InputByte(ucAddr); //地址,命令

DS1302InputByte(ucDa); //寫1Byte數據

DS1302_CLK=1;

DS1302_RST=0;

}

unsignedcharRead1302(unsignedcharucAddr) //讀取DS1302某地址的數據

{

unsignedcharucData;

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

DS1302InputByte(ucAddr|0x01);//地址,命令

ucData=DS1302OutputByte();//讀1Byte數據

DS1302_CLK=1;

DS1302_RST=0;

return(ucData);

}

voidDS1302_GetTime(SYSTEMTIME*Time)//獲取時鍾晶元的時鍾數據到自定義的結構型數組

{

/***********ds18b20子程序*************************/

/***********ds18b20延遲子函數(晶振12MHz)*******/

voiddelay_18B20(unsignedinti)

{

while(i--);

}

/**********ds18b20初始化函數**********************/

voidInit_DS18B20(void)

{

unsignedcharx=0;

DQ=1;//DQ復位

delay_18B20(8);//稍做延時

DQ=0;//單片機將DQ拉低

delay_18B20(80);//精確延時大於480us

DQ=1;//拉高匯流排

delay_18B20(14);

x=DQ;//稍做延時後如果x=0則初始化成功x=1則初始化失敗

delay_18B20(20);

}

/***********ds18b20讀一個位元組**************/

unsignedcharReadOneChar(void)

{

uchari=0;

uchardat=0;

for(i=8;i>0;i--)

{

DQ=0;//給脈沖信號

dat>>=1;

DQ=1;//給脈沖信號

if(DQ)

dat|=0x80;

delay_18B20(4);

}

return(dat);

}

/*************ds18b20寫一個位元組****************/

voidWriteOneChar(uchardat)

{

unsignedchari=0;

for(i=8;i>0;i--)

{

DQ=0;

DQ=dat&0x01;

delay_18B20(5);

DQ=1;

dat>>=1;

}

}

/**************讀取ds18b20當前溫度************/

voidReadTemp(void)

{

unsignedchara=0;

unsignedcharb=0;

unsignedchart=0;

Init_DS18B20();

WriteOneChar(0xCC); //跳過讀序號列號的操作

WriteOneChar(0x44); //啟動溫度轉換

delay_18B20(100);//thismessageisweryimportant

Init_DS18B20();

WriteOneChar(0xCC); //跳過讀序號列號的操作

WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器)前兩個就是溫度

delay_18B20(100);

a=ReadOneChar(); //讀取溫度值低位

b=ReadOneChar(); //讀取溫度值高位

temp_value=b<<4;

temp_value+=(a&0xf0)>>4;

}

voidtemp_to_str()//溫度數據轉換成液晶字元顯示

{

TempBuffer[0]=temp_value/10+'0';//十位

TempBuffer[1]=temp_value%10+'0';//個位

TempBuffer[2]=0xdf;//溫度符號

TempBuffer[3]='C';

TempBuffer[4]='';

}

voidDelay1ms(unsignedintcount)

{

unsignedinti,j;

for(i=0;i<count;i++)

for(j=0;j<120;j++);

}

/*延時子程序*/

voidmdelay(uintdelay)

{ uinti;

for(;delay>0;delay--)

{for(i=0;i<62;i++)//1ms延時.

{;}

}

}

voidoutkey()//跳出調整模式,返回默認顯示

{ucharSecond;

if(out==0||wireless_1==1)

{mdelay(8);

count=0;

hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;

Second=Read1302(DS1302_SECOND);

Write1302(0x8e,0x00);//寫入允許

Write1302(0x80,Second&0x7f);

Write1302(0x8E,0x80);//禁止寫入

done=0;

while(out==0);

while(wireless_1==1);

}

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////

voidUpkey()//升序按鍵

{

Up=1;

if(Up==0||wireless_2==1)

{

mdelay(8);

switch(count)

{case1:

temp=Read1302(DS1302_SECOND);//讀取秒數

temp=temp+1;//秒數加1

up_flag=1;//數據調整後更新標志

if((temp&0x7f)>0x59)//超過59秒,清零

temp=0;

break;

case2:

temp=Read1302(DS1302_MINUTE);//讀取分數

temp=temp+1;//分數加1

up_flag=1;

if(temp>0x59)//超過59分,清零

temp=0;

break;

case3:

temp=Read1302(DS1302_HOUR);//讀取小時數

temp=temp+1;//小時數加1

up_flag=1;

if(temp>0x23)//超過23小時,清零

temp=0;

break;

case4:

temp=Read1302(DS1302_WEEK);//讀取星期數

temp=temp+1;//星期數加1

up_flag=1;

if(temp>0x7)

temp=1;

break;

case5:

temp=Read1302(DS1302_DAY);//讀取日數

temp=temp+1;//日數加1

up_flag=1;

if(temp>0x31)

temp=1;

break;

case6:

temp=Read1302(DS1302_MONTH);//讀取月數

temp=temp+1;//月數加1

up_flag=1;

if(temp>0x12)

temp=1;

break;

case7:

temp=Read1302(DS1302_YEAR);//讀取年數

temp=temp+1;//年數加1

up_flag=1;

if(temp>0x85)

temp=0;

break;

default:break;

}

while(Up==0);

while(wireless_2==1);

}

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////

voidDownkey()//降序按鍵

{

Down=1;

if(Down==0||wireless_3==1)

{

mdelay(8);

switch(count)

{case1:

temp=Read1302(DS1302_SECOND);//讀取秒數

temp=temp-1; //秒數減1

down_flag=1;//數據調整後更新標志

if(temp==0x7f)//小於0秒,返回59秒

temp=0x59;

break;

case2:

temp=Read1302(DS1302_MINUTE);//讀取分數

temp=temp-1;//分數減1

down_flag=1;

if(temp==-1)

temp=0x59;//小於0秒,返回59秒

break;

case3:

temp=Read1302(DS1302_HOUR);//讀取小時數

temp=temp-1;//小時數減1

down_flag=1;

if(temp==-1)

temp=0x23;

break;

case4:

temp=Read1302(DS1302_WEEK);//讀取星期數

temp=temp-1;//星期數減1

down_flag=1;

if(temp==0)

temp=0x7;;

break;

case5:

temp=Read1302(DS1302_DAY);//讀取日數

temp=temp-1;//日數減1

down_flag=1;

if(temp==0)

temp=31;

break;

case6:

temp=Read1302(DS1302_MONTH);//讀取月數

temp=temp-1;//月數減1

down_flag=1;

if(temp==0)

temp=12;

break;

case7:

temp=Read1302(DS1302_YEAR);//讀取年數

temp=temp-1;//年數減1

down_flag=1;

if(temp==-1)

temp=0x85;

break;

default:break;

}

while(Down==0);

while(wireless_3==1);

}

}

voidSetkey()//模式選擇按鍵

{

Set=1;

if(Set==0||wireless_4==1)

{

mdelay(8);

count=count+1; //Setkey按一次,count就加1

done=1; //進入調整模式

while(Set==0);

while(wireless_4==1);

}

}

voidkeydone()//按鍵功能執行

{ucharSecond;

if(flag==0)//關閉時鍾,停止計時

{Write1302(0x8e,0x00);//寫入允許

temp=Read1302(0x80);

Write1302(0x80,temp|0x80);

Write1302(0x8e,0x80);//禁止寫入

flag=1;

}

Setkey(); //掃描模式切換按鍵

switch(count)

{case1:do //count=1,調整秒

{

outkey(); //掃描跳出按鈕

Upkey();//掃描加按鈕

Downkey();//掃描減按鈕

if(up_flag==1||down_flag==1)//數據更新,重新寫入新的數據

{

Write1302(0x8e,0x00);//寫入允許

Write1302(0x80,temp|0x80);//寫入新的秒數

Write1302(0x8e,0x80);//禁止寫入

up_flag=0;

down_flag=0;

}

hide_sec++;//位閃計數

if(hide_sec>3)

hide_sec=0;

show_time();//液晶顯示數據

}while(count==2);break;

case2:do //count=2,調整分

{

hide_sec=0;

outkey();

Upkey();

Downkey();

if(temp>0x60)

temp=0;

if(up_flag==1||down_flag==1)

{

Write1302(0x8e,0x00);//寫入允許

Write1302(0x82,temp);//寫入新的分數

Write1302(0x8e,0x80);//禁止寫入

up_flag=0;

down_flag=0;

}

hide_min++;

if(hide_min>3)

hide_min=0;

show_time();

}while(count==3);break;

case3:do //count=3,調整小時

{

hide_min=0;

outkey();

Upkey();

Downkey();

if(up_flag==1||down_flag==1)

{

Write1302(0x8e,0x00);//寫入允許

Write1302(0x84,temp);//寫入新的小時數

Write1302(0x8e,0x80);//禁止寫入

up_flag=0;

down_flag=0;

}

hide_hour++;

if(hide_hour>3)

hide_hour=0;

show_time();

}while(count==4);break;

case4:do //count=4,調整星期

{

hide_hour=0;

outkey();

Upkey();

Downkey();

if(up_flag==1||down_flag==1)

{

Write1302(0x8e,0x00);//寫入允許

Write1302(0x8a,temp);//寫入新的星期數

Write1302(0x8e,0x80);//禁止寫入

up_flag=0;

down_flag=0;

}

hide_week++;

if(hide_week>3)

hide_week=0;

show_time();

}while(count==5);break;

case5:do //count=5,調整日

{

hide_week=0;

outkey();

Upkey();

Downkey();

if(up_flag==1||down_flag==1)

{

Write1302(0x8e,0x00);//寫入允許

Write1302(0x86,temp);//寫入新的日數

Write1302(0x8e,0x80);//禁止寫入

up_flag=0;

down_flag=0;

}

hide_day++;

if(hide_day>3)

hide_day=0;

show_time();

}while(count==6);break;

case6:do //count=6,調整月

{

hide_day=0;

outkey();

Upkey();

Downkey();

if(up_flag==1||down_flag==1)

{

Write1302(0x8e,0x00);//寫入允許

Write1302(0x88,temp);//寫入新的月數

Write1302(0x8e,0x80);//禁止寫入

up_flag=0;

down_flag=0;

}

hide_month++;

if(hide_month>3)

hide_month=0;

show_time();

}while(count==7);break;

case7:do //count=7,調整年

{

hide_month=0;

outkey();

Upkey();

Downkey();

if(up_flag==1||down_flag==1)

{

Write1302(0x8e,0x00);//寫入允許

Write1302(0x8c,temp);//寫入新的年數

Write1302(0x8e,0x80);//禁止寫入

up_flag=0;

down_flag=0;

}

hide_year++;

if(hide_year>3)

hide_year=0;

show_time();

}while(count==8);break;

case8:count=0;hide_year=0;//count8,跳出調整模式,返回默認顯示狀態

Second=Read1302(DS1302_SECOND);

Write1302(0x8e,0x00);//寫入允許

Write1302(0x80,Second&0x7f);

Write1302(0x8E,0x80);//禁止寫入

done=0;

break;//count=7,開啟中斷,標志位置0並退出

default:break;

}

}

voidshow_time()//液晶顯示程序

{

DS1302_GetTime(&CurrentTime);//獲取時鍾晶元的時間數據

TimeToStr(&CurrentTime);//時間數據轉換液晶字元

DateToStr(&CurrentTime);//日期數據轉換液晶字元

ReadTemp();//開啟溫度採集程序

temp_to_str();//溫度數據轉換成液晶字元

GotoXY(12,1);//液晶字元顯示位置

Print(TempBuffer);//顯示溫度

GotoXY(0,1);

Print(CurrentTime.TimeString);//顯示時間

GotoXY(0,0);

Print(CurrentTime.DateString);//顯示日期

GotoXY(15,0);

Print(week_value);//顯示星期

GotoXY(11,0);

Print("Week"); //在液晶上顯示字母week

Delay1ms(400);//掃描延時

}

main()

{

flag=1;//時鍾停止標志

LCD_Initial();//液晶初始化

Init_DS18B20();//DS18B20初始化

Initial_DS1302();//時鍾晶元初始化

up_flag=0;

down_flag=0;

done=0;//進入默認液晶顯示

wireless_1=0;

wireless_2=0;

wireless_3=0;

wireless_4=0;

while(1)

{

while(done==1)

keydone();//進入調整模式

while(done==0)

{

show_time();//

⑸ 基於單片機控制的多點溫度檢測當感測器檢測到溫度為20度時,對應的信號是多少闡述一下原理

感測器是DS18B20,肯定是要寫程序測量溫度的,讀出的數據是16進制數,肯定要進行計算的,計算出十進制的溫度的,而且通常是要保留一位小數,所以,結果都是乘10,即一位小數在內部變成個位,顯示時,加個小數點,就顯示成小數了,但內部是個位。同理,內部是十位數的,顯示出來是個位,內部是百位的,顯示出來是十位。
這樣的話,經過計算後的溫度,溫度為20度時,內部對應的是200。

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


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

⑺ 基於單片機的溫度數據採集系統設計

單片機課程設計任務書

題目:基於單片機的溫度數據採集系統設計
一.設計要求
1.被測量溫度范圍:0~500℃,溫度解析度為0.5℃。
2.被測溫度點:4個,每2秒測量一次。
3.顯示器要求:通道號1位,溫度4位(精度到小數點後一位)。
顯示方式為定點顯示和輪流顯示。
4.鍵盤要求:
(1)定點顯示設定;(2)輪流顯示設定;(3)其他功能鍵。
二.設計內容
1.單片機及電源管理模塊設計。
單片機可選用AT89S51及其兼容系列,電源管理模塊要實
現高精密穩壓輸出,為單片機及A/D轉換器供電。
2.感測器及放大器設計。
感測器可以選用鎳鉻—鎳硅熱電偶(分度號K),放大器要實現熱電偶輸出的mV級信號到A/D輸入V級信號放大。
3.多路轉換開關及A/D轉換器設計。
多路開關可以選用CD4052,A/D可選用MC14433等。
4.顯示器設計。
可以選用LED顯示或LCD顯示。
5.鍵盤電路設計。
實現定點顯示按鍵;輪流顯示按鍵;其他功能鍵。
6.系統軟體設計。
系統初始化模塊,鍵盤掃描模塊,顯示模塊,數據採集模塊,標度變換模塊等。

引言:
在生產和日常生活中,溫度的測量及控制十分重要,實時溫度檢測系統在各個方面應用十分廣泛。消防電氣的非破壞性溫度檢測,大型電力、通訊設備過熱故障預知檢測,各類機械組件的過熱預警,醫療相關設備的溫度測試等等都離不開溫度數據採集控制系統。
隨著科學技術的發展,電子學技術也隨之迅猛發展,同時帶動了大批相關產業的發展,其應用范圍也越來越廣泛。近年來單片機發展也同樣十分迅速,單片機已經滲透到工業、農業、國防等各個領域,單片機以其體積小,可靠性高,造價低,開發周期短的特點被廣泛推廣與應用。傳統的溫度採集不僅耗時而且精度低,遠不能滿足各行業對溫度數據高精度,高可靠性的要求。溫度的控制及測量對保證產品質量、提高生產效率、節約能源、生產安全、促進國民經濟的發展起到重要作用。在單片機溫度測量系統中關鍵是測量溫度,控制溫度和保持溫度。溫度測量是工業對象的主要被控參數之一。本此題目的總體功能就是利用單片機和熱敏原件實現溫度的採集與讀數,利用五位LED顯示溫度讀數和所選通道號,實現熱電轉化,實現溫度的精確測量。本設計是以Atmel公司的AT89S51單片機為控制核心,通過MC14433模數轉換對所測的溫度進行數字量變化,且通過數碼管進行相應的溫度顯示。採用微機進行溫度檢測,數字顯示,信息存儲及實時控制,對於提高生產效率和產品質量、節約能源等都有重要作用。
目錄:
一、系統總體功能及技術指標的描述........................................ 5
二、各模塊電路原理描述............................................................. 5
2.1單片機及電源模塊設計...................................................... 5
2.2、AT89S51引腳說明.......................................................... 7
2.3、數據採集模塊設計........................................................ 11
2.4、多路開關......................................................................... 12
2.5、放大器............................................................................. 15
2.6、A/D轉換器..................................................................... 16
2.7、顯示器設計..................................................................... 21
2.8、鍵盤電路設計................................................................. 22
2.9、電路總體設計圖........................................................... 22
三、軟體流程圖 ...................................................................... 24
四、程序清單.............................................................................. 25
五、設計總結及體會.................................................................... 31
六、參考資料................................................................................ 32

一、系統總體功能及技術指標的描述
1. 系統的總體功能:
溫度數據採集系統,實現溫度的採集與讀書,利用五位LED顯示溫度讀數和所選通道號,實現熱電轉化的原理過程。
被測量溫度范圍:0~500℃,溫度解析度為0.5℃。被測溫度點4個,每2秒測量一次。顯示器要求:通道號1位,溫度4位(精度到小數點後一位)。顯示方式為定點顯示和輪流顯示,可以通過按鍵改變顯示方式。
2. 技術指標要求:
1.被測量溫度范圍:0~500℃,溫度解析度為0.5℃。
2.被測溫度點:4個,每2秒測量一次。
3.顯示器要求:通道號1位,溫度4位(精度到小數點後一位)。
顯示方式為定點顯示和輪流顯示。
4.鍵盤要求:
(1)定點顯示設定;(2)輪流顯示設定;(3)其他功能鍵。
二、各模塊電路原理描述
2.1單片機及電源模塊設計
如圖所示為AT89S51晶元的引腳圖。兼容標准MCS-51指令系統的AT89S51單片機是一個低功耗、高性能CHMOS的單片機,片內含4KB在線可編程Flash存儲器的單片機。它與通用80C51系列單片機的指令系統和引腳兼容。
AT89S51單片機片內的Flash可允許在線重新編程,也可用通用非易失性存儲編程器編程;片內數據存儲器內含128位元組的RAM;有40個引腳,32個外部雙向輸入/輸出(I/O)埠;具有兩個16位可編程定時器;中斷系統是具有6個中斷源、5個中斷矢量、2級中斷優先順序的中斷結構;震盪器頻率0到33MHZ,因此我們在此選用12MHZ的晶振是比較合理的;具有片內看門狗定時器;具有斷電標志POF等等。AT89S51具有PDIP、TQFP和PLCC三種封裝形式[8]。

圖5.1-1 AT89S51引腳圖

上圖就是PDIP封裝的引腳排列,下面介紹各引腳的功能。
2.2、AT89S51引腳說明
P0口:8位、開漏級、雙向I/O口。P0口可作為通用I/O口,但須外接上拉電阻;作為輸出口,每各引腳可吸收8各TTL的灌電流。作為輸入時,首先應將引腳置1。P0也可用做訪問外部程序存儲器和數據存儲器時的低8位地址/數據匯流排的復用線。在該模式下,P0口含有內部上拉電阻。在FLASH編程時,P0口接收代碼位元組數據;在編程效驗時,P0口輸出代碼位元組數據(需要外接上拉電阻)。
P1口:8位、雙向I/0口,內部含有上拉電阻。P1口可作普通I/O口。輸出緩沖器可驅動四個TTL負載;用作輸入時,先將引腳置1,由片內上拉電阻將其抬到高電平。P1口的引腳可由外部負載拉到低電平,通過上拉電阻提供電流。在FLASH並行編程和校驗時,P1口可輸入低位元組地址。在串列編程和效驗時,P1.5/MO-SI,P1.6/MISO和P1.7/SCK分別是串列數據輸入、輸出和移位脈沖引腳。
P2口:具有內部上拉電阻的8位雙向I/O口。P2口用做輸出口時,可驅動4各TTL負載;用做輸入口時,先將引腳置1,由內部上拉電阻將其提高到高電平。若負載為低電平,則通過內部上拉電阻向外部輸出電流。CPU訪問外部16位地址的存儲器時,P2口提供高8位地址。當CPU用8位地址定址外部存儲時,P2口為P2特殊功能寄存器的內容。在FLASH並行編程和校驗時,P2口可輸入高位元組地址和某些控制信號。
P3口:具有內部上拉電阻的8位雙向口。P3口用做輸出口時,輸出緩沖器可吸收4各TTL的灌電流;用做輸入口時,首先將引腳置1,由內部上拉電阻抬位高電平。若外部的負載是低電平,則通過內部上拉電阻向輸出電流。在與FLASH並行編程和校驗時,P3口可輸入某些控制信號。P3口除了通用I/O口功能外,還有替代功能,如表5.3-1所示。

表5.3-1 P3口的替代功能

引腳

符號

說明

P3.0

RXD

串列口輸入

P3.1

TXD

串列口輸出

P3.2

/INT0

外部中斷0

P3.3

/INT1

外部中斷1

P3.4

T0

T0定時器的外部的計數輸入

P3.5

T1

T1定時器的外部的計數輸入

P3.6

/WR

外部數據存儲器的寫選通

P3.7

/RD

外部數據存儲器的讀選通

RST:復位端。當振盪器工作時,此引腳上出現兩個機器周期的高電平將系統復位。
ALE/ :當訪問外部存儲器時,ALE(允許地址鎖存)是一個用於鎖存地址的低8位位元組的書粗脈沖。在Flash 編程期間,此引腳也可用於輸入編程脈沖()。在正常操作情況下,ALE以振盪器頻率的1/6的固定速率發出脈沖,它是用作對外輸出的時鍾,需要注意的是,每當訪問外部數據存儲器時,將跳過一個ALE脈沖。如果希望禁止ALE操作,可通過將特殊功能寄存器中位地址為8EH那位置的「0」來實現。該位置的「1」後。ALE僅在MOVE或MOVC指令期間激活,否則ALE引腳將被略微拉高。若微控制器在外部執行方式,ALE禁止位無效。
:外部程序存儲器讀選取通信號。當AT89S51在讀取外部程序時, 每個機器周期 將PSEN激活兩次。在此期間內,每當訪問外部數據存儲器時,將跳過兩個信號。
/Vpp:訪問外部程序存儲器允許端。為了能夠從外部程序存儲器的0000H至FFFFH單元中取指令,必須接地,然而要注意的是,若對加密位1進行編程,則在復位時,的狀態在內部被鎖存。
執行內部程序應接VCC。不當選擇12V編程電源時,在Flash編程期間,這個引腳可接12V編程電壓。
XTAL1:振盪器反向放大器輸入端和內部時鍾發生器的輸入端。
XTAL2:振盪器反相放大器輸出端[9]。

電源模塊設計
在影響單片機系統可靠性的諸多因素中,電源干擾可謂首屈一指,據統計,計算機應用系統的運行故障有90%以上是由電源雜訊引起的。為了提高系統供電可靠性,交流供電應採用交流穩壓器,防止電源的過壓和欠壓,直流電源抗干擾措施有採用高質量集成穩壓電路單獨供電,採用直流開關電源,採用DC-DC變換器。本次設計決定採用MAXim公司的高電壓低功耗線性變換器MAX 1616作為電壓變換,採用該器件將輸入的24V電壓變換為5V電壓,給外圍5V的器件供電。MAX1616具有如下特點:
1.4~28V電壓輸入范圍。
2.最大80uA的靜態工作電流。
3.3V/5V電壓可選輸出。
4.30mA輸出電流。
5.2%的電壓輸出精度。
電源管理模塊電路圖如下:

本電路採用該器件將輸入的24V電壓變成5V電壓,給外圍5V的器件供電,其中二極體D1是保護二極體,防止輸入電壓接反可能帶來的對電路的影響和破壞。

閱讀全文

與基於單片機的溫度檢測相關的資料

熱點內容
天津市伺服器供應商雲伺服器 瀏覽:107
數控車床子程序編程 瀏覽:107
floydwarshall演算法 瀏覽:715
丟失微信app怎麼找 瀏覽:250
php能寫前端嗎 瀏覽:5
伺服器如何更改raid模式 瀏覽:90
方舟伺服器怎麼導出來 瀏覽:608
手機顯示伺服器異常什麼鬼 瀏覽:379
新聞伺服器的網址是什麼 瀏覽:669
程序員年底招人 瀏覽:319
廣發app怎麼查房貸 瀏覽:860
安卓手機怎麼下土豆 瀏覽:921
只有一個app顯示網路異常怎麼回事 瀏覽:988
解壓玩具是水寶寶 瀏覽:817
壓縮機保護怎麼解決 瀏覽:944
單片機簡易電子時鍾 瀏覽:402
pdf影印版 瀏覽:689
單片機的中斷技術 瀏覽:626
表格加密才能打開 瀏覽:39
多態可以提高編譯可靠性嗎 瀏覽:599