单片机红外传感器_基于51单片机的声音传感器

单片机红外传感器_基于51单片机的声音传感器一、背景介绍我们工作久了,久坐导致的毛病就显现出来了,腰酸背痛颈椎疼,最近看到利用番茄钟工作法挺好,工作25分钟,休息5分钟,既能调整工作节奏,避免精力过分消耗,也能避免久坐导致的身体问题。我刚开始使用闹钟做提醒,后来尝试番茄钟软件,但是都要手动去操作手机,拿起手机看到信息,然后就会去处理手机上的事情了,起不到作用…直到有一天收拾东西看到了我大学期间基于51单片机做的一个电子设计,激起了我的灵感,开始了基于51单片机的自动番茄钟,久坐提醒神器的设计和制作。整体方案硬件部分继承了大学时焊接的电路板,更


Jetbrains全系列IDE稳定放心使用

一、背景介绍

我们工作久了,久坐导致的毛病就显现出来了,腰酸背痛颈椎疼,最近看到利用番茄钟工作法挺好,工作25分钟,休息5分钟,既能调整工作节奏,避免精力过分消耗,也能避免久坐导致的身体问题。
我刚开始使用闹钟做提醒,后来尝试番茄钟软件,但是都要手动去操作手机,拿起手机看到信息,然后就会去处理手机上的事情了,起不到作用…
直到有一天收拾东西看到了我大学期间基于51单片机做的一个电子设计,激起了我的灵感,开始了基于51单片机的自动番茄钟,久坐提醒神器的设计和制作。
整体方案硬件部分继承了大学时焊接的电路板,更换了传感器部分,软件部分重新编写了控制部分的代码。
之前的软硬件设计方案可以参考这篇文章《基于51单片机的上下限可调的数字温度控制系统》,本文重点阐述差异部分。

二、功能描述

本设计要求能够识别到座位上有人,并开始计时,能够在LCD屏上显示工作状态和倒计时时间。当超过设置的久坐提醒时间(25分钟),进行蜂鸣器和LED灯报警,并在LCD屏上显示让你休息的提示。人离开后能够重置时间,LCD屏显示离开状态,直到你坐下后开始重新计时。另外如果有特殊情况无法按时休息,支持按复位键重新计时。

三、系统组成

、。《》Mmjjuto-syussu2997msimpispwowo】

本系统由STC89C52单片机主控,通过晶振时钟模块、复位电路模块、按键模块、液晶显示模块、声光报警模块、传感器模块组成。
其中液晶显示模块采用LCD1602液晶显示屏,声光报警模块采用蜂鸣器和红黄绿三个LED灯,传感器模块开始采用的是E18-D80NK红外漫反射光电传感器。
传感器部分刚开始选用的是HC-SR501热释电红外传感器,但是调试过程中发现该人体红外传感器只能检测到移动的人体,无法检测到静止的人体。咱们工作的时候有时会很专注,静止在那里识别不到,传感器就认为没有人,导致功能失效。后来找了一下发现E18-D80NK红外漫反射光电传感器能够满足要求,于是选了这个传感器。

四、硬件设计

1、总体电路图

在这里插入图片描述
其中,传感器要换成红外漫反射光电传感器。

2、传感器介绍

在这里插入图片描述

五、软件设计

1、流程图

在这里插入图片描述

2、源代码

见附录

六、结果展示

1、正常工作状态

在这里插入图片描述

2、久坐提醒状态

在这里插入图片描述

3、离开休息状态

在这里插入图片描述

附录

主控部分
main.c

#include <reg52.h>
#include <stdio.h>

#include "lcd1602.h"

#define WORK_MAX_TIME (25 * 60)

sbit beep = P1 ^ 3;   //蜂鸣器
sbit pir = P2 ^ 0;    //热释电红外传感器信号线
sbit reset = P3 ^ 2;  //定义按键--复位键

sbit led0 = P2 ^ 2;  //绿灯
sbit led1 = P2 ^ 3;  //黄灯
sbit led2 = P2 ^ 4;  //红灯

uint work_time = WORK_MAX_TIME;  //工作坐着的秒数


//蜂鸣器
void di(uchar s) { 
   
    beep = 0;
    delay1ms(s);
    beep = 1;
}

//按键音
void key() { 
   
    di(100);
}

//报警音
void warn() { 
   
    di(5000);
}

//点亮LED
void lightLED(uchar c) { 
   
    if (c == 'r') { 
     // 红灯亮
        led0 = 1;
        led1 = 1;
        led2 = 0;
    } else if (c == 'g') { 
     // 绿灯亮
        led0 = 0;
        led1 = 1;
        led2 = 1;
    } else if (c == 'y') { 
     // 黄灯亮
        led0 = 1;
        led1 = 0;
        led2 = 1;
    } else { 
   
        led0 = 1;
        led1 = 1;
        led2 = 1;
    }
}

//液晶显示
void showLCD(char *_msg, uint _tm) { 
   
    uchar tm[16] = { 
   0};
    uint min = _tm / 60;
    uint sec = _tm % 60;

    write_com(0x80);
    write_str(_msg);

    write_com(0x80 + 0x40);
    sprintf(tm, "time %02d:%02d", min, sec);
    write_str(tm);
}

//处理红外漫反射传感器信号
void processPIR() { 
   
    // 人在座位上
    if (pir == 0) { 
   
        // led显示working和倒计时
        if (work_time > 0) { 
   
            showLCD("working ... ", work_time);
            // 绿灯亮
            lightLED('g');
            work_time--;
        } else { 
   
            work_time = 0;
            showLCD("go go go !!! ", work_time);
            // 红灯亮
            lightLED('r');
            warn();
        }
    } else if (pir == 1) { 
   
        // led显示leaving和25:00
        work_time = WORK_MAX_TIME;
        showLCD("leaving ... ", work_time);
        // 黄灯亮
        lightLED('y');
    }
}

