导航:首页 > 操作系统 > 基于单片机的温度检测

基于单片机的温度检测

发布时间: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是保护二极管,防止输入电压接反可能带来的对电路的影响和破坏。

阅读全文

与基于单片机的温度检测相关的资料

热点内容
事业编程序员下班时间 浏览:7
linux中命令大全 浏览:36
pic单片机学习网站 浏览:163
843除6的算法 浏览:376
arduino编程视频 浏览:744
pdf背景绿色 浏览:612
记事本dos命令 浏览:274
服务器如何搭建多个节点 浏览:326
acx算法 浏览:258
幽冥诡匠漫画全集用什么app可以看 浏览:1002
租用服务器为什么越来越慢 浏览:962
算法创新就业方向 浏览:424
算法最优解作者 浏览:869
通达信红绿宝塔线指标源码 浏览:668
app是什么东西合法吗 浏览:233
怎么锁app视频教程 浏览:842
迅捷pdf注册码生成器 浏览:750
androidsdkosx 浏览:304
压缩面膜纸荧光 浏览:842
app怎么分身三个 浏览:746