单片机基于c51的简易温度计设计代码
时间: 2023-08-10 13:08:26 浏览: 107
基于51单片机的数字式温度计设计,采用PT100铂电阻,高精密温度采集与显示-源码
下面是一个基于C51的简易温度计设计代码,使用的传感器为DS18B20:
```c
#include<reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit DQ=P3^7; // DS18B20 数据线
uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 数码管显示表
void Delay10us() // 延时10微秒
{
uchar i;
for (i=0; i<2; i++);
}
void Delay500us() // 延时500微秒
{
uchar i,j;
for (i=15; i>0; i--)
for (j=20; j>0; j--);
}
void DelayMs(uchar ms) // 延时ms毫秒
{
uchar i,j;
while (ms--)
{
for (i=2; i>0; i--)
for (j=245; j>0; j--);
}
}
void WriteDs18b20(uchar dat) // 写入一个字节
{
uchar i;
for (i=0; i<8; i++)
{
DQ = 0;
Delay10us();
DQ = dat & 0x01;
dat >>= 1;
Delay10us();
DQ = 1;
}
}
uchar ReadDs18b20() // 读取一个字节
{
uchar i, dat = 0;
for (i=0; i<8; i++)
{
DQ = 0;
Delay10us();
DQ = 1;
Delay10us();
dat |= DQ << i;
}
return dat;
}
void Convert() // 启动温度转换
{
DQ = 1;
Delay10us();
DQ = 0;
Delay500us();
DQ = 1;
Delay10us();
}
void InitDs18b20() // 初始化DS18B20
{
DQ = 1;
Delay10us();
DQ = 0;
Delay500us();
DQ = 1;
Delay10us();
}
uint GetTemp() // 读取温度
{
uchar temp[2];
uint temperature;
InitDs18b20();
Convert();
InitDs18b20();
WriteDs18b20(0xcc); // 跳过ROM操作
WriteDs18b20(0xbe); // 读取温度
temp[0] = ReadDs18b20(); // 低8位
temp[1] = ReadDs18b20(); // 高8位
temperature = temp[1];
temperature <<= 8;
temperature |= temp[0];
temperature >>= 4;
return temperature;
}
void Display(uint temp) // 数码管显示温度
{
uchar i, j;
uchar code array[] = {0xfe,0xfd,0xfb,0xf7}; // 位选
uchar th, tl;
th = temp >> 4;
tl = temp & 0x0f;
for (i=0; i<4; i++)
{
P2 = array[i];
if (i == 2) P0 = 0x80; // 小数点
else P0 = table[th];
DelayMs(1);
P0 = 0x00;
}
P2 = 0xff;
for (j=0; j<20; j++) // 20ms闪烁一次
{
P0 = table[tl];
DelayMs(1);
P0 = 0x00;
DelayMs(9);
}
}
void main()
{
uint temp;
while (1)
{
temp = GetTemp(); // 读取温度
Display(temp); // 数码管显示温度
}
}
```
注意:该代码仅供参考,具体实现可能还需要根据具体硬件情况进行调整。
阅读全文