基于单片机温度测控系统AT89C51 温度传感器DS18B20
展开全部
#include <reg52.h>
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
//----------------------------------------------------------------------------------------------------------------
uchar data temp_data[2]={0x00,0x00};
uchar dispaly[7];
//-------------------------------------------------数码管段码--------------------------------------------------------
uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段码
uchar seg1[10]={0x40,0x4F,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//-----------------------------------------------DS1820数据IO-----------------------------------------------------
sbit DQ=P3^7;
//-----------------------------------------------数码管位选--------------------------------------------------------
sbit hc138a=P2^0;
sbit hc138b=P2^1;
sbit hc138c=P2^2;
//sbit led0=P2^3;
sbit BELL=P3^6;
//-----------------------------------------------函数申明---------------------------------------------------------
void delay1(uint i);
void ds_reset(void);
void write_byte(uchar value);
uchar read_byte(void);
void read_temp();
void work_temp();
//----------------------------------------------------------------------------------------------------------------
void delay1(uint i)
{
for(;i>0;i--);
}
//-----------------------------------------------------------DS1820复位函数---------------------------------------
void ds_reset(void)
{
char temp=1;
while(temp)
{
while(temp)
{
DQ=1;_nop_();_nop_();
DQ=0;
delay1(80);
DQ=1;
delay1(9);
temp=DQ;
}
delay1(64);
temp=~DQ;
}
DQ=1;
}
////-----------------------------------------------------DS1820写函数------------------------------------------------
void write_byte(uchar value)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=value&0x01;
delay1(9);
value>>=1;
}
DQ=1;
delay1(1);
}
//------------------------------------------------------DS1820读函数----------------------------------------------
uchar read_byte(void)
{
uchar i;
uchar value1=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value1>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();
if(DQ)
value1|=0x80;
delay1(9);
}
DQ=1;
return(value1);
}
//------------------------------------------------------读取温度--------------------------------------------------
void read_temp()
{
ds_reset();
write_byte(0xcc);
write_byte(0xbe);
temp_data[0]=read_byte();
temp_data[1]=read_byte();
ds_reset();
write_byte(0xcc);
write_byte(0x44);
}
//-------------------------------------------------------温度换算处理------------------------------------------------
void work_temp()
{
uchar n=0;
if(temp_data[1]>127)
{
temp_data[1]=(256-temp_data[1]); //负值
temp_data[0]=(256-temp_data[0]);
n=1;
}
dispaly[6]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
dispaly[5]=dispaly[6]/100; //百位
dispaly[4]=dispaly[6]%100; //
dispaly[2]=dispaly[4]/10; //十位
dispaly[1]=dispaly[4]%10; //个位
switch (temp_data[0]&0x0f) //小数位
{
case 0x0f:dispaly[0]=9;break;
case 0x0e:dispaly[0]=9;break;
case 0x0d:dispaly[0]=8;break;
case 0x0c:dispaly[0]=8;break;
case 0x0b:dispaly[0]=7;break;
case 0x0a:dispaly[0]=6;break;
case 0x09:dispaly[0]=6;break;
case 0x08:dispaly[0]=5;break;
case 0x07:dispaly[0]=4;break;
case 0x06:dispaly[0]=4;break;
case 0x05:dispaly[0]=3;break;
case 0x04:dispaly[0]=3;break;
case 0x03:dispaly[0]=2;break;
case 0x02:dispaly[0]=1;break;
case 0x01:dispaly[0]=1;break;
case 0x00:dispaly[0]=1;break;
default:break;
}
if(n) //负值时显示aa,正直显示dd
{
dispaly[3]=0x11; //
}
else dispaly[3]=0x22;
}
void disdignit()
{
char i;
// if(temp[0])
{
for(i=0;i<3;i++)
{
P0=0xC6;
hc138a=0;
hc138b=0;
hc138c=0;
delay1(60);
//led0=1;
P0=seg[dispaly[0]];
hc138a=1;
hc138b=0;
hc138c=0;
delay1(60);
//led1=1;
P0=seg1 [dispaly[1]];
hc138a=0;
hc138b=1;
hc138c=0;
delay1(60);
//led2=1;
P0=seg[ dispaly[2]];
hc138a=1;
hc138b=1;
hc138c=0;
delay1(40);
//led3=1;
}
}
}
void main(void)
{
//BELL=0;
ds_reset();
write_byte(0xcc);
write_byte(0x44);
while(1)
{
//BELL=0;
//BELL=1;
read_temp();
work_temp();
delay1(500);
disdignit();
}
}
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
//----------------------------------------------------------------------------------------------------------------
uchar data temp_data[2]={0x00,0x00};
uchar dispaly[7];
//-------------------------------------------------数码管段码--------------------------------------------------------
uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段码
uchar seg1[10]={0x40,0x4F,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//-----------------------------------------------DS1820数据IO-----------------------------------------------------
sbit DQ=P3^7;
//-----------------------------------------------数码管位选--------------------------------------------------------
sbit hc138a=P2^0;
sbit hc138b=P2^1;
sbit hc138c=P2^2;
//sbit led0=P2^3;
sbit BELL=P3^6;
//-----------------------------------------------函数申明---------------------------------------------------------
void delay1(uint i);
void ds_reset(void);
void write_byte(uchar value);
uchar read_byte(void);
void read_temp();
void work_temp();
//----------------------------------------------------------------------------------------------------------------
void delay1(uint i)
{
for(;i>0;i--);
}
//-----------------------------------------------------------DS1820复位函数---------------------------------------
void ds_reset(void)
{
char temp=1;
while(temp)
{
while(temp)
{
DQ=1;_nop_();_nop_();
DQ=0;
delay1(80);
DQ=1;
delay1(9);
temp=DQ;
}
delay1(64);
temp=~DQ;
}
DQ=1;
}
////-----------------------------------------------------DS1820写函数------------------------------------------------
void write_byte(uchar value)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=value&0x01;
delay1(9);
value>>=1;
}
DQ=1;
delay1(1);
}
//------------------------------------------------------DS1820读函数----------------------------------------------
uchar read_byte(void)
{
uchar i;
uchar value1=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value1>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();
if(DQ)
value1|=0x80;
delay1(9);
}
DQ=1;
return(value1);
}
//------------------------------------------------------读取温度--------------------------------------------------
void read_temp()
{
ds_reset();
write_byte(0xcc);
write_byte(0xbe);
temp_data[0]=read_byte();
temp_data[1]=read_byte();
ds_reset();
write_byte(0xcc);
write_byte(0x44);
}
//-------------------------------------------------------温度换算处理------------------------------------------------
void work_temp()
{
uchar n=0;
if(temp_data[1]>127)
{
temp_data[1]=(256-temp_data[1]); //负值
temp_data[0]=(256-temp_data[0]);
n=1;
}
dispaly[6]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
dispaly[5]=dispaly[6]/100; //百位
dispaly[4]=dispaly[6]%100; //
dispaly[2]=dispaly[4]/10; //十位
dispaly[1]=dispaly[4]%10; //个位
switch (temp_data[0]&0x0f) //小数位
{
case 0x0f:dispaly[0]=9;break;
case 0x0e:dispaly[0]=9;break;
case 0x0d:dispaly[0]=8;break;
case 0x0c:dispaly[0]=8;break;
case 0x0b:dispaly[0]=7;break;
case 0x0a:dispaly[0]=6;break;
case 0x09:dispaly[0]=6;break;
case 0x08:dispaly[0]=5;break;
case 0x07:dispaly[0]=4;break;
case 0x06:dispaly[0]=4;break;
case 0x05:dispaly[0]=3;break;
case 0x04:dispaly[0]=3;break;
case 0x03:dispaly[0]=2;break;
case 0x02:dispaly[0]=1;break;
case 0x01:dispaly[0]=1;break;
case 0x00:dispaly[0]=1;break;
default:break;
}
if(n) //负值时显示aa,正直显示dd
{
dispaly[3]=0x11; //
}
else dispaly[3]=0x22;
}
void disdignit()
{
char i;
// if(temp[0])
{
for(i=0;i<3;i++)
{
P0=0xC6;
hc138a=0;
hc138b=0;
hc138c=0;
delay1(60);
//led0=1;
P0=seg[dispaly[0]];
hc138a=1;
hc138b=0;
hc138c=0;
delay1(60);
//led1=1;
P0=seg1 [dispaly[1]];
hc138a=0;
hc138b=1;
hc138c=0;
delay1(60);
//led2=1;
P0=seg[ dispaly[2]];
hc138a=1;
hc138b=1;
hc138c=0;
delay1(40);
//led3=1;
}
}
}
void main(void)
{
//BELL=0;
ds_reset();
write_byte(0xcc);
write_byte(0x44);
while(1)
{
//BELL=0;
//BELL=1;
read_temp();
work_temp();
delay1(500);
disdignit();
}
}
leipole
2024-11-29 广告
2024-11-29 广告
作为上海雷普电气有限公司的一员,我们的udian温度控制器以其卓越的温控性能而著称。该产品采用先进的温控技术,能够精确感知环境温度并作出迅速响应,确保设备在理想温度范围内稳定运行。其设计紧凑、安装便捷,广泛应用于各类电气柜及工业设备中,有效...
点击进入详情页
本回答由leipole提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询