问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用单片机做温度检测系统 论文,

发布网友 发布时间:2022-04-28 11:50

我来回答

3个回答

热心网友 时间:2023-10-08 16:55

用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_8b1ef92155560c13b5807ZmoDVSacjwD[1].jpg (12 KB)

2009-10-21 23:21 上传
下载次数:0

参考资料:http://www.ziwai.net/forum.php?mod=viewthread&tid=737&extra=page%3D1

热心网友 时间:2023-10-08 16:56

  这是我自己用DS18B20做的温度检测程序,复制给你看看,我这是通过串口可以在电脑上的串口助手上显示出实时的温度:
  #include<reg52.h>
  #include<stdio.h>
  #define uint unsigned int
  #define uchar unsigned char
  sbit ds=P1^0;
  bit flag;
  uchar count_t0;
  float f_temp;
  void delay(uint z)
  {
  uint x,y;
  for(x=z;x>0;x--)
  for(y=122;y>0;y--);
  }
  void init() // 串口初始化
  {
  TMOD=0x21;
  SCON=0x50;
  TH0=0x4c;
  TL0=0x00;
  TH1=0xf3;
  TL1=0xf3;
  EA=1;
  ET0=1;
  TR0=1;
  TR1=1;
  }
  void timer0() interrupt 1
  {
  TH0=0x4c;
  TL0=0x00;
  if(++count_t0>=20)
  {
  count_t0=0;
  flag=1;
  }
  }
  void dsreset()
  {
  uint i;
  ds=0;
  i=103;
  while(i>0)
  i--;
  ds=1;
  i=4;
  while(i>0)
  i--;
  }
  bit read_bit()
  {
  uint i;
  bit dat;
  ds=0;i++;
  ds=1;i++;i++;
  dat=ds;
  i=8;
  while(i>0)
  i--;
  return dat;
  }
  uchar read_byte()
  {
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
  j=read_bit();
  dat=(j<<7)|(dat>>1);
  }
  return dat;
  }
  void write_byte(uchar dat)
  {
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
  testb=dat&0x01;
  dat=dat>>1;
  if(testb)
  {
  ds=0;
  i++;i++;
  ds=1;
  i=8;
  while(i>0)
  i--;
  }
  else
  {
  ds=0;
  i=8;
  while(i>0)
  i--;
  ds=1;
  i++;i++;
  }
  }
  }
  void begin_change()
  {
  dsreset();
  delay(1);
  write_byte(0xcc);
  write_byte(0x44);
  }
  float get_temp()
  {
  uchar a,b;
  uint temp;
  float f_temp;
  dsreset();
  delay(1);
  write_byte(0xcc);
  write_byte(0xbe);
  a=read_byte();
  b=read_byte();
  temp=b;
  temp<<=8;
  temp=temp|a;
  f_temp=temp*0.0625;
  temp=f_temp*10+0.5;
  f_temp=f_temp+0.05;
  return f_temp;
  }
  void main()
  {
  init();
  while(1)
  {
  if(flag==1)
  {
  flag=0;
  begin_change();
  TI=1;
  printf("The tempeature is %f\n",get_temp());
  while(!TI);
  TI=0;
  }
  }
  }

参考资料:自己

热心网友 时间:2023-10-08 16:56

我做的课程设计,用的数码管,也做了protues仿真,你有需要的话,我邮箱是zhagnjiaolong110@sohu.com。希望对你有帮助,
#include<reg52.h>

sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;/////数码管1断码控制///////////////

sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
sbit P32=P3^2;/////数码管2段码控制////////////////

sbit up=P3^7;
sbit down=P3^6; ////按键操作端口//////////////////

sbit P35=P3^5; ////////控制晶闸管端口/////////
sbit DQ =P3^3; ///////温度传感器端口/////////

#define THCO 0xee
#define THLO 0x00
unsigned char code an[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,};
//////////////////////////////////////////
int b=0;
char pwm=0;
int k;

char r=0,q=0;
static char wen_1;
char hao=20;
//////////////////////////////////////////////
void delay(unsigned int i)
{
while(i--);
}
//////////////////////////////////////////
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
////////////////////////////////////////////
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
////////////////////////////////////////////////
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
//delay(4);
}
///////////////////////////////////////////////
//DS18B20程序读取温度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;

float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
return(t);
}

