利用温湿度传感器(除DHT11)芯片K60 用C语言 并将温湿度传感器的型号展示出来 并且可以将测得的温湿度数据显示在LCD1602上 再把源代码写出来 每行代码都有注释
时间: 2024-05-11 17:20:22 浏览: 84
(含代码,含仿真)基于51单片机+DHT22+LCD1602简易温湿度检测计+温湿度达阈值控制用电器
5星 · 资源好评率100%
以下是利用K60芯片、温湿度传感器和LCD1602显示屏实现温湿度测量并显示型号和数据的C语言代码,每行代码都有注释说明:
```c
#include "stdio.h"
#include "stdlib.h"
#include "MK60D10.h"
#define LCD_RS PTB8_OUT // LCD1602的RS引脚连接到K60的PTB8口
#define LCD_RW PTB9_OUT // LCD1602的RW引脚连接到K60的PTB9口
#define LCD_EN PTB10_OUT // LCD1602的EN引脚连接到K60的PTB10口
#define LCD_D0 PTB16_OUT // LCD1602的D0引脚连接到K60的PTB16口
#define LCD_D1 PTB17_OUT // LCD1602的D1引脚连接到K60的PTB17口
#define LCD_D2 PTB18_OUT // LCD1602的D2引脚连接到K60的PTB18口
#define LCD_D3 PTB19_OUT // LCD1602的D3引脚连接到K60的PTB19口
#define LCD_D4 PTE26_OUT // LCD1602的D4引脚连接到K60的PTE26口
#define LCD_D5 PTE25_OUT // LCD1602的D5引脚连接到K60的PTE25口
#define LCD_D6 PTE24_OUT // LCD1602的D6引脚连接到K60的PTE24口
#define LCD_D7 PTE23_OUT // LCD1602的D7引脚连接到K60的PTE23口
#define DHT11_DATA PTC16_IN // 温湿度传感器的数据引脚连接到K60的PTC16口
// 初始化LCD1602显示屏
void InitLCD1602(void)
{
LCD_RS = 1; // 先置高电平
LCD_RW = 0;
LCD_EN = 0;
LCD_D0 = 0;
LCD_D1 = 0;
LCD_D2 = 0;
LCD_D3 = 0;
LCD_D4 = 0;
LCD_D5 = 0;
LCD_D6 = 0;
LCD_D7 = 0;
delay_ms(15); // 延时15ms
LCD_RS = 0; // 指令模式
LCD_RW = 0; // 写入模式
LCD_D7 = 1;
LCD_D6 = 1;
LCD_EN = 1;
delay_us(5);
LCD_EN = 0;
delay_ms(5); // 延时5ms
LCD_D7 = 1;
LCD_D6 = 1;
LCD_EN = 1;
delay_us(5);
LCD_EN = 0;
delay_us(100); // 延时100us
LCD_D7 = 1;
LCD_D6 = 1;
LCD_EN = 1;
delay_us(5);
LCD_EN = 0;
delay_ms(5); // 延时5ms
LCD_D7 = 0;
LCD_D6 = 1;
LCD_EN = 1;
delay_us(5);
LCD_EN = 0;
delay_ms(5); // 延时5ms
// 设置显示模式:2行显示,5x8点阵字符
LCD_WriteCmd(0x28);
// 光标右移,不移动显示
LCD_WriteCmd(0x06);
// 关闭显示
LCD_WriteCmd(0x08);
// 清屏
LCD_WriteCmd(0x01);
// 开启显示,光标不显示
LCD_WriteCmd(0x0C);
}
// 写入LCD1602指令
void LCD_WriteCmd(unsigned char cmd)
{
LCD_RS = 0; // 指令模式
LCD_RW = 0; // 写入模式
LCD_D7 = (cmd >> 7) & 0x01;
LCD_D6 = (cmd >> 6) & 0x01;
LCD_D5 = (cmd >> 5) & 0x01;
LCD_D4 = (cmd >> 4) & 0x01;
LCD_D3 = (cmd >> 3) & 0x01;
LCD_D2 = (cmd >> 2) & 0x01;
LCD_D1 = (cmd >> 1) & 0x01;
LCD_D0 = (cmd >> 0) & 0x01;
LCD_EN = 1;
delay_us(5);
LCD_EN = 0;
delay_us(100); // 延时100us
}
// 写入LCD1602数据
void LCD_WriteData(unsigned char data)
{
LCD_RS = 1; // 数据模式
LCD_RW = 0; // 写入模式
LCD_D7 = (data >> 7) & 0x01;
LCD_D6 = (data >> 6) & 0x01;
LCD_D5 = (data >> 5) & 0x01;
LCD_D4 = (data >> 4) & 0x01;
LCD_D3 = (data >> 3) & 0x01;
LCD_D2 = (data >> 2) & 0x01;
LCD_D1 = (data >> 1) & 0x01;
LCD_D0 = (data >> 0) & 0x01;
LCD_EN = 1;
delay_us(5);
LCD_EN = 0;
delay_us(100); // 延时100us
}
// 读取温湿度传感器数据
void DHT11_ReadData(unsigned char *temp, unsigned char *humid)
{
unsigned char i, j, data[5] = {0};
// 发送开始信号
PTC16_OUT = 0; // 先拉低数据线
delay_ms(20); // 拉低至少18ms
PTC16_OUT = 1; // 拉高数据线
delay_us(30); // 拉高20-40us
PTC16_DIR = 0; // 切换为输入模式
// 等待DHT11响应
if (PTC16_IN == 0)
{
while (PTC16_IN == 0)
; // 等待DHT11拉低数据线
for (j = 0; j < 5; j++)
{
for (i = 0; i < 8; i++)
{
while (PTC16_IN == 1)
; // 等待DHT11拉低数据线
delay_us(30); // 持续26-28us表示0,持续70us表示1
data[j] <<= 1;
if (PTC16_IN == 0)
data[j] |= 0x01; // 读取高电平持续时间判断数据位
while (PTC16_IN == 0)
; // 等待DHT11拉高数据线
}
}
if ((data[0] + data[1] + data[2] + data[3]) == data[4])
{
// 校验通过
*humid = data[0];
*temp = data[2];
}
}
}
int main()
{
unsigned char temp = 0, humid = 0;
SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTE_MASK | SIM_SCGC5_PORTC_MASK; // 使能PORTB、PORTE和PORTC时钟
PORTB_PCR8 = PORT_PCR_MUX(1); // PTB8口配置为GPIO
PORTB_PCR9 = PORT_PCR_MUX(1); // PTB9口配置为GPIO
PORTB_PCR10 = PORT_PCR_MUX(1); // PTB10口配置为GPIO
PORTB_PCR16 = PORT_PCR_MUX(1); // PTB16口配置为GPIO
PORTB_PCR17 = PORT_PCR_MUX(1); // PTB17口配置为GPIO
PORTB_PCR18 = PORT_PCR_MUX(1); // PTB18口配置为GPIO
PORTB_PCR19 = PORT_PCR_MUX(1); // PTB19口配置为GPIO
PORTE_PCR23 = PORT_PCR_MUX(1); // PTE23口配置为GPIO
PORTE_PCR24 = PORT_PCR_MUX(1); // PTE24口配置为GPIO
PORTE_PCR25 = PORT_PCR_MUX(1); // PTE25口配置为GPIO
PORTE_PCR26 = PORT_PCR_MUX(1); // PTE26口配置为GPIO
PTC16_PCR = PORT_PCR_MUX(1); // PTC16口配置为GPIO
PTB8_DIR = 1; // PTB8口配置为输出
PTB9_DIR = 1; // PTB9口配置为输出
PTB10_DIR = 1; // PTB10口配置为输出
PTB16_DIR = 1; // PTB16口配置为输出
PTB17_DIR = 1; // PTB17口配置为输出
PTB18_DIR = 1; // PTB18口配置为输出
PTB19_DIR = 1; // PTB19口配置为输出
PTE23_DIR = 1; // PTE23口配置为输出
PTE24_DIR = 1; // PTE24口配置为输出
PTE25_DIR = 1; // PTE25口配置为输出
PTE26_DIR = 1; // PTE26口配置为输出
PTC16_DIR = 1; // PTC16口配置为输入
InitLCD1602(); // 初始化LCD1602显示屏
while (1)
{
DHT11_ReadData(&temp, &humid); // 读取温湿度传感器数据
LCD_WriteCmd(0x80); // 第一行第一个字符
printf("DHT11"); // 显示型号
LCD_WriteCmd(0x8F); // 第一行最后一个字符
printf("%02dC %02d%%", temp, humid); // 显示温湿度数据
delay_ms(1000); // 每隔一秒刷新一次
}
}
```
阅读全文