include "xparameters.h"
#include "xgpiops.h"
#include "xstatus.h"
#include "xil_printf.h"
#include "sleep.h"
#define DHT11_GPIO_PIN 54
#define BUZZER_GPIO_PIN 55 // 蜂鸣器连接的GPIO引脚
#define LED_GPIO_PIN 56 // LED连接的GPIO引脚
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define MAX_RETRY 5
#define ALARM_THRESHOLD 24 // 温度报警阈值(摄氏度)
#define HUMIDITY_THRESHOLD 10 // 湿度阈值(百分比)
XGpioPs Gpio;
void delay_us(u32 us) {
u32 count = us * (XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ / 1000000 / 5);
while(count--);
}
// 蜂鸣器初始化函数
int Buzzer_Init() {
XGpioPs_SetDirectionPin(&Gpio, BUZZER_GPIO_PIN, 1);
XGpioPs_SetOutputEnablePin(&Gpio, BUZZER_GPIO_PIN, 1);
XGpioPs_WritePin(&Gpio, BUZZER_GPIO_PIN, 0); // 初始状态关闭蜂鸣器
return XST_SUCCESS;
}
// 控制蜂鸣器函数
void Buzzer_Control(int state) {
XGpioPs_WritePin(&Gpio, BUZZER_GPIO_PIN, state);
}
// 蜂鸣器报警函数 - 发出短促的哔哔声
void Buzzer_Alarm() {
int i;
for(i = 0; i < 5; i++) {
Buzzer_Control(1); // 打开蜂鸣器
usleep(200000); // 200ms
Buzzer_Control(0); // 关闭蜂鸣器
usleep(200000); // 200ms
}
}
// LED初始化函数
int LED_Init() {
XGpioPs_SetDirectionPin(&Gpio, LED_GPIO_PIN, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED_GPIO_PIN, 1);
XGpioPs_WritePin(&Gpio, LED_GPIO_PIN, 0); // 初始状态关闭LED
return XST_SUCCESS;
}
// 控制LED函数
void LED_Control(int state) {
XGpioPs_WritePin(&Gpio, LED_GPIO_PIN, state);
}
int DHT11_Init() {
int Status;
XGpioPs_Config *ConfigPtr;
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
if (NULL == ConfigPtr) return XST_FAILURE;
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS) return XST_FAILURE;
XGpioPs_SetDirectionPin(&Gpio, DHT11_GPIO_PIN, 1);
XGpioPs_SetOutputEnablePin(&Gpio, DHT11_GPIO_PIN, 1);
XGpioPs_WritePin(&Gpio, DHT11_GPIO_PIN, 1); // 初始置高
return XST_SUCCESS;
}
int DHT11_Read(u8 *temperature, u8 *humidity) {
u8 data[5] = {0};
u8 i, j, retry = 0;
int attempt = 0;
for(attempt = 0; attempt < MAX_RETRY; attempt++) {
// 发送开始信号
XGpioPs_SetDirectionPin(&Gpio, DHT11_GPIO_PIN, 1);
XGpioPs_WritePin(&Gpio, DHT11_GPIO_PIN, 0);
usleep(18000);
// 释放总线
XGpioPs_WritePin(&Gpio, DHT11_GPIO_PIN, 1);
XGpioPs_SetDirectionPin(&Gpio, DHT11_GPIO_PIN, 0);
delay_us(40);
// 检测响应
if(XGpioPs_ReadPin(&Gpio, DHT11_GPIO_PIN) == 0) {
// 等待响应结束
while(XGpioPs_ReadPin(&Gpio, DHT11_GPIO_PIN) == 0 && retry++ < 100) delay_us(1);
retry = 0;
while(XGpioPs_ReadPin(&Gpio, DHT11_GPIO_PIN) == 1 && retry++ < 100) delay_us(1);
// 读取数据
for(i = 0; i < 5; i++) {
for(j = 0; j < 8; j++) {
while(XGpioPs_ReadPin(&Gpio, DHT11_GPIO_PIN) == 0);
delay_us(40);
data[i] |= (XGpioPs_ReadPin(&Gpio, DHT11_GPIO_PIN) ? (1 << (7-j)) : 0);
while(XGpioPs_ReadPin(&Gpio, DHT11_GPIO_PIN) == 1);
}
}
// 校验数据
if(data[4] == ((data[0]+data[1]+data[2]+data[3]) & 0xFF)) {
*humidity = data[0];
*temperature = data[2];
return XST_SUCCESS;
}
}
// 重置GPIO状态
XGpioPs_SetDirectionPin(&Gpio, DHT11_GPIO_PIN, 1);
XGpioPs_WritePin(&Gpio, DHT11_GPIO_PIN, 1);
usleep(1000); // 等待1ms
}
return XST_FAILURE;
}
int main() {
int Status;
u8 temperature, humidity;
Status = DHT11_Init();
if (Status != XST_SUCCESS) {
xil_printf("DHT11 Initialization Failed\n\r");
return XST_FAILURE;
}
Status = Buzzer_Init();
if (Status != XST_SUCCESS) {
xil_printf("Buzzer Initialization Failed\n\r");
return XST_FAILURE;
}
Status = LED_Init();
if (Status != XST_SUCCESS) {
xil_printf("LED Initialization Failed\n\r");
return XST_FAILURE;
}
xil_printf("DHT11 Temperature & Humidity Monitor Started\n\r");
xil_printf("Alarm Threshold: %d°C\n\r", ALARM_THRESHOLD);
xil_printf("Humidity Threshold: %d%%\n\r", HUMIDITY_THRESHOLD);
while(1) {
Status = DHT11_Read(&temperature, &humidity);
if(Status == XST_SUCCESS) {
xil_printf("Temp: %d°C, Humi: %d%%\n\r", temperature, humidity);
// 温度超过阈值时触发报警
if(temperature > ALARM_THRESHOLD) {
xil_printf("ALARM: Temperature exceeds threshold!\n\r");
Buzzer_Alarm();
}
// 根据湿度控制LED
if(humidity > HUMIDITY_THRESHOLD) {
LED_Control(1); // 湿度大于阈值,LED点亮
} else {
LED_Control(0); // 湿度小于等于阈值,LED熄灭
}
} else {
xil_printf("Read Error, Retrying...\n\r");
LED_Control(0); // 读取错误时LED熄灭
}
sleep(2);
}
return XST_SUCCESS;
}解释这段代码
最新发布