ARM.day8

1.自己设置温度湿度阈值,当温度过高时,打开风扇,蜂鸣器报警

2.当湿度比较高时,打开LED1灯,蜂鸣器报警

main.c

复制代码
#include "si7006.h"
#include "CH1.h"
#include "led.h"
// 延时函数

int main()
{
	// iic初始化
    iic_init();
    // si7006初始化
    si7006_init();
    // 风扇,蜂鸣器,LED灯初始化
    TIM1_init();
    TIM4_init();
    all_led_init();
    // 温度
    short tem;
    // 湿度
    unsigned int short hum;
    while (1)
    {
        // 读取温度数据
        tem=si7006_read_tme();
        // 读取湿度数据
        hum=si7006_read_hum();
        // 计算温湿度数据
        tem=175.72*tem/65536-46.85;
        hum=125*hum/65536-6;
        // 串口打印
        printf("tem:%d\n",tem);
        printf("hum:%d",hum);
        if(tem>25)
        {
            TIM1_ON();
            TIM4_ON();
        }
        if(hum>60)
        {
            LED1_ON();
            TIM4_ON();
        }
        delay(1000);
        TIM1_OFF();
        LED1_OFF();
        TIM4_OFF();
    }
    
    return 0;
}

si7006.c

复制代码
#include"si7006.h"
//封装延时函数
void delay(int ms)
{
    int i,j;
    for(i=0;i<ms;i++)
    {
        for(j=0;j<2000;j++)
        {}

    }
}
void si7006_init()
{
    
    //发起起始信号
    i2c_start();
    //发送从机地址+写标志
    i2c_write_byte(0X40<<1|0);
    //等待从机应答
    i2c_wait_ack();
    //发送寄存器地址 0XE6
    i2c_write_byte(0XE6);
    //等待从机应答
    i2c_wait_ack();
    //传输要写入的数据0X3A、
    i2c_write_byte(0X3A);
    //等待从机应答
    i2c_wait_ack();
    //发送终止信号
    i2c_stop();
}

short si7006_read_tem()
{
    short tem;
    char tem_h,tem_l;
    //发起起始信号
    i2c_start();
    //发送从机地址+写标志
    i2c_write_byte(0x40<<1|0);
    //等待从机应答
    i2c_wait_ack();
    //发送寄存器地址  0XE3
    i2c_write_byte(0xe3);
    //等待从机应答
    i2c_wait_ack();
    //重复起始信号
    i2c_start();
    //发送从机地址+读标志
    i2c_write_byte(0x40<<1|1);
    //等待从机应答
    i2c_wait_ack();
    delay(100);//等待从机测量数据
    //接收数据高八位
    //发送应答信号
    tem_h=i2c_read_byte(0);

    //接收数据低八位
    //发送非应答信号
    tem_l=i2c_read_byte(1);
    //将高八位和低八位合成一个数据   高八位<<8|低8位
    tem=tem_h<<8|tem_l;
    return  tem;
}

unsigned short si7006_read_hum()
{

    unsigned short hum;
     unsigned char hum_h,hum_l;
    //发起起始信号
    i2c_start();
    //发送从机地址+写标志
    i2c_write_byte(0x40<<1|0);
    //等待从机应答
    i2c_wait_ack();
    //发送寄存器地址  0XE3
    i2c_write_byte(0xe5);
    //等待从机应答
    i2c_wait_ack();
    //重复起始信号
    i2c_start();
    //发送从机地址+读标志
    i2c_write_byte(0x40<<1|1);
    //等待从机应答
    i2c_wait_ack();
    delay(100);//等待从机测量数据
    //接收数据高八位
    //发送应答信号
    hum_h=i2c_read_byte(0);

    //接收数据低八位
    //发送非应答信号
    hum_l=i2c_read_byte(1);
    //将高八位和低八位合成一个数据   高八位<<8|低8位
    hum=hum_h<<8|hum_l;
    return  hum;
}

si7006.h

复制代码
#ifndef __SI7006_H_
#define __SI7006_H_
#include "iic.h"

void si7006_init();
short si7006_read_tem();
unsigned short si7006_read_hum();
#endif

CH1.c

复制代码
#include "CH1.h"
//风扇的初始化
void TIM1_init() 
{
    //GPIOE时钟使能
    RCC |= (0x1 << 4);
    //PE9设置为输出
    GPIOE->MODER &= (~(0X3 << 18));
    GPIOE->MODER |= (0X1 << 18);
    //PE9设置为推挽输出
    GPIOE->OTYPER &= (~(0X1 << 9));
    //PE9设置为低速输出
    GPIOE->OSPEEDR &= (~(0X3 << 18));
    //PE9无上拉下拉电阻
    GPIOE->OPUPDR &= (~(0X3 << 18));
    //默认输出低电平
    GPIOE->ODR &= (~(0X1 << 9));
}
//蜂鸣器初始化
void TIM4_init()
{
   //GPIOB时钟使能
    RCC |= (0x1 << 1);
    //PB6设置为输出
    GPIOB->MODER &= (~(0X3 << 12));
    GPIOB->MODER |= (0X1 << 12);
    //PB6设置为推挽输出
    GPIOB->OTYPER &= (~(0X1 << 6));
    //PB6设置为低速输出
    GPIOB->OSPEEDR &= (~(0X3 << 12));
    //PB6无上拉下拉电阻
    GPIOB->OPUPDR &= (~(0X3 << 12));
    //默认输出低电平
    GPIOB->ODR &= (~(0X1 << 6));
}
// 风扇转动
void TIM1_ON()
{
    GPIOE->ODR |= (0X1 << 9);
}
// 风扇关闭
void TIM1_OFF()
{
    GPIOE->ODR |= (~(0X1 << 9));
}
// 蜂鸣器启动
void TIM4_ON()
{
    GPIOB->ODR |= (0X1 << 6);
}
// 蜂鸣器关闭
void TIM4_OFF()
{
    GPIOB->ODR |= (~(0X1 << 6));
}
相关推荐
zbyyd16 小时前
Linux 基础与 Shell 命令
linux·运维·arm开发
振南的单片机世界2 天前
EXTI“一线多挂”陷阱:PA0和PB0同时触发,中断函数懵了
arm开发·stm32·单片机·嵌入式硬件
LCMICRO-133108477462 天前
国产长芯微LP4807完全P2P替代ADA4807,1mA、300MHz 增益带宽、电压反馈运算放大器
arm开发·嵌入式硬件·fpga开发·硬件工程·运算放大器·ada4807
LCMICRO-133108477462 天前
国产长芯微LP8628完全P2P替代AD8628,零漂移、单电源、输入输出轨到轨高精度运放
arm开发·嵌入式硬件·fpga开发·硬件工程·精密运放·ad8628
zlinear数据采集卡3 天前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
CIAS4 天前
uniontechos-server-20 1050 u2a pxe Server -x86 arm loongarch
arm开发
振南的单片机世界4 天前
推挽vs开漏:一个“强拉硬灌”,一个“只拉不管”
arm开发·stm32·单片机·嵌入式硬件
zlinear数据采集卡4 天前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
硅农程序猿5 天前
从需求到硅片| 一文讲清数字芯片设计流程
arm开发·硬件架构·risc-v
秋田君5 天前
QT_网络编程体系
网络·arm开发·qt