0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于51单片机的智能台灯设计

精通单片机与嵌入式 来源:精通单片机与嵌入式 2023-08-29 09:32 次阅读

一、设计目的

使用单片机设计智能台灯对于提高学生的单片机应用能力具有较强的意义。通过该设计,可以巩固所学的单片机理论知识,培养学生硬件和软件的设计能力,从而促进学生所掌握的理论知识向实践应用的改变。

二、设计要求

(1)熟悉51单片机集成开发环境,运用C语言编写工程文件; (2)熟练应用所选用单片机的内部结构、资源,以及软硬件调试设备的基本方法; (3)自行构建基于单片机的最小系统,完成相关硬件电路的设计实现; (4)掌握智能台灯的原理和实现方法。

三、设计内容

(1) 可以通过按键切换控制模式,有自动模式和手动模式可选;

(2) 自动模式下,可根据空间环境的光线强度大小,调节台灯的亮度。并且

1分钟检测不到有人,直接熄灭台灯,达到节能的效果;

(3) 手动模式下,可通过按键增加或减少亮度;

开题报告

b876f676-45fb-11ee-a2ef-92fbcf53809c.png

方案设计

整个系统以STC89C52单片机为核心器件,配合电阻电容晶振等器件,构成单片机的最小系统。其它个模块围绕着单片机最小系统展开。其中包括,照明设备采用USB小灯进行模拟,使得设计在外形上更加美观,在USB小灯内部,是6颗白色的LED灯;光照强度采集模块,是使用光敏电阻+ADC0832方案;人体感应采用红外热释传感器,该传感器灵敏度高,操作控制简单;指示灯模块由一颗绿色的小灯构成,指示灯亮时是自动模式,熄灭时是手动模式;按键模块由3个按键组成,包括模式切换按键、亮度减少按键和亮度增加按键;

b8bfc66c-45fb-11ee-a2ef-92fbcf53809c.png

设计功能

1、上电之后,绿色的 LED 灯点亮,代表当前是自动控制模式。

2、通过按键 1,可以在手动模式(绿灯灭)和自动模式(绿灯亮)之间来回切换。

3、在手动模式下,可以通过按键 2 降低亮度,按键 3 增加亮度。

4、在自动模式下,首先要检测到有人,才进行亮度的自动控制,否则台灯熄灭。可以挡住光敏电阻的光线,或用手电筒来照射光敏电阻,模拟光照的变化,从而就可以 看到台灯的亮度会随着环境中的光照强度的改变而改变,效果是光照越弱,台灯越亮。如果人体传感器 1 分钟检测不到有人,台灯就会自动熄灭。

5、无论是自动模式还是手动模式,都是把亮度分为 10 个等级的。

6、注意,人体感应检测功能只在自动模式下有效。

原理图设计


b9f9d0f4-45fb-11ee-a2ef-92fbcf53809c.png

PCB设计


ba5391d4-45fb-11ee-a2ef-92fbcf53809c.pngb820cfda-45fb-11ee-a2ef-92fbcf53809c.gif

源代码


#include 
#include 


#define uchar unsigned char    // 以后unsigned char就可以用uchar代替
#define uint  unsigned int    // 以后unsigned int 就可以用uint 代替




sbit LED     = P1^0;          // 模式指示灯,亮是自动模式,灭是手动模式
sbit Lamp    = P1^4;           // 台灯控制引脚
sbit Key1    = P1^1;          // 按键1,模式切换按键
sbit Key2    = P1^2;           // 按键2,亮度减少按键      
sbit Key3    = P1^3;          // 按键3,亮度增加按键
sbit ADC_CS  = P2^3;           // ADC0832的CS引脚
sbit ADC_CLK = P2^0;           // ADC0832的CLK引脚
sbit ADC_DAT = P2^1;           // ADC0832的DI/DO引脚
sbit Module  = P2^2;          // 人体红外检测模块




uchar gCount=0;                // 全局计数变量
uchar gIndex;                  // 亮度变量,0是最暗,9是最亮,一共10档
uint  gTime=0;                // 计时变量,用于计时多久没检测到有人






