5404|6

1

帖子

271

TA的资源

一粒金砂(初级)

楼主
 

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

本帖最后由 木头12333 于 2020-12-30 12:52 编辑

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

 

制作出来的实物图如下:

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

PCB文件:

部分源程序:

#include <reg52.h>                 //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
#define uint  unsigned 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档
uint  gTime=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<8;i++)                // 第一次读取
        {
                dat1<<=1;
                WavePlus();
                if(ADC_DAT)
                        dat1=dat1|0x01;
                else
                        dat1=dat1|0x00;
        }
       
        for(i=0;i<8;i++)                // 第二次读取
        {
                dat2>>= 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;
}

 

 

软件下载及使用说明.rar (4.07 MB, 下载次数: 79)

仿真.rar (78.23 KB, 下载次数: 71)

源程序.rar (74.89 KB, 下载次数: 82)

此帖出自51单片机论坛

最新回复

感谢分享  详情 回复 发表于 2024-1-15 11:56

赞赏

1

查看全部赞赏

点赞(3) 关注(2)
 

回复
举报

1942

帖子

3

TA的资源

版主

沙发
 

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

此帖出自51单片机论坛
 
 
 

回复

7452

帖子

2

TA的资源

五彩晶圆(高级)

板凳
 

这洞洞板搞的好原始。

此帖出自51单片机论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

4
 

感谢大佬分享的源码和仿真图,谢谢大佬

此帖出自51单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

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

回复

180

帖子

0

TA的资源

一粒金砂(中级)

6
 

学习了!谢谢分享

此帖出自51单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
感谢分享
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表