基于DS18B20温度测量系统设计与实现 给发给我程序和电路图么 十分感谢。。。

2024-12-20 05:33:23
推荐回答(1个)
回答1:

//共阳数码管段码表
unsigned char code Segment[10]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//数码管位控制
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;

sbit DQ=P3^6;
sbit Led0=P3^7; //指示DQ的状态

unsigned char RAMchar,TempertureH,TempertureL;
unsigned char TempertureFlag,Temperture;

void DS18B20Reset();
void Writechar(unsigned char CMDchar);
void Readchar();
void ReadTemperture();
void Display();

void Delay5us();
void Delay60us();
void Delay480us();
void Delay2ms();

void main()
{
DS18B20Reset();
while(1)
{
ReadTemperture();
Display();
}
}

/**********ds18b20初始化函数**********************/

void DS18B20Reset()
{
DQ=0; //单片机将总线DQ电平拉低
Delay480us(); //精确延时480us~960us
DQ=1; //单片机将总线DQ电平拉高
Delay60us(); //DS18B20等待60us后发出DQ低电平信号

while(DQ); //如果初始化成功 则DQ=0
Led0=0;
DQ=1; //单片机将总线DQ电平拉高
Delay480us(); //等待设备释放数据线
}

/*************DS18B20写一个字节****************/

void Writechar(unsigned char CMDchar)
{
unsigned char i=8;
while (i--) //8位计数器
{
DQ=1;
DQ=0;
Delay5us();

DQ=CMDchar&0x01;
Delay60us();

DQ=1;
CMDchar=CMDchar>>1;
}
}

/**************读取ds18b20当前温度************/

void Readchar()
{
unsigned char i=8;
while(i--)
{
DQ=1;
DQ=0;
Delay5us();
DQ=1;
Delay5us();
RAMchar=RAMchar>>1;
if(DQ)RAMchar=RAMchar|0x80;

Delay60us();
DQ=1;
}
}

void ReadTemperture()
{
DS18B20Reset();
Writechar(0xCC); // 跳过读序列号的操作
Writechar(0x44); // 启动温度转换

DS18B20Reset();
Writechar(0xCC); // 跳过读序列号的操作
Writechar(0xBE); // 读寄存器的数据(共可读9个寄存器,前两个是温度L和H)

Readchar();
TempertureL=RAMchar; // 读温度L
Readchar();
TempertureH=RAMchar; // 读温度H
}

void Display()
{
if(TempertureH>=16)
{
TempertureFlag=1;
TempertureH=((256-TempertureH)-1)<<4;
TempertureL=(256-TempertureL)>>4;
Temperture=TempertureH+TempertureL;
}
else
{
TempertureFlag=0;
TempertureH=TempertureH<<4;
TempertureL=TempertureL>>4;
Temperture=TempertureH+TempertureL;
}

P2=0xff;
P0=0xff;
if(TempertureFlag)P0=0xbf;//10111111B
P23=0;
Delay2ms();

P2=0xff;
P0=Segment[Temperture/100];
P22=0;
Delay2ms();

P2=0xff;
P0=Segment[Temperture%100/10];
P21=0;
Delay2ms();

P2=0xff;
P0=Segment[Temperture%10];
P20=0;
Delay2ms();
}

void Delay5us()
{
TMOD=0x02;
TH0=256-5;
TL0=256-5;
TF0=0;
TR0=1;
while(!TF0);
TF0=0;
}

void Delay60us()
{
TMOD=0x02;
TH0=256-60;
TL0=256-60;
TR0=1;
while(!TF0);
TF0=0;
}

void Delay480us()
{
TMOD=0x02;
TL0=256-240;
TH0=TL0;
TF0=0;
TR0=1;
while(!TF0);
TF0=0;
while(!TF0);
TF0=0;
}

void Delay2ms()
{
unsigned char i=4,j=250;
while(i--)
while(j--);
}
******************************************************************************

这是调试好的程序,至于电路图还没画呢,我是在开发板上运行的。