C51用GY39光强检测通过串口通信CT连RXD,DR连TXD,用LCD1602显示
时间: 2024-05-29 10:03:10 浏览: 25
首先,需要确保GY39光强检测模块能够正常工作,可以使用单片机的串口助手工具来进行测试和调试。接下来,需要将GY39模块的CT引脚连接到单片机的RXD引脚,DR引脚连接到单片机的TXD引脚。
在单片机程序中,需要使用UART通信协议来进行串口通信,并且需要配置串口的波特率、数据位、停止位和校验位等参数。可以使用标准的C语言库函数或者单片机厂家提供的专门的库函数来实现串口通信。
接下来,需要将LCD1602模块连接到单片机的相应引脚上,并且需要编写LCD1602的驱动程序来控制LCD显示屏的显示内容。可以参考LCD1602的应用手册或者单片机厂家提供的相关资料来编写LCD1602的驱动程序。
最后,需要将GY39模块读取到的光强数据通过串口发送给单片机,并且将数据转换为可读的格式并显示在LCD1602屏幕上。可以使用标准的C语言库函数或者单片机厂家提供的专门的库函数来实现数据转换和LCD1602的显示操作。
相关问题
C51用GY39光强检测通过串口通信CT连RXD,DR连TXD,用LCD1602显示代码
以下是基于C51单片机使用GY39光强检测器并通过串口通信将数据显示在LCD1602上的代码,你可以参考一下:
```
#include <reg51.h>
#include <stdio.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_E = P2^2;
sbit CT = P3^0;
sbit DR = P3^1;
sbit LED = P1^0;
unsigned char LCD1602_Read_Busy()
{
unsigned char sta;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do
{
LCD1602_E = 1;
sta = LCD1602_DB;
LCD1602_E = 0;
}while(sta & 0x80);
return sta;
}
void LCD1602_Write_Command(unsigned char cmd)
{
LCD1602_Read_Busy();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
void LCD1602_Write_Data(unsigned char dat)
{
LCD1602_Read_Busy();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
void LCD1602_Init()
{
LCD1602_Write_Command(0x38); //8位数据接口,2行显示,5x7点阵字符
LCD1602_Write_Command(0x0C); //显示开,关游标,不闪烁
LCD1602_Write_Command(0x06); //光标移动,不移动屏幕
LCD1602_Write_Command(0x01); //清屏
}
void LCD1602_Show_String(unsigned char x, unsigned char y, unsigned char *str)
{
unsigned char i = 0;
if(x < 16 && y < 2)
{
if(y == 0)
LCD1602_Write_Command(0x80 + x);
else
LCD1602_Write_Command(0xC0 + x);
while(str[i] != '\0')
{
LCD1602_Write_Data(str[i]);
i++;
}
}
}
void UART_Init()
{
TMOD = 0x20;
TH1 = 0xFD;
TL1 = TH1;
SCON = 0x50;
TR1 = 1;
}
unsigned char UART_IsRxReady()
{
return RI;
}
unsigned char UART_ReadByte()
{
RI = 0;
return SBUF;
}
void UART_WriteByte(unsigned char dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
unsigned char GY39_ReadData(unsigned char reg_addr)
{
unsigned char dat;
CT = 0;
DR = 1;
DR = 0;
UART_WriteByte(reg_addr);
dat = UART_ReadByte();
CT = 1;
return dat;
}
void main()
{
unsigned char str[16];
unsigned char data;
LCD1602_Init();
UART_Init();
while(1)
{
data = GY39_ReadData(0x10);
LED = data > 128 ? 1 : 0; // 光强度大于128时点亮LED
sprintf(str, "Light: %d", data);
LCD1602_Show_String(0, 0, str);
delay(500);
}
}
```
注意:此代码仅供参考,具体实现可能需要根据实际情况进行修改。
编写代码实现:1) 用 51 单片机做控制芯片,用 GY39 模块(引脚为vcc,ct,dr,gnd)来实现光强的检测; 2) 湿度值通过计算后,要能够准确的显示在 LCD1602 上面; 3) 当光照值过低时自动的打开 LED 灯; 4) 当光照值过高时步进电机开始动作。
以下是基于 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 秒
}
}
```
注意:以上代码仅供参考,需要根据具体的硬件环境进行修改和调试。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)