编写代码实现:1) 用 51 单片机做控制芯片,用 GY39 模块(引脚为vcc,ct,dr,gnd)来实现光强的检测; 2) 湿度值通过计算后,要能够准确的显示在 LCD1602 上面; 3) 当光照值过低时自动的打开 LED 灯; 4) 当光照值过高时步进电机开始动作。
时间: 2024-05-01 08:16:07 浏览: 93
以下是基于 Keil C51 编译器的代码实现:
```
#include <reg52.h>
#include <stdio.h>
#include <lcd.h>
sbit LED = P1^0; //LED 灯连接在 P1.0
sbit STEPPER_PUL = P2^0; //步进电机脉冲信号连接在 P2.0
sbit STEPPER_DIR = P2^1; //步进电机方向信号连接在 P2.1
sbit GY39_VCC = P3^7; //GY39 VCC 引脚连接在 P3.7
sbit GY39_CT = P3^6; //GY39 CT 引脚连接在 P3.6
sbit GY39_DR = P3^5; //GY39 DR 引脚连接在 P3.5
sbit GY39_GND = P3^4; //GY39 GND 引脚连接在 P3.4
void delay_ms(unsigned int ms) //延时函数
{
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 1000; j++);
}
void stepper_motor_rotate(int steps, int direction) //步进电机转动函数
{
int i;
STEPPER_DIR = direction; //设置方向
for(i = 0; i < steps; i++)
{
STEPPER_PUL = 1; //脉冲信号置高
delay_ms(1); //延时
STEPPER_PUL = 0; //脉冲信号置低
delay_ms(1); //延时
}
}
void main()
{
unsigned char hum_str[10]; //湿度字符串缓冲区
unsigned char lcd_str[16]; //LCD 显示字符串缓冲区
unsigned int light_intensity; //光强值
float humidity; //湿度值
GY39_VCC = 1; //GY39 模块供电
delay_ms(100); //等待模块初始化完成
lcd_init(); //LCD 初始化
while(1)
{
GY39_CT = 1; //触发测量
delay_ms(10); //等待测量完成
light_intensity = (GY39_DR << 8) | P0; //读取光强值
humidity = (float)((P0 << 8) | GY39_DR) / 10.0; //计算湿度值
sprintf(hum_str, "%.1f", humidity); //格式化湿度值字符串
lcd_clear(); //清屏
sprintf(lcd_str, "Humidity: %s%%", hum_str); //格式化 LCD 显示字符串
lcd_puts(lcd_str); //显示湿度值
if(light_intensity < 100) //光强过低
LED = 1; //打开 LED 灯
else
LED = 0; //关闭 LED 灯
if(light_intensity > 500) //光强过高
stepper_motor_rotate(100, 0); //步进电机顺时针转动 100 步
delay_ms(1000); //等待 1 秒
}
}
```
注意:以上代码仅供参考,需要根据具体的硬件环境进行修改和调试。
阅读全文