void main() { 
   
    EA = 1;   //全局中断开关
    IT0 = 1;  //跳变沿触发方式
    EX0 = 1;  //开启外部中断0

    led0 = 0;
    led1 = 0;
    led2 = 0;

    init_1602();
    delay1ms(1000);

    while (1) { 
   
        processPIR();
        delay1ms(1000);
    }
}

//外部中断0函数
void int0(void) interrupt 0 { 
   
    EX0 = 0;  //关外部中断0

    // 重置命令
    if (reset == 0) { 
   
        delay1ms(5);
        if (reset == 0) { 
   
            while (!reset)
                ;
            key();
            // 复位重新计时
            work_time = WORK_MAX_TIME;
        }
    }

    EX0 = 1;  //开启外部中断0
}

LCD1602部分
lcd1602.h

#ifndef _LCD1602_H_
#define _LCD1602_H_

#include <reg52.h>

typedef unsigned char uchar;
typedef unsigned int uint;


//延时程序
void delay1ms(uint z);

//写命令操作
void write_com(uchar com);

//写数据操作
void write_data(uchar date);

//写字符串
void write_str(uchar *str);

//液晶初始化
void init_1602();

#endif //_LCD1602_H_

lcd1602.c

#include "lcd1602.h"

sbit lcden = P3 ^ 7;  //液晶使能端
sbit lcdrs = P3 ^ 4;  //液晶数据命令选择端
sbit lcdrw = P3 ^ 6;  //读写选择端


//延时程序
void delay1ms(uint z) { 
   
	uint x, y;
	for (x = z; x > 0; x--)
		for (y = 114; y > 0; y--)
			;
}

//写命令操作
void write_com(uchar com) { 
   
	lcdrs = 0;
	P0 = com;
	delay1ms(5);
	lcden = 1;
	delay1ms(5);
	lcden = 0;
}

//写数据操作
void write_data(uchar date) { 
   
	lcdrs = 1;
	P0 = date;
	delay1ms(5);
	lcden = 1;
	delay1ms(5);
	lcden = 0;
}

//写字符串
void write_str(uchar *str) { 
   
	while (*str != '\0')  //字符串未结束
	{ 
   
		write_data(*str++);
		delay1ms(1);
	}
}

//液晶初始化
void init_1602() { 
   
	uchar table[16] = { 
   0};
	uchar table1[16] = { 
   0};
	lcdrw = 0;
	lcden = 0;
	write_com(0x38);  //设置16x2显示,5x7点阵,八位数据接口
	write_com(0x0c);  //设置开显示,不显示光标
	write_com(0x06);  //写一个字符后地址指针加1
	write_com(0x01);  //显示清0,数据指针清0
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187199.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Intellij IDEA神器居然还有这些小技巧

    概述 真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜。出于对 的喜爱,我决定写一个与其相关的专栏或者系列,把一些好用的 技巧分享给大家。本文是这个系列的第一篇,主要介绍一些你可能

    2022年3月13日
  • 利用nginx搭建RTMP视频点播、直播、HLS服务器

    利用nginx搭建RTMP视频点播、直播、HLS服务器开发环境Ubuntu14.04servernginx-1.8.1nginx-rtmp-modulenginx的服务器的搭建安装nginx的依赖库sudoapt-getupdatesudoapt-getinstalllibpcre3libpcre3-devsudoapt-getinstallopenssllibssl-dev配置并编译nginx使用nginx的默

    2022年6月13日
  • java的三种代码注释方式「建议收藏」

    java的三种代码注释方式「建议收藏」1.注释的作用注释是对程序语言的说明,有助于开发者之间的交流,方便理解和维护程序。注释不是编程语句,不会被编译器执行。一些代码量少较少的程序,我们加不加注释对我们的理解和修改代码没有太大影响;如果是淘宝;抖音等那种中大型程序,没有了代码注释,对于日后程序运行维护将是很大困难。我们可以在平时编码过程中养成规范代码注释习惯,也是我们成为优秀程序员的原因2.java中的注释分类Java中的注释分为以下三种:单行注释;多行注释;文档注释1.单行注释java代码中使用双斜杠单行注释//,一般单行注释,注释少

    2022年7月7日
  • Struts2拦截器实现异常处理[通俗易懂]

    Struts2拦截器实现异常处理[通俗易懂]Struts2拦截器实现异常处理机制在j2ee项目中,系统内部难免会出现一些异常,如果把异常放任不管直接打印到浏览器可能会让用户感觉莫名其妙,也有可能让某些用户找到搞定系统的方法。所以不要在页面上输出错误信息,使用log日志的方式处理异常并记录异常。就拿struts2+hibernate+spring项目说明:通常一个页面请求到后台以后,首先是到action(也就是所谓mvc的c

    2022年9月1日
  • spring security——基本介绍(一)「建议收藏」

    spring security——基本介绍(一)「建议收藏」一、springsecurity简介springsecurity的核心功能主要包括:认证(你是谁) 授权(你能干什么) 攻击防护(防止伪造身份)其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是BasicAuthenticationFilter用来认证用户的身份,一个在springsecurity中一种过滤器处理一种认证方式…

    2022年6月16日
  • 最长递增子序列(LIS)[通俗易懂]

    最长递增子序列(LIS)[通俗易懂]①dp[i]表示以i为结尾的最长子序列长度②dp[i]表示长度为i的最长递增子序列末尾的数

    2022年4月27日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号