基于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> </p>
<p>制作出来的实物图如下:</p>
<p></p>
<p>仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)</p>
<p></p>
<p>PCB文件:</p>
<p></p>
<p>部分源程序:</p>
<pre>
<code>#include <reg52.h> //调用单片机头文件
#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<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;
}</code></pre>
<p> </p>
<p> </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> <p>感谢分享,源码和仿真图都分享出来了!</p>
<p>这洞洞板搞的好原始。</p>
<p>感谢大佬分享的源码和仿真图,谢谢大佬</p> <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>
<p>学习了!谢谢分享</p>
感谢分享 加个截取当前时间的功能就好了,, <p>感谢分享资源,之后有时间也来玩玩看。</p>
有沒有數字調諧的收音機開發資料?
页:
[1]