文章目录
- 功能
- 接线示意图
- 效果图
- 原理
功能
硬件
IIC OLED 0.96寸
无源蜂鸣器 低电平触发
DHT11 温湿度传感器
板子上的2个按键
板子上的2个灯
功能:
1 显示温湿度
2 按键单击双击识别
3 按键修改温湿度,双击选择某一个设置项目,单击进行加或者减
4 温湿度任意一个数值大于设定值后蜂鸣器报警,P1.0小灯亮
5 P4.7小灯一直闪烁 表示处于工作中
接线示意图
效果图
原理
部分代码:
这段代码是一个温湿度报警仪系统的主程序,功能是通过连接DHT11温湿度传感器和OLED显示屏,实时监测环境的温度和湿度,并根据设定的温湿度上限进行报警。
代码中首先包含了一些引用的头文件,然后定义了一些全局变量和宏定义。接下来是一些函数的声明。
在main函数中,首先对时钟系统进行初始化,然后初始化OLED显示屏,显示初始界面。接着初始化LED灯和定时器,并开始主循环。
主循环中,首先检查是否到达定时时间,并进行相应的处理。然后读取按键的值,如果有按键按下,则根据按键的值进行操作,并更新显示屏上的内容。最后通过延时等待一段时间后继续循环。
其中,receive_init()函数用于初始化DHT11传感器,包括发出启动信号、接收温湿度数据并进行校验。receive()函数用于接收DHT11传感器发送的一个字节的数据。
其他的函数包括一些初始化操作,例如初始化LED灯、1秒定时器、按键等,以及一些辅助函数用于处理数据和更新显示屏内容。
总的来说,这段代码实现了一个简单的温湿度报警系统,通过DHT11传感器检测环境温湿度并根据设定的上限进行报警,同时通过OLED显示屏进行实时显示。
/*
* 主系统4MHZ smclk 1mhz aclk 32768HZ
*
* OLED SCL--P3.0 SDA--P3.1 VCC--3.3V GND--GND
* beep DAT--P2.4 VCC--3.3V GND--GND 无源 低电平触发
* DHT11 DAT--P4.1 VCC--3.3 GND--GND
* 注意 DHT11不是那种快速的传感器 是比较居家的那种
* 读取DHT11的间隔时间要大于1s,不然这传感器工作不正常
* 所以在程序里设定了2s钟 系统检测一次温湿度
* 当程序下载后,需要断电系统重新上电,为了让DHT11重新上电工作。
*
*
*/
#include <msp430.h>
#include "OLED.h"
#include "key.h"
unsigned char warn_temp_h = 30, warn_humd_h = 50;
unsigned char disp[16];
char count = 0;
unsigned char time, key, setting = 0;
unsigned char over_flag = 0;
#define CPU_F ( (double) 4000000)
#define delay_us(x) __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) ) /* 微秒延时程序 */
#define delay_ms(x) __delay_cycles( (long) (CPU_F * (double) x / 1000.0) )
#define HIGH P4OUT |= BIT1
#define LOW P4OUT &= ~BIT1
unsigned char temph, templ, humdh, humdl, check, cal;
void main(void)
{
WDTCTL = WDTPW | WDTHOLD; /* Stop watchdog timer */
CLOCK_INIT();
OLED_Init(); /* OLED初始化 */
oled_init_disp();
init_led();
init_1s_timer();
oled_disp();
init_key();
_EINT();
while (1)
{
if (over_flag)
{
_DINT();
over_flag = 0;
/* 如果读取到了 并且校验成功 */
if (receive_init() == 1)
{
oled_disp_dht11();
if ((humdh > warn_humd_h) || (temph > warn_temp_h))
{
P1OUT |= BIT0; /* 点亮 */
open_beep();
}
else
{
P1OUT &= ~BIT0; /* 熄灭 */
close_beep();
}
}
_EINT();
}
time++;
if (time > 10)
{
time = 0;
//p4.7
P4OUT ^= BIT7;
}
delay_ms(10);
key = get_key();
if (key)
{
//显示按键
count = 0;
disp[count++] = key % 100 / 10 + '0';
disp[count++] = key % 10 / 1 + '0';
disp[count++] = 0;
OLED_ShowString(0, 0, disp, 0);
//处理按键
do_key(key);
}
}
}
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0()
{
over_flag = 1;
}
全部代码:dt2.8tupian.net/2/28880a20b16800.pg3