51单片机和DS18B20完整显示程序代码
时间: 2023-10-07 14:14:31 浏览: 94
以下是基于51单片机和DS18B20温度传感器的完整显示程序代码:
```c
#include <reg51.h>
sbit DQ = P2^0; // DS18B20数据线连接到P2.0
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code table[] = "0123456789"; // 数码管字符表
// 数码管位选,共阴数码管需要取反
uchar code digit[] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
// 延时函数
void Delay1ms(uint t){
uint i, j;
for(i=0; i<t; i++){
for(j=0; j<110; j++);
}
}
// DS18B20初始化
uchar Init_DS18B20(){
uchar i;
DQ = 1; // 数据线先置高
Delay1ms(10); // 延时10ms
DQ = 0; // 发送复位脉冲
Delay1ms(80);
DQ = 1;
Delay1ms(10);
i = DQ; // 检测DS18B20响应信号
Delay1ms(15);
return i;
}
// DS18B20写一位数据
void Write_DS18B20(uchar dat){
uchar i;
for(i=0; i<8; i++){
DQ = 0; // 发送时间槽
DQ = dat & 0x01; // 发送数据位
Delay1ms(5);
DQ = 1; // 释放总线
dat >>= 1;
}
}
// DS18B20读一位数据
uchar Read_DS18B20(){
uchar i, dat = 0;
for(i=0; i<8; i++){
DQ = 0; // 发送时间槽
dat >>= 1; // 接收数据位
if(DQ) dat |= 0x80;
Delay1ms(5);
DQ = 1; // 释放总线
}
return dat;
}
// DS18B20读取温度值
int GetTemp_DS18B20(){
uchar i;
uchar TL, TH;
int k;
Init_DS18B20(); // 初始化DS18B20
Write_DS18B20(0xCC); // 跳过ROM操作,直接进入温度转换模式
Write_DS18B20(0x44); // 启动温度转换
Delay1ms(500); // 等待至少500ms,确保转换完成
Init_DS18B20(); // 重新初始化DS18B20
Write_DS18B20(0xCC); // 跳过ROM操作,直接进入读温度模式
Write_DS18B20(0xBE); // 读取温度寄存器中的值
TL = Read_DS18B20(); // 读取温度低字节
TH = Read_DS18B20(); // 读取温度高字节
k = TH;
k <<= 8;
k |= TL;
return k;
}
void main(){
uchar i, j, k;
int temp;
while(1){
temp = GetTemp_DS18B20(); // 读取温度值
temp >>= 4; // 温度值右移4位,保留整数部分
for(i=0; i<4; i++){
j = temp % 10; // 取出当前位的数值
temp /= 10; // 剩下未显示的数值
P1 = digit[j]; // 显示当前位的数值
Delay1ms(5); // 稍作延时
P1 = 0x00; // 关闭当前位显示
k++; // 计数器加1
if(k == 8) k = 0; // 计数器复位
P0 = ~(1 << k); // 切换到下一位数码管
Delay1ms(2);
}
}
}
```
该程序使用了共阴数码管进行温度显示,需要将P0口连接到数码管的位选端。程序中先调用`Init_DS18B20()`函数初始化DS18B20温度传感器,然后调用`GetTemp_DS18B20()`函数读取温度值。最后使用循环将温度值依次显示在数码管上。
注意:该程序是基于51单片机的,如果使用其他单片机或开发板需要根据具体情况进行修改。
阅读全文