/*********************************************************/
// 毫秒级的延时函数,time是要延时的毫秒数
/*********************************************************/
void DelayMs(uint time)
{
  uint i,j;
  for(i=0;i>= 1;
    if(ADC_DAT)
      dat2=dat2|0x80;
    else
      dat2=dat2|0x00;
    WavePlus();
  }


  _nop_();            // 结束此次传输
  ADC_DAT = 1;
  ADC_CLK = 1;
  ADC_CS  = 1;   


  if(dat1==dat2)      // 返回采集结果
    return dat1;
  else
    return 0;
} 






/*********************************************************/
// 定时器初始化
/*********************************************************/
void TimerInit()
{
  TMOD = 0x01;        // 使用定时器0,工作方式1   
  TH0  = 252;          // 给定时器0的TH0装初值
  TL0  = 24;          // 给定时器0的TL0装初值  
  ET0  = 1;            // 定时器0中断使能
  EA   = 1;            // 打开总中断
  TR0   = 1;            // 启动定时器0
}






/*********************************************************/
// 手动控制
/*********************************************************/
void ManualControl()
{
  // 亮度减少
  if(Key2==0)          // 如果按键2被按下去
  {
    if(gIndex>0)      // 只要当前亮度不为最低才能减少亮度
    {
      gIndex--;        // 亮度降低一档
      DelayMs(300);    // 延时0.3秒
    }
  }


  // 亮度增加
  if(Key3==0)          // 如果按键3被按下去
  {
    if(gIndex<9)      // 只要当前亮度不为最高才能增加亮度
    {
      gIndex++;        // 亮度增加一档
      DelayMs(300);    // 延时0.3秒
    }
  }
}






/*********************************************************/
// 自动控制
/*********************************************************/
void AutoControl(uchar num)
{
  if(num<59)                            // 最亮
    gIndex=9;
  else if((num>65)&&(num<81))            // 第二亮
    gIndex=8;
  else if((num>87)&&(num<103))          // 第三亮
    gIndex=7;
  else if((num>109)&&(num<125))
    gIndex=6;
  else if((num>131)&&(num<147))
    gIndex=5;
  else if((num>153)&&(num<169))
    gIndex=4;
  else if((num>175)&&(num<191))
    gIndex=3;
  else if((num>197)&&(num<213))
    gIndex=2;
  else if((num>219)&&(num<235))
    gIndex=1;
  else if(num>241)                     // 最暗
    gIndex=0;
}






/*********************************************************/
// 主函数
/*********************************************************/
void main()
{
  uchar ret;


  TimerInit();           // 定时器初始化


  LED=0;                // 指示灯点亮(自动模式指示灯)
  ret=Get_ADC0832();    // 获取AD采集结果(环境光照强度)
  AutoControl(ret);      // 上电先进行一次自动亮度控制  
  AutoControl(ret+7);


  while(1)
  {
    /* 模式切换控制 */
    if(Key1==0)          // 如果按键1被按下去
    {
      LED=~LED;          // 切换LED灯状态
      DelayMs(10);      // 延时消除按键按下的抖动
      while(!Key1);      // 等待按键释放
      DelayMs(10);      // 延时消除按键松开的抖动
    }


    /* 亮度控制 */
    if(LED==1)              // 如果LED是灭的
    {
      ManualControl();      // 则进行手动控制
    }
    else                    // 如果LED是亮的
    {
      if(gTime<60000)
      {
        ret=Get_ADC0832();    // 获取AD采集结果(环境光照强度)
        AutoControl(ret);      // 进行自动控制  
        DelayMs(200);
      }
    }


    /*检测是否有人*/
    if(Module==1)
    {
      gTime=0;                    // 检测到有人,则把60秒计时清零
    }
    if(gTime>60000)                // 如果gTime的值超过了60000
    {
      gTime=60000;                // 则把gTime的值重新赋值为60000,避免过大溢出
      gIndex=0;                    // 如果1分钟检测不到有人,则把台灯熄灭
    }
  }
}




/*********************************************************/
// 定时器0服务程序,1毫秒
/*********************************************************/
void Timer0(void) interrupt 1
{
  TH0  = 252;            // 给定时器0的TH0装初值
  TL0  = 24;            // 给定时器0的TL0装初值  


  gTime++;              // 每1毫秒,gTime变量加1
  gCount++;              // 每1毫秒,gCount变量加1


  if(gCount==10)        // 如果gCount加到10了
  {
    gCount=0;            // 则将gCount清零,进入新一轮的计数
    if(gIndex!=0)        // 如果说台灯不是最暗的(熄灭)
    {
      Lamp=0;            // 则把台灯点亮
    }
  }
  if(gCount==gIndex)    // 如果gCount计数到和gIndex一样了
  {
    if(gIndex!=9)        // 如果说台灯不是最亮的
    {
      Lamp=1;            // 则把台灯熄灭
    }
  }
}

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620836
  • 51单片机
    +关注

    关注

    269

    文章

    5649

    浏览量

    120700
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128691
  • 智能台灯
    +关注

    关注

    8

    文章

    78

    浏览量

    20818

