健康节能台灯的设计电子实践

news2024/11/16 18:09:46
1.1 功能描述
根据主要功能要求,该设计利用 51 单片机实现了电子时钟、温度的显示以
及整点报时等功能。具体可分为一下几种:
1) 显示当前的日期及时间,24 时制的时、分、秒;
2) 可调节时间;
3) 整点报时并响铃。
4) 能检测桌前是否有人并自动开启/关闭;
5) 可自动\手动调节灯光亮度;

1.2 系统组成及工作过程
六大模块以 AT89C52单片机为控制核心,实现了该智能台灯的各项要求,外接一个5V 的直流电源,为整个系统供电。

2 硬件设计
2.1 单片机控制模块设计
硬件电路如图 2            



 


图 2 单片机控制模块电路(最小系统)

这里我们选用 12M 的晶振,晶振系统由两个 30pF 的电容 CAP 和晶振组成,
接到单片机的 18、19 两管脚。晶振给单片机提供硬件本身的时钟振荡。一个 10μF
的电解电容和一个 1k 的电阻组成复位电路,接至单片机的第 9 管脚。P0 口加上
排阻,即其就是 P0 口的上拉电阻,这就是给 P0 加驱动电路,电源通过排阻向
P0 口供电,使其能够驱动与 P0 口相连的元件。
2.2 按键模块电路设计

按键模块电路
三个按键分别用来选取需要调节的数码管、增加数值及减少数值,即设置日期时间当前。
两个开关控制灯电路的开通或是关闭状态,上方以开关代替模拟FC-51模块的状态(proteus中无相似元件),当模块检测到有人时输出低电平;下方开关为手动开关(开关灯)。
按键及开关均采用低电平有效连接方式。

2.3 台灯模块电路设计



台灯模块电路如图 4,


 

3.1 主程序的设计

主程序流程图

主程序如图,一给单片机上电,单片机就初始化。然后扫描各个按键、开关的状态,检测开关是否打开、屋内是否有人,若同时满足则给台灯电路上电。同时向数码管输出时间初值,随后时间计时子函数运行,时钟正常工作。然后检测时间调整按键是否按下,判断修改哪个数据,扫描调整按键,增加或减少数值。单片机接收并处理来自 DS18B20 传过来的数据在数码管上显示当时的室内温度,最后进入循环。

3.2 按键模块程序设计
按键用来调整时间和日期,各键功能在介绍硬件部分已描述。
因为有年月日,时分秒几个参数要调,所以设置这几个参数的计数。当按模式
键时,单片机进行相应的操作。

3.3 台灯模块程序设计
该模块只需给 P3.6 到送高电平即可,再通过手动旋钮\环境光强调整灯光亮度。

3.4 时钟模块程序设计
分别出写时间、日期的函数,再写出时间、日期的显示函数。设计时、分、
秒,年、月、日几个变量分别表示时分秒,年月日。

3.5 报时模块程序设计
对蜂鸣器,在其所接的 I/O 口P3.3写 1 即可实现它的蜂鸣,当分钟数增加到60时响铃,写程序时给它加了个1s延时,实现整点报时。


 

3.6 温度模块程序设计
设计初始化函数,设计读 DS18B20 数据和对 DS118B20 写数据的函数,再写出
从 DS18B20 读温度并转换为十进制的函数,最后逐位显示温度的函数。

3.7 红外传感器模块程序设计
编写一个读端口P3.4的函数,即FC-51模块OUT端口状态,检测有人与否,若有人,传感器发给单片机一个低电平,单片机同时判断灯开关是否打开,使得单片机P3.6口为高电平,控制台灯电路上电;若人离开桌前,则P3.4为高电平,台灯断电。这就实现了检测屋内有人与否并自动开启或关闭的智能节能的台灯。

4 总结

