写一个STC8G1K08(sop16)p3.3口利用DS18B20的测温的程序
时间: 2024-05-27 09:12:34 浏览: 174
基于DS18B20的温度测试程序
好的,这个问题属于技术问题,我可以回答。以下是一个基于STC8G1K08微控制器和DS18B20温度传感器的温度测量程序:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P3^3; // DS18B20数据连接在P3.3口
// DS18B20涉及到的函数
void Delay1us(void); //us级延时
void Delay100us(void); //100us延时
void Write_DS18B20(uchar dat); // 写一个字节
uchar Read_DS18B20(void); // 读一个字节
void Init_DS18B20(void); // DS18B20初始化
bit Init_DS18B20_ok(void); // 检测DS18B20是否存在
void ConvertT_DS18B20(void); // 启动温度转化
uint ReadTemp_DS18B20(void); // 读取温度
// us级延时
void Delay1us(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
// 100us级延时
void Delay100us(void)
{
uchar i;
for (i = 0; i < 120; i++) Delay1us();
}
// 写一个字节
void Write_DS18B20(uchar dat)
{
uchar i;
for (i = 0; i < 8; i++)
{
DQ = 0;
Delay1us();
DQ = dat & 0x01;
dat >>= 1;
Delay1us();
DQ = 1;
}
}
// 读一个字节
uchar Read_DS18B20(void)
{
uchar i, dat = 0;
for (i = 0; i < 8; i++)
{
DQ = 0;
Delay1us();
DQ = 1;
Delay1us();
dat |= DQ<<i;
}
return dat;
}
// DS18B20初始化
void Init_DS18B20(void)
{
DQ = 1;
Delay1us();
DQ = 0;
Delay100us();
DQ = 1;
Delay1us();
}
// 检测DS18B20是否存在
bit Init_DS18B20_ok(void)
{
bit ok;
Init_DS18B20();
ok = Read_DS18B20();
Delay100us();
return ok;
}
// 启动温度转化
void ConvertT_DS18B20(void)
{
Init_DS18B20_ok();
Write_DS18B20(0xcc); // skip ROM
Write_DS18B20(0x44); // convert T
}
// 读取温度
uint ReadTemp_DS18B20(void)
{
uchar lsb, msb;
uint temp;
Init_DS18B20_ok();
Write_DS18B20(0xcc); // skip ROM
Write_DS18B20(0xbe); // read scratchpad
lsb = Read_DS18B20();
msb = Read_DS18B20();
temp = (msb<<8) | lsb;
temp = temp>>4;
if (temp & 0x800) // 负数处理
{
temp = ~temp+1;
temp |= 0x800;
}
return temp;
}
void main()
{
uint temp;
while(1)
{
ConvertT_DS18B20();
Delay100us();
temp = ReadTemp_DS18B20();
temp *= 625; // 得到真实温度值
temp /= 100;
// 此处将温度值输出到屏幕上
// ...
}
}
希望对你有所帮助!
阅读全文