xianshi()
{
/////////////////当前温度显示/////////////////////////////
P11=1;
P0=an[wen_1/1000];
for(k=0;k<1000;k++);
P1=0;

P12=1;
P0=an[wen_1/100%10];
for(k=0;k<1000;k++);
P1=0;

P13=1;
P0=an[wen_1%100/10];
for(k=0;k<1000;k++);
P1=0;

P14=1;
P0=an[wen_1%10];
for(k=0;k<1000;k++);
P1=0;

///////////////////////////目标电压显示///////////////
P15=1;
P2=an[hao/1000];
for(k=0;k<1000;k++);
P1=0;

P16=1;
P2=an[hao/100%10];
for(k=0;k<1000;k++);
P1=0;

P17=1;
P2=an[hao%100/10];
for(k=0;k<1000;k++);
P1=0;

P32=1;
P2=an[hao%10];
for(k=0;k<1000;k++);
P32=0;
//////////////////////////////////////////////////////////

}

///////////////////////////////////////////////////////////
main(void)
{

P11=0;
P12=0;
P13=0;
P14=0;

P15=0;
P16=0;
P17=0;
P32=0;

P35=0;
///////////////////////////////////////////////////////////
while(1)
{
wen_1=ReadTemperature()/16;//读温度
xianshi(); ///显示系统数据////////////////////
/////////////////操作函数////////////////////////////////////
if(down==0) {hao--;}
if(up==0){hao++;}

//////////////////////////////////////////////////////////////
/////hao为理想温度
/////wen_1为实际环境温度
/////////////////////////////////////////////////////////////
////P35为高时 led灯工作/////////////////////////////////////
P35=0;
pwm=hao-wen_1;
if(pwm>0) {P35=1;}
if(pwm<0) {P35=0;}
if(pwm==0) {P35=0;}
/////////////////////////////////////////////////////////////////
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
光猫的注册灯一直闪没有网是怎么回事 ...PSP3000播放不起MP4格式的视频 我是6.60系统,PPA也放不起。还有就... AVC无法播放 PSP的电影,我放在相应的文件夹里,播放器也有.怎么还不行? psp ppa 无法播放 S1铁路啥意思 农历八月十五出生男孩名字 T-46轻型坦克参数资料(取自坦克世界) 美丽加芬有卸妆液吗 为什么股票涨跌很快 可以在家里的阳台上种黄秋葵吗,有哪些好处? 51单片机的温度采集系统设计 黄秋葵如何在阳台种植 基于51单片机的温度检测模块设计 如何查看荣耀9屏幕厂商 荣耀9怎么查看屏幕厂商 荣耀v20在保修期内换屏需要多少钱 荣耀V20评测:2018年旗舰机的标杆之作 荣耀20pro屏幕厂商是哪家? 皮衣小了怎么办 荣耀V20的液晶面板是什么型号的? 真皮皮衣被水洗以后缩水变小了要怎么样才能变大 荣耀v20是哪家的手机屏幕,是天马的垃圾屏还是京东方或者夏普的 皮衣穿起来太硬了,怎么样才能让它软和。 各位有没有再用荣耀v20的,怎么样啊屏幕? 皮衣变硬怎么办 如何使皮衣变柔软? 荣耀20的显示屏是用的哪个公司? 皮衣怎么变软 有买到荣耀v20的友友吗,知道v20手机屏幕是哪家生产的呢 怎样让变硬的皮衣变软 阳台种植秋葵要怎么做 种植黄秋葵需要多深的土壤?在家可以盆栽吗?谢谢! 秋葵好种植吗?在阳台上, 基于51单片机,温湿度无线检测系统设计 基于51单片机的温度监控系统设计 秋葵在阳台的种植技术难么,秋葵在阳台怎么盆栽 基于单片机的热敏电阻式温度检测系统设计 基于单片机的温度控制系统(毕业论文) 单片机温度控制系统(毕业设计) 秋葵可以种在花盆里吗 基于89C51单片机的仓库温度监测系统设计 秋葵的阳台种植方法 问几个电高压锅炖鸡(现杀的)的问题,用不用先用开水焯一下? 怎样种植黄秋葵 请问黄秋葵要怎么播种才能发芽呀? 女生眼睛小怎么可以变大? 为什么饭店的炖鸡汤那么快就好了,现杀的鸡15分钟不到就好了,听说是用高压锅,请问是电饭煲吗?谢谢了 女人眼睛小怎么变大 女孩子眼睛小怎么变大 现杀的鸡好吃,还是过一夜在煮好吃?