该设计实现了日期、时间及温度检测和显示电路,具备整点报时功能,以提醒用户久坐时长,避免长期久坐导致的一系列健康问题。同时自动检测桌前是否有人并自动开启/关闭功能;台灯具有光亮度自动\手动调节功能;但在细节
方面还有不足之处。灯光亮度达不到很亮的程度,只能在一个很小的范围变化,
以致于光亮度不够。关闭的功能。该传感器检测距离通过调节FC-1模块上变阻器可在1m-20m间调节。蜂鸣器在仿真过程中不响,多次排查后仍没有找到原因,在设计答辩完成后,我们会继续寻找问题的源头,争取解决。在实际的实物制作过程中,因材料的限制,触发台灯所用的三极管使用了双向可控硅代替,这带来了一系列问题:1可控硅的参数不明,导致了变阻器在调节过程中无法精确到具体值,只能不断尝试2可控硅的负载能力小,使得灯在长时间运行后出现过载现象,自动熄灭。
              原本的设计是只有台灯电路,毕竟节能台灯的节能应考虑设计简化,但为提升本次设计作业的复杂性,加入了更多其他模块,虽有些本末倒置的意味,但锻炼了我们的动手能力、单片机编程能力,更提升了我们对MC-51系列单片机、数码管及DS18B20 的了解与认识,为以后的毕业设计及往后的工作打下经验基础。

以上的程序见附录


 

实物图

仿真及实物演示视频见设计文件

系统连接图


 

附录


