1 读取 Manufacturer_ID_value 和 Device_ID_value,看是不是数据手册中的数值
2 写入0X02寄存器配置,关闭加热器,设置温湿度sequence mode读取,14位精度
Configuration_1 0x1000 // Heater disabled, Temperature and Humidity are acquired in sequence, Temperature first., 14-bit resolution
3 读取0x00 和 0x01 的温湿度数值
4 依据手册中的公式转化为温湿度
这段代码是一个嵌入式系统程序,采用C语言编写。它的作用是通过DHT11传感器获取温湿度数据,并将数据显示在OLED屏幕上。
下面是对代码的详细解释:
int main(void):定义了main函数,是程序的入口。
unsigned char dis[10];:定义了一个长度为10的无符号字符数组dis,用于存储要显示的字符串。
WDTCTL = WDTPW + WDTHOLD;:停止看门狗定时器,防止系统复位。
if (CALBC1_8MHZ == 0xFF):检查校准常量是否被擦除。
while (1);:如果校准常量被擦除,则进入死循环,陷入无限等待状态。
DCOCTL = 0;:选择最低的DCOx和MODx设置,即最低频率设置。
BCSCTL1 = CALBC1_8MHZ;:设置系统时钟频率为8MHz。
DCOCTL = CALDCO_8MHZ;:设置DCO步进和调制。
OLED_Init();:执行OLED初始化操作,准备显示数据。
OLED_ShowString(0, 0, "dht11:");:在OLED屏幕的第一行显示"dht11:"。
while (1):进入一个无限循环,用于不断读取并显示温湿度数据。
if (start_DHT11()):如果启动DHT11传感器成功。
dis[0] = DHT11T_Data_H % 100 / 10 + '0';:将温度数据的十位数转换为字符并存储在dis数组的第一个位置。
dis[1] = DHT11T_Data_H % 10 + '0';:将温度数据的个位数转换为字符并存储在dis数组的第二个位置。
dis[2] = 'C';:存储字符'C',表示摄氏度单位。
dis[3] = ' ';:存储一个空格字符。
dis[4] = DHT11RH_Data_H % 100 / 10 + '0';:将湿度数据的十位数转换为字符并存储在dis数组的第四个位置。
dis[5] = DHT11RH_Data_H % 10 + '0';:将湿度数据的个位数转换为字符并存储在dis数组的第五个位置。
dis[6] = '%';:存储字符'%',表示湿度的百分比符号。
dis[7] = 0;:在dis数组的末尾加上字符串结束符。
OLED_ShowString(0, 2, dis);:在OLED屏幕的第三行显示dis数组中的数据。
delay_ms(2000);:延时2秒,使程序每2秒读取一次温湿度数据。
以上就是这段代码的解释,它的功能是通过DHT11传感器获取温湿度数据,并将数据显示在OLED屏幕上。
c// 使用SysTick延时
//注意:断电的时候才能接线!不要把VCC和GND接反!也不要给HDC1080提供5V的电压供电!不然都有可能损坏HDC1080!
// * | 3v3|----|HDC1080 +
// * | | |
// * | | |
// * | GND|----|HDC1080 -
// * | | |
// * | | |
// * | P3.7|----|HDC1080 DA
// * | | |
// * | | |
// * | P3.6|----|HDC1080 CL
// * | | |
// * | | |
// * RST -| P3.3/UCA0TXD|----|
// * | | |
// * | | |
// * | P3.2/UCA0RXD|----|
/* DriverLib Includes */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
/* Standard Includes */
#include <stdint.h>
#include <stdbool.h>
#include "myiic.h"
uint8_t TXData = 1;
uint8_t RXData = 0;
const eUSCI_UART_ConfigV1 uartConfig = { EUSCI_A_UART_CLOCKSOURCE_SMCLK, // SMCLK Clock Source
156, // BRDIV = 13
4, // UCxBRF = 0
0, // UCxBRS = 37
EUSCI_A_UART_NO_PARITY, // No Parity
EUSCI_A_UART_LSB_FIRST, // LSB First
EUSCI_A_UART_ONE_STOP_BIT, // One stop bit
EUSCI_A_UART_MODE, // UART mode
EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION, // Oversampling
EUSCI_A_UART_8_BIT_LEN // 8 bit data length
};
void send_str(unsigned char *p)
{
while (*p)
{
MAP_UART_transmitData(EUSCI_A0_BASE, *p++);
delay_ms(5);
}
}
typedef enum
{
TEMPERATURE = 0x00,
HUMIDITY = 0x01,
CONFIGURATION = 0x02,
MANUFACTURER_ID = 0xFE,
DEVICE_ID = 0xFF,
SERIAL_ID_FIRST = 0xFB,
SERIAL_ID_MID = 0xFC,
SERIAL_ID_LAST = 0xFD,
} HDC1080_Pointers;
extern int org_tem, org_hum;
unsigned char send[50];
int sendi = 0;
int main(void)
{
unsigned char datax1[4];
/* Halting WDT */
MAP_WDT_A_holdTimer();
/* Selecting P1.2 and P1.3 in UART mode and P1.0 as output (LED) */
MAP_GPIO_setAsPeripheralModuleFunctionInputPin(
GPIO_PORT_P1, GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);
/* Configuring P1.0 as output */
MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
FlashCtl_setWaitState(FLASH_BANK0, 1);
FlashCtl_setWaitState(FLASH_BANK1, 1);
/* Setting DCO to 24MHz */
MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);
CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_24);
/* Enabling the FPU for floating point operation */
MAP_FPU_enableModule();
MAP_FPU_enableLazyStacking();
/* Configuring UART Module */
MAP_UART_initModule(EUSCI_A0_BASE, &uartConfig);
/* Enable UART module */
MAP_UART_enableModule(EUSCI_A0_BASE);
/* Enabling interrupts */
MAP_UART_enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);
MAP_Interrupt_enableInterrupt(INT_EUSCIA0);
//MAP_Interrupt_enableSleepOnIsrExit();
/* Enabling MASTER interrupts */
MAP_Interrupt_enableMaster();
delay_init(24000000); /* 初始化 SysTick */
delay_ms(200);
IIC_Init();
HDC1080_Init();
delay_ms(200);
while (1)
{
I2C_Read_HDC1080_TempHumidity(HDC1080_I2C_ADDR, Temperature, datax1);
Convert_HDC1080_TempHumidity(datax1);
sendi = 0;
send[sendi++] = 'T';
send[sendi++] = 'e';
send[sendi++] = 'm';
send[sendi++] = 'p';
send[sendi++] = ':';
send[sendi++] = '0' + org_tem % 1000 / 100;
send[sendi++] = '0' + org_tem % 100 / 10;
send[sendi++] = '.';
send[sendi++] = '0' + org_tem % 10;
send[sendi++] = 'C';
send[sendi++] = ' ';
send[sendi++] = ' ';
send[sendi++] = ' ';
send[sendi++] = 'H';
send[sendi++] = 'u';
send[sendi++] = 'm';
send[sendi++] = 'i';
send[sendi++] = ':';
send[sendi++] = '0' + org_hum % 1000 / 100;
send[sendi++] = '0' + org_hum % 100 / 10;
send[sendi++] = '.';
send[sendi++] = '0' + org_hum % 10;
send[sendi++] = '%';
send[sendi++] = '\r';
send[sendi++] = '\n';
send[sendi++] = 0;
delay_ms(1000);
}
}
/* EUSCI A0 UART ISR - Echos data back to PC host */
void EUSCIA0_IRQHandler(void)
{
uint32_t status = MAP_UART_getEnabledInterruptStatus(EUSCI_A0_BASE);
if (status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG)
{
RXData = MAP_UART_receiveData(EUSCI_A0_BASE);
if(RXData=='G')
{
send_str(send);
}
//MAP_UART_transmitData(EUSCI_A0_BASE, RXData);
}
}
https://github.com/xddun/blog_code_search
csharphttps://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!