原文标题:【毕业设计】基于51单片机的智能台灯设计(任务书、原理图、PCB、源代码、参考论wen)

文章出处:【微信号:精通单片机与嵌入式,微信公众号:精通单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于51单片机智能台灯演示

    单片机台灯51单片机智能台灯
    jf_06209345
    发布于 :2022年07月23日 00:26:54

    哪位大神会仿真基于51单片机智能台灯啊?????

    ????????????????????????????????????????
    发表于 03-22 22:20

    基于51单片机智能台灯

    请问下有人用过热释电红外传感芯片biss0001吗?我这样连接一个光敏电阻有没有问题?
    发表于 03-18 16:35

    一种基于51单片机智能台灯设计

    系统由STC89C52单片机+L数码管+光敏电阻+人体感应模块+红外接近传感器模块构成。具体功能:(1)亮度不够且有人靠近时台灯自动亮;(2)靠的太近会提醒坐姿不正(蜂鸣器);(3)附近无人时台灯
    发表于 07-01 06:05

    如何实现基于51单片机智能台灯的设计?

    如何实现基于51单片机智能台灯的设计?
    发表于 10-21 08:19

    如何去实现一种基于51单片机智能台灯设计

    一.硬件方案本文介绍了一种基于PWM调光的智能台灯设计。把单片机技术和PWM调光技术结合起来实现台灯光强的调节。即在不改变PWM方波周期的前提下,利用
    发表于 11-18 08:24

    基于51单片机的蓝牙智能台灯设计

    基于51单片机的蓝牙智能台灯目录 基于51单片机的蓝牙智能
    发表于 12-01 07:36

    基于51单片机智能台灯

    电子发烧友网站提供《基于51单片机智能台灯.zip》资料免费下载
    发表于 05-26 08:00 183次下载

    706【毕设课设】基于51单片机单片机智能台灯设计

    【资源下载】下载地址如下:https://docs.qq.com/doc/DTlRSd01BZXNpRUxl51单片机智能台灯设计-锂电池-LED-key-timer本设计由STC89C52
    发表于 11-04 19:05 13次下载
    706【毕设课设】基于<b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>单片机智能</b><b class='flag-5'>台灯</b>设计

    基于51单片机智能台灯设计

    一.硬件方案本文介绍了一种基于PWM调光的智能台灯设计。把单片机技术和PWM调光技术结合起来实现台灯光强的调节。即在不改变PWM方波周期的前提下,利用
    发表于 11-12 10:51 45次下载
    基于<b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>智能</b><b class='flag-5'>台灯</b>设计

    50-基于51单片机智能台灯设计

    系统由STC89C52单片机+L数码管+光敏电阻+人体感应模块+红外接近传感器模块构成。具体功能:(1)亮度不够且有人靠近时台灯自动亮;(2)靠的太近会提醒坐姿不正(蜂鸣器);(3)附近无人时台灯
    发表于 11-13 10:36 19次下载
    50-基于<b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>智能</b><b class='flag-5'>台灯</b>设计

    基于AT89C51单片机智能台灯设计

    系统内使用AT89C51单片机作为主控,系统内分为普通模式和调节模式,上电之后就是普通模式,小灯会亮但是不能进行亮度调节,按下设置按键后亮度可调节的小灯亮,通过加减按键就能直接控制小灯的亮度。
    发表于 09-27 15:55 2067次阅读

    基于51单片机智能台灯带坐姿矫正覆铜板设计技术手册

    基于51单片机智能台灯带坐姿矫正覆铜板设计技术手册
    发表于 09-18 10:52 1次下载

    基于51单片机智能台灯洞洞板设计技术手册

    基于51单片机智能台灯洞洞板设计技术手册
    发表于 09-18 11:06 20次下载

    基于51单片机智能台灯覆铜板设计技术手册

    基于51单片机智能台灯覆铜板设计技术手册
    发表于 09-18 10:49 2次下载