单片机源程序如下:

  1. #define uchar unsigned char
  2. #define uint  unsigned int
  3. #define DQ P3_7
  4. #include<AT89X51.H>
  5. uint sec;
  6. uint min=05;
  7. uint hour=13;
  8. uint day=19;
  9. uint month=7;
  10. uint yearl=17;
  11. uint yearh=20;
  12. uint tcnt;
  13. uint cursor=0;
  14. uchar a=0xff;
  15. uchar code Seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  16. void delay(uint t)
  17. {
  18.     uint i;
  19.     while(t--)
  20.     {for (i=0;i<125;i++);}
  21. }
  22. void Tdelay(unsigned int i)
  23. {
  24. while(i--);
  25. }
  26. void Kdelay()
  27. {
  28.     uchar i,j;
  29.     for(i=100;i>0;i--)
  30.     for(j=248;j>0;j--);
  31. }
  32. Init_DS18B20(void)
  33. {
  34. unsigned char x=0;
  35. DQ = 1;   
  36. Tdelay(8);
  37. DQ = 0;   
  38. Tdelay(80);
  39. DQ = 1;   
  40. Tdelay(14);
  41. Tdelay(20);
  42. }
  43. //读一个字节
  44. ReadOneChar(void)
  45. {
  46. unsigned char i=0;
  47. unsigned char dat = 0;
  48. for (i=8;i>0;i--)
  49. {
  50.   DQ = 0;
  51.   dat>>=1;
  52.   DQ = 1;
  53.   if(DQ)
  54.    dat|=0x80;
  55.   Tdelay(4);
  56. }
  57. return(dat);
  58. }
  59. //写一个字节
  60. WriteOneChar(unsigned char dat)
  61. {
  62. unsigned char i=0;
  63. for (i=8; i>0; i--)
  64. {
  65.   DQ = 0;
  66.   DQ = dat&0x01;
  67.   Tdelay(5);
  68.   DQ = 1;
  69.   dat>>=1;
  70. }
  71. }
  72. //读取温度
  73. ReadTemperature(void)
  74. {
  75. unsigned char a=0;
  76. unsigned char b=0;
  77. unsigned int t=0;
  78. float tt=0;
  79. Init_DS18B20();
  80. WriteOneChar(0xCC);
  81. WriteOneChar(0x44);
  82. Init_DS18B20();
  83. WriteOneChar(0xCC);
  84. WriteOneChar(0xBE);
  85. a=ReadOneChar();
  86. b=ReadOneChar();
  87. t=b;
  88. t<<=8;
  89. t=t|a;
  90. tt=t*0.0625;      
  91. t= tt*10+0.5;     
  92. return(t);
  93. }
  94. void display(uchar L1,uchar L2,uchar L3,uchar L4,uchar L5,uchar L6,uchar L7,uchar L8,uchar L9,uchar L10,uchar L11,uchar L12,uchar L13,uchar L14,uchar L15,uchar L16)
  95. {
  96.     P2=0x7F;P0=L1;delay(1);  //yearh
  97.     P2=0xBF;P0=L2;delay(1);  //yearh
  98.     if(cursor==6){P2=0xDF|a;P0=L3;delay(1);}else{P2=0xDF;P0=L3;delay(1);}   //yearl
  99.     if(cursor==6){P2=0xEF|a;P0=L4;delay(1);}else{P2=0xEF;P0=L4;delay(1);}   //yearl
  100.     if(cursor==5){P2=0xF7|a;P0=L5;delay(1);}else{P2=0xF7;P0=L5;delay(1);}   //month
  101.     if(cursor==5){P2=0xFB|a;P0=L6;delay(1);}else{P2=0xFB;P0=L6;delay(1);}   //month
  102.     if(cursor==4){P2=0xFD|a;P0=L7;delay(1);}else{P2=0xFD;P0=L7;delay(1);}   //day
  103.     if(cursor==4){P2=0xFE|a;P0=L8;delay(1);}else{P2=0xFE;P0=L8;delay(1);}   //day
  104.     P2=0xFF;
  105.     if(cursor==3){P1=0x7F|a;P0=L9;delay(1);}else{P1=0x7F;P0=L9;delay(1);}   //hour
  106.     if(cursor==3){P1=0xBF|a;P0=L10;delay(1);}else{P1=0xBF;P0=L10;delay(1);}  //hour
  107.     if(cursor==2){P1=0xDF|a;P0=L11;delay(1);}else{P1=0xDF;P0=L11;delay(1);} //min
  108.     if(cursor==2){P1=0xEF|a;P0=L12;delay(1);}else{P1=0xEF;P0=L12;delay(1);} //min
  109.     if(cursor==1){P1=0xF7|a;P0=L13;delay(1);}else{P1=0xF7;P0=L13;delay(1);} //sec
  110.     if(cursor==1){P1=0xFB|a;P0=L14;delay(1);}else{P1=0xFB;P0=L14;delay(1);} //sec
  111.     P1=0xFD;P0=L15;delay(1); //temp
  112.     P1=0xFE;P0=L16;delay(1); //temp
  113.     P1=0xFF;
  114. }
  115. main()
  116. {  
  117.     uint i;   
  118.     TMOD=0x02;            //设置模式为定时器T0的模式2 (8位自动重装计数初值的计数值)      
  119.     TH0=0x06;             //设置计数器初值,靠TH0存储重装的计数值X0=256-250=6
  120.     TL0=0x06;
  121.     TR0=1;                //启动T0
  122.     ET0=1;                //开启定时器T0中断允许
  123.     EA=1;                 //开启中断总控制
  124.     while(1)
  125.     {
  126.                             if(P3_4==0)
  127.                                           {if(P3_5==0)
  128.                                                         P3_6=1;}
  129.                             else P3_6=0;
  130.         if(P3_0==0)
  131.         {
  132.             Kdelay();
  133.             if(P3_0==0)
  134.             {
  135.                 cursor++;
  136.                 if(cursor>=7){cursor=0;}
  137.             }
  138.         }
  139.         if(P3_1==0)
  140.         {
  141.             Kdelay();
  142.             if(P3_1==0)
  143.             {
  144.                 if(cursor==1){sec++;if(sec==60)sec=0;}
  145.                 if(cursor==2){min++;if(min==60)min=0;}
  146.                 if(cursor==3){hour++;if(hour==24)hour=0;}
  147.                 if(cursor==4){day++;if(day==31)day=0;}
  148.                 if(cursor==5){month++;if(month==12)month=0;}
  149.                 if(cursor==6){yearl++;if(yearl==100)yearl=0;}
  150.                 if(cursor==7){yearh++;if(yearh==30)yearh=20;}
  151.             }
  152.         }
  153.         if(P3_2==0)
  154.         {
  155.             Kdelay();
  156.             if(P3_2==0)
  157.             {
  158.                 if(cursor==1){sec--;}
  159.                 if(cursor==2){min--;}
  160.                 if(cursor==3){hour--;}
  161.                 if(cursor==4){day--;}
  162.                 if(cursor==5){month--;}
  163.                 if(cursor==6){yearl--;}
  164.                 if(cursor==7){yearh--;}
  165.             }
  166.         }
  167.         i=ReadTemperature();
  168.         display(Seg[yearh/10],Seg[yearh%10],Seg[yearl/10],Seg[yearl%10],Seg[month/10],Seg[month%10],Seg[day/10],Seg[day%10],Seg[hour/10],Seg[hour%10],Seg[min/10],Seg[min%10],Seg[sec/10],Seg[sec%10],Seg[i/100],Seg[i/10%10]);   
  169.     }
  170. }
  171. void t0(void)interrupt 1 using 0   //t0的中断程序
  172. {
  173.     tcnt++;
  174.     if(tcnt==4000)//定时器的定时计数,4000次250us为1秒
  175.     {
  176.         tcnt=0;
  177.                             P3_3=0;
  178.         a=~a;
  179.         sec++;
  180.         if(sec==60)
  181.         {   
  182.             sec=0;
  183.             min++;
  184.             if(min==60)
  185.             {
  186.                 min=0;
  187.                                                         P3_3=1;
  188.                 hour++;
  189.                 if(hour==24)
  190.                 {
  191.                     hour=0;
  192.                     day++;
  193.                     if(month==2&&((yearl==0&&yearh%4==0)||(yearl!=0&&yearl%4==0))&&day==30)day=1;
  194. ……………………

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1812627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud微服务架构(eureka、nacos、ribbon、feign、gateway等组件的详细介绍和使用)

一、微服务演变 1、单体架构&#xff08;Monolithic Architecture&#xff09; 是一种传统的软件架构模式&#xff0c;应用程序的所有功能和组件都集中在一个单一的应用中。 在单体架构中&#xff0c;应用程序通常由一个大型的、单一的代码库组成&#xff0c;其中包含了所有…

C/C++ 进阶(6)红黑树

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 目录 一、概念 性质 二、操作 插入 情况一&#xff1a;cur为红、p为红、g为黑&#xff0c;如果u存在且为红 步骤&#xff1a; 情况二&#xff1a;cur为红、p为红、g为黑&#xff0c;如果u不存在或…

京东网页html+css简单制作1(附带源码和素材)

一.代码效果展示 代码html骨架结构分为头部top,颈部banner&#xff0c;中间部分main,腿部fortet-image,尾部fortter&#xff0c;五部分组成&#xff0c;从上至下&#xff0c;从左到右结构。&#xff08;总体因为没设计版心&#xff0c;所以位置比较乱&#xff09; 其中中部mai…

迷宫最短路径求解--c++

【代码】 #include<iostream> #include<queue> #include<stack> using namespace std; #define ROW 8 #define COL 8 //测试迷宫数据 int maze[ROW][COL] {{0,0,0,1,0,0,0,0},{0,1,0,1,0,1,0,1},{0,1,0,0,0,1,0,1},{0,1,0,1,1,1,0,1},{0,1,0,1,1,0,0,0},{0…

第一百零四节 Java面向对象设计 - Java内部类成员

Java面向对象设计 - Java内部类成员 内部类可以访问其所有实例成员&#xff0c;实例字段和其封闭类的实例方法。 class Outer {private int value 2014;public class Inner {public void printValue() {System.out.println("Inner: Value " value);}} // Inner …

这三款思维导图工具,真的很好用

XMIND XMIND是优秀的国产思维导图和头脑风暴软件&#xff0c;非常符合国人的使用要求&#xff0c;旨在帮助用户理清思路、捕捉创意&#xff0c;并提高工作和生活效率。支持Linux、IOS、Android、MAC平台。 提供了非常多精美的结构图&#xff0c;例如鱼骨图、逻辑图、括号图、树…

Django DeleteView视图

Django 的 DeleteView 是一个基于类的视图&#xff0c;用于处理对象的删除操作。 1&#xff0c;添加视图函数 Test/app3/views.py from django.shortcuts import render# Create your views here. from .models import Bookfrom django.views.generic import ListView class B…

点云分割报告整理(未完成版-每天写一点)

体积占用网格表示对点进行体素化&#xff0c;然后使用3d卷积神经网络来学习体素级语义。由于点云的稀疏性&#xff0c;体素化效率低&#xff0c;为避免较高的计算成本而忽略了细节。此外&#xff0c;由于同一体素内的所有点都被赋予了相同的语义标签&#xff0c;因此精度受到限…

详解MySQL中的PERCENT_RANK函数

目录 1. 引入1. 基本使用2&#xff1a;分组使用3&#xff1a;处理重复值4. 使用优势4.1 手动计算百分等级4.2 使用 PERCENT_RANK 的优势4.3 使用 PERCENT_RANK 5. 总结 在 MySQL 中&#xff0c;PERCENT_RANK 函数用于计算一个值在其分组中的百分等级。 它的返回值范围是从 0 …

广州商学院数字经济产业学院领导莅临泰迪智能科技参观交流

6月6日&#xff0c;广州商学院数字经济产业学院主任潘鹏、专业负责人欧阳峰、专业老师刘宇宏莅临广东泰迪智能科技股份有限公司产教融合实训基地参观交流。泰迪智能科技董事长张良均、中职事业部总经理李振林、校企合作经理吴桂锋进行热情接待&#xff0c;双方就专业建设、人才…

超详解——深入详解Python基础语法——基础篇

目录 1 .语句和变量 变量赋值示例&#xff1a; 打印变量的值&#xff1a; 2. 语句折行 反斜杠折行示例&#xff1a; 使用括号自动折行&#xff1a; 3. 缩进规范 缩进示例&#xff1a; 4. 多重赋值&#xff08;链式赋值&#xff09; 多重赋值的应用&#xff1a; 5 .多…

20个国家科学数据中心(中)

7、国家极地科学数据中心平台 网址&#xff1a;http://www.chinare.org.cn 简介&#xff1a;国家极地科学数据中心&#xff08;www.chinare.org.cn&#xff0c;以下称"本网站或NADC网站&#xff09;的前身是中华人民共和国科技部1999年资助下建立的中国极地科学数据库系…

项目部署(前后端)

一&#xff1a;多环境概念&#xff1a; 借鉴来源&#xff1a;多环境设计_程序员鱼皮-多环境设计-CSDN博客 为什么需要多环境&#xff1a; 第一个例子&#xff1a;我们可以设想&#xff0c;我们肯定玩过王者荣耀&#xff0c;且王者荣耀也一直在不断更新&#xff0c;如果按我们…

STM32F103C8T6移植U8g2图形库及基于I2C协议的OLED显示(HAL库方式)【U8g2】【STM32开发板】【STM32CubeMX】

STM32F103C8T6移植U8g2图形库及基于I2C协议的OLED显示&#xff08;HAL库方式&#xff09;【U8g2】【STM32开发板】【STM32CubeMX】 实验说明 利用STM32F103的GPIO管脚、VCC和GND连接OLED屏的I2C接口&#xff0c;采用CubeMX设计一个HAL库程序框架&#xff0c;然后下载U8g2源码…

算法:94. 二叉树的中序遍历--扩展前中后层序遍历

中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 中遍历结果为&#xff1a;H D I B E J A F K C G 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#x…

图片二维码在线制作的教程,轻松实现图片转二维码

现在很多的内容都会放入二维码中来提供展示&#xff0c;这种方法可以有效的将大量的内容通过扫码这种简单的方式来获取。比如将图片转二维码后&#xff0c;就可以用手机扫码查看图片&#xff0c;无需通过软件传输后下载才可以查看&#xff0c;并且这种方式还可以提升图片的安全…

后端开发面经系列 -- 华为OD -- C++面经(全)

华为OD – C面经&#xff08;全&#xff09; 公众号&#xff1a;阿Q技术站 文章目录 华为OD -- C面经&#xff08;全&#xff09;一面1、C结构体和类的区别&#xff0c;类默认的访问权限&#xff0c;结构体可以定义成员函数吗&#xff1f;2、多态的意义&#xff1f;多态的意义…

数据结构刷题-链表

数据结构刷题-链表 总结&#xff1a;1 链表的解法总结&#xff1a; 1 链表的知识点&#xff1a;1 LC链表合集&#xff1a;1.1 lc206反转链表&#xff1a; 双指针&#xff1a;lc25: K个一组翻转链表&#xff1a;栈1.2 lc203移除链表元素&#xff1a;1.3 设计链表&#xff1a;1.4…

基于C#开发web网页管理系统模板流程-总集篇

第一篇 基于C#开发web网页管理系统模板流程-登录界面和主界面_c#的网页编程-CSDN博客 第二篇 基于C#开发web网页管理系统模板流程-主界面管理员录入和编辑功能完善_c#网页设计-CSDN博客 第三篇 基于C#开发web网页管理系统模板流程-主界面管理员入库和出库功能完善_c#web程序设计…

【Vue】项目创建目录初始化

文章目录 vue-cli 建项目调整初始化目录结构 vue-cli 建项目 1.安装脚手架 (已安装) npm i vue/cli -g2.创建项目 vue create hm-shopping选项 Vue CLI v5.0.8 ? Please pick a preset:Default ([Vue 3] babel, eslint)Default ([Vue 2] babel, eslint) > Manually sel…