木头12333 发表于 2020-12-29 14:11

基于51单片机多功能智能台灯(带时钟、姿态矫正、显示温度亮度)源程序仿真文件

<div class='showpostmsg'> 本帖最后由 木头12333 于 2020-12-30 12:52 编辑

<p>功能说明:<br />
1、上电之后LED灯点亮,代表当前灯是自动控制模式;<br />
2、通过按键K5可以在自动和手动模式来回切换;<br />
3、在手动模式下,按键K2,K3,K4分别对应一个灯光亮度;(k1按下时不可用)<br />
4、在自动模式下,首先要检测到有人,才进行亮度的自动控制,否则台灯熄灭。可以挡住光敏电阻<br />
的光线,或用手电筒来照射光敏电阻,模拟光照的变化,从而就可以看到台灯的亮度会随着环境中的<br />
光照强度的改变而改变,效果是光照越弱,台灯越亮。如果人体传感器1分钟检测不到有人,台灯就<br />
会自动熄灭。(光敏电阻在USB灯后面);<br />
5、无论是自动模式还是手动模式,都是把亮度分为10个等级的,并在LCD上显示0-9;<br />
6、设置日期时间:按下K1(设置)键,显示年位置会有光标闪烁,表示此时可以调节年份,如需调节年份,<br />
按K3(加),K4(减)即可对年份进行调节。然后按K2(移动)键,显示月份位置会光标闪烁,同样的方法可<br />
以调节月,再按K2键分别可设置日,时,分,秒。<br />
7、靠近超声波时,蜂鸣器报警。</p>

<p>&nbsp;</p>

<p>制作出来的实物图如下:</p>

<p></p>

<p>仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)</p>

<p></p>

<p>PCB文件:</p>

<p></p>

<p>部分源程序:</p>

<pre>
<code>#include &lt;reg52.h&gt;               //调用单片机头文件
#define uchar unsigned char//无符号字符型 宏定义      变量范围0~255
#define uintunsigned int         //无符号整型 宏定义      变量范围0~65535
#include "eeprom52.h"
#include "intrins.h"
#include "ds1302.h"
#include "lcd1602.h"
#include "ultrasonic_wave.h"//超声波头函数

bit flag_200ms ;
bit flag_100ms ;
bit flag_beep1_en;//定时模式开启标志
bit flag_beep2_en;
bit flag_beep3_en;

sbit k1=P1^4;         //时间设置切换
sbit k2=P1^5;         //光标移动
sbit k3=P1^6;         //加
sbit k4=P1^7;         //减
sbit k5=P2^7;         //手动/自动

sbit ADC_CS = P3^5;         //ADC0832引脚定义
sbit ADC_CLK = P3^6;         
sbit ADC_DAT = P3^7;
         
sbit LED = P2^6;         //自动模式指示灯

sbit dq   = P2^1;          //18b20 IO口的定义
         
sbit Module = P2^2;          // 人体红外感应引脚定义
sbit Beep = P2^0;          // 蜂鸣器引脚定义

sbit Lamp = P1^3;          // 照明灯定义
uchar gCount=0;                  // 全局计数变量
uchar gIndex;                  // 亮度变量,0是最暗,9是最亮,一共10档
uintgTime=0;                                                                // 计时变量,用于计时多久没检测到有人

uint temperature ;    //温度变量

uchar menu_1;                  //时间/定时模式切换
uchar menu_2;                  //调整时间
uchar ret;                        //AD采集结果

uchar key_time,flag_value;      //用做连加的中间变量
bit key_500ms;


/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
      SectorErase(0x2000);
      byte_write(0x2000, fen1);
      byte_write(0x2001, shi1);
      byte_write(0x2002, open1);
      byte_write(0x2058, a_a);      
}

/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
      fen1= byte_read(0x2000);
      shi1= byte_read(0x2001);
      open1 = byte_read(0x2002);
      a_a   = byte_read(0x2058);
}

/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
      read_eeprom();                //先读
      if(a_a != 1)                //新的单片机初始单片机内问eeprom
      {
                fen1= 3;
                shi1= 8;
                open1= 1;
                a_a = 1;
                write_eeprom();         //保存数据
      }      
}

/*********************************************************/
// ADC0832的时钟脉冲
/*********************************************************/
void WavePlus()
{
      _nop_();
      ADC_CLK = 1;
      _nop_();
      ADC_CLK = 0;
}

/*********************************************************/
// 获取指定通道的A/D转换结果
/*********************************************************/
uchar Get_ADC0832()
{
      uchar i;
      uchar dat1=0;
      uchar dat2=0;
      
      ADC_CLK = 0;                              // 电平初始化
      ADC_DAT = 1;
      _nop_();
      ADC_CS = 0;
      WavePlus();                                        // 起始信号
      ADC_DAT = 1;
      WavePlus();                                        // 通道选择的第一位
      ADC_DAT = 0;      
      WavePlus();                                        // 通道选择的第二位
      ADC_DAT = 1;
      
      for(i=0;i&lt;8;i++)                // 第一次读取
      {
                dat1&lt;&lt;=1;
                WavePlus();
                if(ADC_DAT)
                        dat1=dat1|0x01;
                else
                        dat1=dat1|0x00;
      }
      
      for(i=0;i&lt;8;i++)                // 第二次读取
      {
                dat2&gt;&gt;= 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;
}</code></pre>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p></p>

<p></p>

<p></p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

w494143467 发表于 2020-12-29 18:54

<p>感谢分享,源码和仿真图都分享出来了!</p>

freebsder 发表于 2020-12-29 22:33

<p>这洞洞板搞的好原始。</p>

熹妃飞 发表于 2020-12-30 03:56

<p>感谢大佬分享的源码和仿真图,谢谢大佬</p>

hualongacd 发表于 2022-5-14 14:54

<ul>
        <li>WavePlus(); // 起始信号</li>
        <li>ADC_DAT = 1;</li>
        <li>WavePlus(); // 通道选择的第一位</li>
        <li>ADC_DAT = 0;</li>
        <li>WavePlus(); // 通道选择的第二位</li>
        <li>ADC_DAT = 1;</li>
        <li>我想问一下adc0832的CH1引脚悬空是默认高电平吗,还有通道选择01,难道不是CH0负输入,CH1正输入吗,为什么我仿真的结果却像选择通道10,只对CH0单通道输入,能解答下吗,万分感谢</li>
</ul>

TPY 发表于 2022-5-17 12:05

<p>学习了!谢谢分享</p>

Xink 发表于 2024-1-15 11:56

感谢分享

att123 发表于 2025-1-3 16:26

加个截取当前时间的功能就好了,,

tryisbest 发表于 2025-1-4 19:14

<p>感谢分享资源,之后有时间也来玩玩看。</p>

mayb511 发表于 2025-1-13 12:05

有沒有數字調諧的收音機開發資料?
页: [1]
查看完整版本: 基于51单片机多功能智能台灯(带时钟、姿态矫正、显示温度亮度)源程序仿真文件