温度传感器DS18B20采集环境模拟信号,其输出送入 AT89C51,单片机在程序的控制下,将处理过的数据送到移位寄存器74LS164,经74LS164输出后驱动三位数码管显示。当被测温度高于18℃时,单片机发出控制信号使降温电扇以自然风的形式旋转,温度越高转速越快,温度36℃以上时风扇全速工作,点亮此功能指示灯。此程序中单片机程序如何编写
时间: 2024-03-17 13:44:14 浏览: 18
以下是一个简单的程序框架:
```c
#include <reg51.h>
#include <intrins.h>
sbit DQ=P1^0; // DS18B20数据线
sbit led=P1^1; // 指示灯
sbit fan=P1^2; // 降温电扇控制线
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; // 显示码表
unsigned char temp[2]; // 存储温度值
void delay(unsigned int t)
{
while(t--);
}
void delay_us(unsigned char t)
{
while(t--);
}
void ds18b20_write(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
_nop_();
if(dat&0x01)
{
DQ=1;
}
delay_us(5);
DQ=1;
dat>>=1;
}
}
unsigned char ds18b20_read(void)
{
unsigned char i,dat=0;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
_nop_();
dat>>=1;
DQ=1;
if(DQ) dat|=0x80;
delay_us(5);
}
return dat;
}
void ds18b20_init(void)
{
DQ=1;
delay(1000);
DQ=0;
delay_us(500);
DQ=1;
delay_us(60);
if(!DQ)
{
delay_us(500);
}
DQ=1;
}
void ds18b20_convert(void)
{
ds18b20_init();
ds18b20_write(0xcc);
ds18b20_write(0x44);
}
void ds18b20_read_temp(void)
{
unsigned char i;
ds18b20_init();
ds18b20_write(0xcc);
ds18b20_write(0x44);
ds18b20_init();
ds18b20_write(0xcc);
ds18b20_write(0xbe);
for(i=0;i<2;i++)
{
temp[i]=ds18b20_read();
}
}
void display(unsigned char dat)
{
P0=table[dat/100];
P2=0xfe;
delay(1000);
P0=table[dat%100/10];
P2=0xfd;
delay(1000);
P0=table[dat%10];
P2=0xfb;
delay(1000);
}
void main(void)
{
unsigned char t;
while(1)
{
ds18b20_convert();
delay(1000);
ds18b20_read_temp();
t=temp[0];
if(t>0x80) // 温度为负数
{
t=(~t)+1;
display(t); // 显示负数
}
else
{
display(t);
}
if(t>0x12) // 温度高于18℃
{
fan=1; // 打开降温电扇
if(t>=0x24) // 温度超过36℃
{
led=1; // 点亮指示灯
fan=0; // 降温电扇全速工作
}
}
else
{
fan=0; // 关闭降温电扇
led=0; // 熄灭指示灯
}
}
}
```
需要注意的是,以上代码仅为示例,实际应用中需要根据具体情况进行修改和优化。