一、系统方案
本设计采用51单片机作为主控器,超声波检测距离,当光照小于设置阀值的台灯打开,测量距离小于设置值,蜂鸣器报警,液晶1602显示。
二、硬件设计
原理图如下:
三、单片机软件设计
1、首先是系统初始化:
beep = 0; //开机叫一声
delay_1ms(150);
P0 = P1 = P2 = P3 = 0xff; //初始化单片机IO口为高电平
init_1602();
time_init(); //定时器初始化程序
init_eeprom(); //开始初始化保存的数据
write_string(1,0," JL: m gx: “);
write_string(2,0,” : : ");
2、液晶显示程序
/********************************************************************
- 名称 : write_com(uchar com)
- 功能 : 1602命令函数
- 输入 : 输入的命令值
- 输出 : 无
***********************************************************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/********************************************************************
- 名称 : write_data(uchar dat)
- 功能 : 1602写数据函数
- 输入 : 需要写入1602的数据
- 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
3、按键检测程序
uchar key_can;
/***独立按键程序/
void key()
{
key_can = 20;
if(s1==0) //减按键按下
{
delay_1ms(5);//延时消除按键抖动
if(s1==0) //减按键按下
{
while(!s1);// 等待按键释放
key_can = 1;
}
}
if(s2==0) // 加按键按下 ,后面都同上,就不注释了
{
delay_1ms(5);
if(s2==0)
{
while(!s2);
key_can = 2;
}
}
if(s3==0) //选择按键按下
{
delay_1ms(5);
if(s3==0)
{
while(!s3);
key_can = 3;
}
}
}
4、核心算法程序
/报警函数******/
void clock_beep()
{
static uchar value1,value2,value3;
if((guangxian >= qiang_gx) || (guangxian <= ruo_gx)) //光线报警
{
value2++;
if(value2>= 2) //循环2次都是报警 增强抗干扰
{
flag_gx = 1; //光线报警
}
}
else
{
value2 = 0;
flag_gx = 0;
}
/******************************************************************************/
if(xuexi_start == 1) //已经开始学习了
{
if(distance <= set_d) //距离报警
{
value1 ++;
if(value1 >= 2) //循环2次都是报警 增强抗干扰
{
flag_juli = 1;
}
}else
{
value1 = 0;
flag_juli = 0;
}
if((shi == s_shi) && (fen == s_fen) && (miao == 0)) //时间报警
{
flag_time = 1;
}
}
if(flag_time == 1) //时间提示报警
{
value3 ++;
if(value3 % 4 == 0)
{
for(i=0;i<6;i++)
{
beep = ~beep; //蜂鸣器报警
delay_1ms(100);
}
beep = 1;
}
if(value3 >= 4000 )
{
value3 = 0 ;
flag_time = 0;
}
}
else
{
if(xuexi_start == 1) //已经开始学习了
{
if((flag_gx == 1) || (flag_juli == 1))
{
beep = ~beep; //报警
}
}
}
}
四、proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。