ARM I2C温湿度实验

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

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

主程序main.c

#include"led.h"
 
#include "fan.h"
 
#include "bee.h"
 
int main()
 
{
 
    //led初始化
 
    all_led_init();
 
	fan_init();
 
	bee_init();
 
    //i2c初始化
 
    i2c_init();
 
    //si7006初始化
 
    si7006_init();
 
    short tem;
 
    unsigned int short hum;
 
    while(1)
 
    {
        //读取温度数据
 
        tem=si7006_read_tem();
 
        //读取湿度数据
 
        hum=si7006_read_hum();
 
        //计算温湿度数据
 
        hum=125*hum/65536-6;
 
        tem=175.72*tem/65536-46.85;
 
        printf("hum:%d\n",hum);
 
        printf("tem:%d\n",tem);
 
        if(hum>=75)
 
        {
 
            LED1_ON();
 
            BEE_ON();
 
        }
 
        if(hum<75)
 
        {
 
            LED1_OFF();
 
        }
 
        if(tem>=28)
 
        {
            FAN_ON();
 
            BEE_ON();
        }
 
        if(tem<28)
 
        {
 
            FAN_OFF();
 
        }
 
        if(tem<28&&hum<75)
 
        {
 
            BEE_OFF();
 
        }
        //串口打印
        delay(1000);
    }
 
    return 0;
}

风扇程序fan.c

#include "fan.h"
void fan_init()
{
    RCC->MP_AHB4ENSETR  |= (0x1<<4);
    GPIOE->MODER &= (~(0X3<<18));
    GPIOE->MODER |= (0X1<<18);
 
    GPIOE->OTYPER &= (~(0X1<<9));
 
    GPIOE->OSPEEDR &= (~(0X3<<18));
 
    GPIOE->PUPDR &= (~(0X3<<18));
 
     GPIOE->ODR &= (~(0X1<<9));
}
 
void FAN_ON()
{
    GPIOE->ODR |= (0X1<<9);
}
void FAN_OFF()
{
  GPIOE->ODR &=  (~(0X1<<9));
}

蜂鸣器程序bee.c

#include"bee.h"
void bee_init()
{
    RCC->MP_AHB4ENSETR  |= (0x1<<1);

    GPIOB->MODER &= (~(0X3<<12));

    GPIOB->MODER |= (0X1<<12);
 
    GPIOB->OTYPER &= (~(0X1<<6));
 
    GPIOB->OSPEEDR &= (~(0X3<<12));
 
    GPIOB->PUPDR &= (~(0X3<<12));
 
    GPIOB->ODR &= (~(0X1<<6));
}
 
void BEE_ON()
{
    GPIOB->ODR |= (0X1<<6);
}
void BEE_OFF()
{
  GPIOB->ODR &=  (~(0X1<<6));
}

灯光程序led.c

#include "led.h"
 
void all_led_init()//led灯的初始化
{
    //GPIOE/GPIOF时钟使能
    RCC->MP_AHB4ENSETR  |= (0x3<<4);

    //PE10设置为输出
    GPIOE->MODER &= (~(0X3<<20));
    GPIOE->MODER |= (0X1<<20);

    //PF10设置为输出
    GPIOF->MODER &= (~(0X3<<20));
    GPIOF->MODER |= (0X1<<20);

    //PE8设置为输出
    GPIOE->MODER &= (~(0X3<<16));
    GPIOE->MODER |= (0X1<<16);
    //PE10设置为推挽输出
    GPIOE->OTYPER &= (~(0X1<<10));

    //PF10设置为推挽输出
    GPIOF->OTYPER &= (~(0X1<<10));

    //PE8设置为推挽输出
    GPIOE->OTYPER &= (~(0X1<<8));

    //PE10设置为低速输出
    GPIOE->OSPEEDR &= (~(0X3<<20));

    //PF10设置为低速输出
    GPIOF->OSPEEDR &= (~(0X3<<20));

    //PE8设置为低速输出
   GPIOE->OSPEEDR &= (~(0X3<<16));

    //PE10无上拉下拉电阻
    GPIOE->PUPDR &= (~(0X3<<20));

    //PF10无上拉下拉电阻
    GPIOF->PUPDR &= (~(0X3<<20));

    //PE8无上拉下拉电阻
    GPIOE->PUPDR &= (~(0X3<<16));

    //三盏灯默认输出低电平
    GPIOE->ODR &= (~(0X1<<10));
    GPIOF->ODR &= (~(0X1<<10));
    GPIOE->ODR &= (~(0X1<<8));
}
 
//led1亮
void LED1_ON()
{
    GPIOE->ODR |= (0X1<<10);
}
//led2亮
void LED2_ON()
{
   GPIOF->ODR |= (0X1<<10);
}
//led1亮
void LED3_ON()
{
    GPIOE->ODR |= (0X1<<8);
}
 
//LED1灭
void LED1_OFF()
{
     GPIOE->ODR &= (~(0X1<<10));
}
//LED2灭
void LED2_OFF()
{
     GPIOF->ODR &= (~(0X1<<10));
}
//LED3灭
void LED3_OFF()
{
     GPIOE->ODR &= (~(0X1<<8));
}    

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心若向阳,何惧悲伤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值