基于80C52单片机使用DS18B20温度传感器和2N5114压力传感器和DN2530流量传感器,在温度超过80摄氏度或者压力超过1200千帕或者流量超过每秒3立方米时,关闭电磁阀,否则开启电磁阀,并将温度、压力、流量信息显示在LCD显示屏上,C语言编程代码为?
时间: 2023-12-11 20:02:04 浏览: 65
以下是基于80C52单片机的C语言编程代码:
```c
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^2; // DS18B20数据线连接P1.2口
sbit EN = P2^5; // LCD使能信号EN连接P2.5口
sbit RS = P2^6; // LCD数据信号RS连接P2.6口
// 函数声明
void Delay1ms(uint);
void Init_DS18B20();
void Write_DS18B20(uchar);
uchar Read_DS18B20();
uchar ReadTemperature();
void WriteCommand(uchar);
void WriteData(uchar);
void Init_LCD();
void DisplayString(uchar, uchar, uchar *);
void main()
{
uchar display[16]; // 存储LCD显示内容
uint pressure = 0; // 压力值
uint flow = 0; // 流量值
Init_DS18B20(); // 初始化DS18B20温度传感器
Init_LCD(); // 初始化LCD显示屏
while(1)
{
// 读取温度
uchar temp = ReadTemperature();
// 显示温度
sprintf(display, "Temp:%dC", temp);
DisplayString(1, 1, display);
// 读取压力
pressure = ((uint)P1 << 8) | P0; // 读取AD转换器值
// 判断压力是否超过限制
if(pressure > 1200)
P3 &= ~(1<<4); // 关闭电磁阀
else
P3 |= (1<<4); // 开启电磁阀
// 显示压力
sprintf(display, "Pres:%dKPa", pressure);
DisplayString(2, 1, display);
// 读取流量
flow = ((uint)P1 << 8) | P0; // 读取AD转换器值
// 判断流量是否超过限制
if(flow > 3)
P3 &= ~(1<<5); // 关闭电磁阀
else
P3 |= (1<<5); // 开启电磁阀
// 显示流量
sprintf(display, "Flow:%dL/s", flow);
DisplayString(3, 1, display);
Delay1ms(500); // 延时500ms
}
}
// 延时函数
void Delay1ms(uint count)
{
uint i,j;
for(i=0;i<count;i++)
for(j=0;j<110;j++);
}
// DS18B20初始化函数
void Init_DS18B20()
{
DQ = 1;
Delay1ms(1);
DQ = 0;
Delay1ms(500);
DQ = 1;
Delay1ms(60);
Write_DS18B20(0xCC); // 跳过ROM命令
Write_DS18B20(0x44); // 开始温度转换命令
}
// DS18B20写函数
void Write_DS18B20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ = 0;
_nop_();
DQ = dat & 0x01;
dat >>= 1;
Delay1ms(2);
DQ = 1;
}
}
// DS18B20读函数
uchar Read_DS18B20()
{
uchar i, dat = 0;
for(i=0;i<8;i++)
{
DQ = 0;
_nop_();
DQ = 1;
_nop_();
dat >>= 1;
if(DQ)
dat |= 0x80;
Delay1ms(2);
}
return dat;
}
// 读取温度函数
uchar ReadTemperature()
{
uchar tempL, tempH;
Write_DS18B20(0xCC); // 跳过ROM命令
Write_DS18B20(0xBE); // 读取温度命令
tempL = Read_DS18B20(); // 读取温度低8位
tempH = Read_DS18B20(); // 读取温度高8位
return (tempH<<4)|(tempL>>4); // 计算温度值
}
// LCD写命令函数
void WriteCommand(uchar cmd)
{
RS = 0; // RS置0,表示写命令
P0 = cmd; // 将命令写入P0口
EN = 1; // 使能信号置1
Delay1ms(2);
EN = 0; // 使能信号置0
}
// LCD写数据函数
void WriteData(uchar dat)
{
RS = 1; // RS置1,表示写数据
P0 = dat; // 将数据写入P0口
EN = 1; // 使能信号置1
Delay1ms(2);
EN = 0; // 使能信号置0
}
// LCD初始化函数
void Init_LCD()
{
WriteCommand(0x38); // 显示模式设置:16*2显示,5*7点阵,8位数据总线
WriteCommand(0x0C); // 显示开关设置:显示开,光标关,光标闪烁关
WriteCommand(0x06); // 光标移动设置:光标右移,字符不移动
WriteCommand(0x01); // 显示清屏
}
// LCD显示字符串函数
void DisplayString(uchar row, uchar column, uchar *str)
{
uchar i;
switch(row)
{
case 1: // 第一行
WriteCommand(0x80+column-1);
break;
case 2: // 第二行
WriteCommand(0xC0+column-1);
break;
case 3: // 第三行
WriteCommand(0x94+column-1);
break;
case 4: // 第四行
WriteCommand(0xD4+column-1);
break;
default:
break;
}
for(i=0; str[i]!='\0' && i<16; i++)
WriteData(str[i]);
}
```
需要注意的是,该代码仅供参考,具体的硬件连接和调试需要根据实际情况进行调整。同时,代码中的压力传感器和流量传感器需要通过AD转换器连接到P0口和P1口,并进行相关的数据处理。
阅读全文