单片机练习 - DS18B20温度转换与显示
时间: 2023-08-07 22:08:27 浏览: 123
单片机学习的期末作业(利用ds18b20实现温度读取、显示、以及温度报警)
好的,我可以帮您回答这个问题。DS18B20是一种数字温度传感器,可以通过单片机读取其温度数据并进行显示。下面是一个简单的DS18B20温度转换与显示的示例:
1. 硬件连接
将DS18B20的VCC引脚连接到单片机的电源正极,GND引脚连接到单片机的电源负极,DQ引脚连接到单片机的一个GPIO口。
2. 软件实现
在单片机上编写程序,读取DS18B20的温度数据并进行显示。以下是一个基于STC89C52单片机的示例代码:
```c
#include <reg52.h>
#include <intrins.h>
#define DQ P2_0
sbit beep=P2^3;
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
uchar TempData[2];
void Delay1ms(uint y){
uint x;
for(;y>0;y--)
for(x=110;x>0;x--);
}
bit Init_DS18B20(){
bit initflag;
EA=0;
DQ=1;Delay1ms(1);
DQ=0;Delay1ms(20);
DQ=1;Delay1ms(1);
initflag=DQ;
Delay1ms(30);
EA=1;
return initflag;
}
void Write_DS18B20(uchar dat){
uchar i;
EA=0;
for(i=0;i<8;i++){
DQ=0;
_nop_();_nop_();
DQ=dat&0x01;
Delay1ms(6);
DQ=1;
dat>>=1;
}
EA=1;
}
uchar Read_DS18B20(){
uchar i,dat;
EA=0;
for(i=0;i<8;i++){
DQ=0;
_nop_();_nop_();
dat>>=1;
DQ=1;
if(DQ) dat|=0x80;
Delay1ms(6);
DQ=1;
}
EA=1;
return dat;
}
void Convert_DS18B20(){
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
}
void Read_Temp(){
uchar temp;
int t;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
temp=Read_DS18B20();
TempData[0]=temp>>4;
TempData[1]=temp&0x0f;
temp=Read_DS18B20();
TempData[1]|=(temp&0xf0)>>4;
TempData[0]=table[TempData[0]];
TempData[1]=table[TempData[1]];
}
void main(){
while(1){
Convert_DS18B20();
Delay1ms(500);
Read_Temp();
P0=TempData[0];
P1=TempData[1];
}
}
```
该示例程序使用了STC89C52单片机的P0和P1口作为数码管的控制引脚,通过读取DS18B20的温度数据并进行转换后,将结果显示在数码管上。
希望以上内容对您有所帮助!
阅读全文