写一段基于at89c52单片机的温度传感器程序
时间: 2023-06-19 12:08:14 浏览: 121
以下是一个基于AT89C52单片机的温度传感器程序示例:
```c
#include<reg52.h>
#include<intrins.h>
#define DQ P2_0 // 设置DQ引脚为P2.0
sbit beep = P1^0; // 设置蜂鸣器引脚为P1.0
unsigned char temp; // 存储温度值
void delay_us(unsigned char t) // 延时函数,单位为微秒
{
while(t--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(unsigned int t) // 延时函数,单位为毫秒
{
unsigned int i;
while(t--)
{
for(i=0; i<125; i++);
}
}
void ds18b20_init() // 初始化ds18b20温度传感器
{
DQ = 1;
delay_us(2);
DQ = 0;
delay_us(80);
DQ = 1;
delay_us(30);
}
void write_byte(unsigned char dat) // 写入一个字节的数据
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ = 0;
_nop_();
_nop_();
if(dat & 0x01)
{
DQ = 1;
}
else
{
DQ = 0;
}
dat >>= 1;
delay_us(5);
DQ = 1;
}
}
unsigned char read_byte() // 读取一个字节的数据
{
unsigned char i, dat = 0;
for(i=0; i<8; i++)
{
DQ = 0;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
dat >>= 1;
if(DQ)
{
dat |= 0x80;
}
delay_us(5);
}
return dat;
}
void get_temp() // 获取温度值
{
unsigned char temp_low, temp_high;
ds18b20_init(); // 初始化ds18b20温度传感器
write_byte(0xcc); // 跳过ROM操作
write_byte(0x44); // 启动温度转换
delay_ms(750); // 等待转换完成
ds18b20_init(); // 初始化ds18b20温度传感器
write_byte(0xcc); // 跳过ROM操作
write_byte(0xbe); // 读取温度值
temp_low = read_byte(); // 读取温度值低八位
temp_high = read_byte(); // 读取温度值高八位
temp = (temp_high << 4) | (temp_low >> 4); // 计算温度值
}
void main()
{
while(1)
{
get_temp(); // 获取温度值
if(temp > 30) // 判断温度是否超过30度
{
beep = 1; // 开启蜂鸣器
}
else
{
beep = 0; // 关闭蜂鸣器
}
delay_ms(1000); // 延时1秒
}
}
```
这个程序可以通过DS18B20温度传感器来获取温度值,并通过蜂鸣器来判断温度是否超过30度。在程序中,我们使用了AT89C52单片机的GPIO口来连接DS18B20温度传感器和蜂鸣器,使用了延时函数来控制时序,实现了获取温度值和控制蜂鸣器的功能。
阅读全文