摘 要
学习桌属于一款面向3-12岁儿童的辅助学习工具。随着生活水平进步,超过6成的家长都会选择为自家的小孩购买一款适合的学习桌,用于辅助学习。普通的学习桌,具有桌椅高度可升降,桌面角度可以调节等特点。
本控制系统为了完善学习桌的功能性,增加了坐姿警报功能,用于调整使用者的不良坐姿,可调节的照明功能,用于提供最适合的照明环境,人体感应功能,用于自动模式下在无人使用的情况下自动关闭本控制系统。本设计具有三种工作模式,分别是手动、自动和呼吸灯模式。具体是利用STC89C51作为主要的控制核心;利用三级管SS8550驱动16个工作电压为5V的LED灯,作为照明模块;利用E18-D50NK红外避障传感器在感应范围内检查到目标物体输出低电平的特性,外接到单片机的IO口,配合着蜂鸣器组成坐姿警报部分;利用ADC0809模拟数字转换芯片和光敏电阻,通过将经过光敏电阻的电流值的变化,转换为数值反应到单片机中,输出相应的PWM占空比改变LED灯的亮度;利用红外遥控器和红外一体遥控接收装置,作为遥控模块,实现远程的操控;利用HC-SR501人体感应器在自动模式下,感应周围是否有使用者,使设计更加环保,并且人性化。
结果表明,本套智能学习桌控制系统,在本体幼小衔接机构的测试中,受到了小朋友的欢迎。在将功能向老师和家长的展示过程中,也得到了他们的肯定。对于小朋友的坐姿调整,和视力的保护,起到了很大的作用。
关键词:智能学习桌; STC89C51; A/D转换; 人体感应器; 红外遥控
1 系统方案设计
1.1 总设计方案选择
随着社会的发展,生活水平方面也在不断的提高,对于传统的智能学习桌,因其只是强调了桌面角度和桌椅高度的可调节性,无法从根本提醒使用者坐姿错误。所以要设计出一套智能学习桌的控制系统,用于正面高效的改善使用者的学习习惯,对于本次智能学习桌控制系统提出以下两种设计方案
方案一:
本设计分为两种模式和五个按键:自动和手动模式;模式切换、设置、复位、加和减。
自动模式下,使用红外避障感应器,判断使用者的坐姿是否标准,通过ADC0809模数转换和光敏电阻调节亮度,使用HC-SR501人体感应器判断是否有人。
在手动模式下,可以通过长按加减按键调整亮度,可以设计学习时间,按下控制按键后可以通过加减键控制设置时间的分和秒。
使用手机app,进行远距离的控制模式和档位。
方案二:
本设计有三种工作模式、三个按键:分为手动模式、自动模式和呼吸模式,第一个按键切换模式,其余两个用于手动模式下,控制LED的亮度。
采用ADC0809模数转换芯片处理光敏电压信号,控制芯片控制灯光的亮暗。
自动模式下,检查到有人且光线暗,台灯才亮,离开延时熄灭。
拥有红外遥控功能,10米内可使用遥控器切换模式和增减亮度。
为防止近视,附加红外避障传感器,使用其测距功能,提升使用者距离学习桌过近,用于防止近视,矫正坐姿。
呼吸灯模式,属于拓展模式,为以后增加可变色的灯,做准备,增强趣味性。
本设计所面对的年龄较小的儿童,所以设计学习时间的实用性不强,远距离的通过手机wifi操作的操作难度很大,但是收益不高,可以使用相对简单的遥控器进行操控。所以综合的来看方案二从收益的可行性来看,要更好一些。
1.2 主控制模块选择
选择嵌入式的微型处理芯片主要考虑其应用领域、自带资源和功耗三个方面。
方案一:
使用STC89C51RC单片机(双列直插式)[2],比8051单片机更高速、功耗更低,拥有2个16位的计算器,可工作电压为3.3-5.5V,频率范围为0-35MHz,无需购买通用编译器即可使用PC端的控制程序将编程代码下载到单片机中。
具有经济实惠、抗干扰能力强、功耗低、兼容性强大等优点。
方案二:
使用AVR单片机,一种嵌入内置RISC精简指令的增强型高速8位的单片机,且内部拥有程序储存器(flash),程序修改便捷,I/O口资源灵活、功能强大,并且可以实现充分利用。拥有独立的看门狗电路和自动上电复位电路。
具有应用范围广泛,可靠性高、功能强大、功耗低、价位低、速度高等特点。集众多单片机的长处,又拥有其独特的技术,属于8位机中的佼佼者。
方案三:
使用FPGA(现场可编程门列阵[3]),多使用于专门的集成电路领域,属于半定制器件,而且还是可以进行编程修改的。按照使用者的需求,其内部的逻辑块和连接是可以根据需求进行更改的。FPGA可以实现比较庞大的电路,就当下来看,基本可以实现所有的需求。
具有逻辑单元灵活、集成度高、适用范围广、周期低、费用低、风险小、质量稳定等优点。
综合以上三个方案最后选择51单片机进行系统开发,因为其满足开发需要,功耗低,抗干扰能力强,拥有强大的兼容性和普遍性,最主要的是相较于其他两个方案,51单片机的价格优势十分明显,开发起来也更方便。
1.3 系统的总体设计
通过对以上选择方案的进一步的研究总结确定本产品还需要有以下几个功能模块组成:照明模块因为需要驱动16个电压5V,额定电流20mA的白光LED灯,选择成本低,容易操控、大功率SS8550驱动照明模块。手动模式下,通过红外避障感应器,检查坐姿是否标准,所有按钮或者遥控装置进行亮度的调节。自动模式下,使用HC-SR501人体红外感应器确定是否有人,通过ADC0809模拟数字转换芯片,通过接受电源通过光敏电阻后进入到芯片的电压,将其和预设的阈值进行对比,将输出值传递到单片机中,调整PWM的占空比对LED的电流进行控制,从而实现了对光度的自动调节。
本系统结构框图如图1.1所示。
图1.1 系统结构框图
2 硬件电路设计
2.1 总电源电路设计
根据项目的需求,选择使用总电源为5V[4],为整个系统的供电处理。可以选择外接一个由4节1.5V电池构成的电池盒降压后进行供电,或者选择安装DC插座,使用数据线另一端的USB接口,连接充电宝、手机充电器、或者电脑USB插口等5V的电源上。外接电池盒从实用性和便捷性的角度来考虑,都不如按照DC插座便捷,电池因为电量有限,无法进行长时间使用,不符合本设计的初衷。电源电路原理图如图2.1所示(可以选择不接地)。
图2.1 5V电源电路原理图
为了系统的正常运行,设置了几个用于保护电子器件的分压电阻和用于信号接收器与单片机之间用于信号稳定功能的上拉电阻。
2.2 单片机控制模块
2.2.1 单片机的引脚说明
51单片机分为PDIP(40个引脚)和PLCC(44个引脚)两种封装形式[5],本设计选择PDIP40的直插式的单片机,在进行组装前,优先选择在电路板上面先焊
接一个IC的插座,这样在安装单片机时,可通过对其引脚直接插入的方式进行安装,一方面是操作简便不容易破坏单片机,一方面方便日后程序的更改和调试。
单片机引脚功能如表2.1所示。
2.2.2 单片机最小系统
单片机的最小系统,最小系统即指使用最少的电子元件实现单片机工作。本设计使用到复位电路,晶振电路。下图为本设计的最小系统外加一串P0口上的上拉电阻。
其中复位电路可以看做是电脑的重启按钮,一旦程序出现错误或者想要重启重启程序,可以通过按复位电路中的按钮来实现。而想要实现复位,需要在与复位单路连接的9号引脚,实现连续2us的高电平方才可以实现[6]。具体就是在图中10uf的电容和10k的下拉电阻的作用下,通过开机的充电和下拉电阻的分担实现的。如果没有10uf电容,在通电后,单片机不会直接工作,只有在按下按钮后,单片机才能正常工作。晶振电路是晶体振荡器的简称,属于一个电容和一个电阻串联后再与一个电容并联,相当于一个二级网络。选择的晶振12MHz,即单片机每秒工作12兆次,一般选择的晶振不会超过24M,过大单片机运行时会出现不稳定的现象。电容选择两个30pf的,一般会选择10pf-50pf之间,目的就是为了对18和19两个引脚产生的其他频率的波进行过滤,虽然对电路没什么影响,但是会对单片机的时钟电路产生影响[7]。 32到40引脚连接的是上拉电阻,P0平时只有低电平和高阻态两种状态,如果需要其输出高电平,就必须连上上拉电阻。上拉电阻一般会在1k和10k中进行选择,比如连接数码管的时候,就最好连接1k的上拉电阻,用于驱动数码管;10k的就是多用于驱动芯片,而本次设计就
是选择了10k的上拉电阻来驱动模数转换模块。31号引脚用于接电源,由其在单片机复位以后,接低电平时从外部ROM的000H开始执行,接高电平从内部ROM的000H开始执行,本选用的是内部,使用接电源。
单片机最小系统原理图如图2.2所示。
图2.2单片机最小系统原理图
3 系统软件设计
整个项目的实现是通过软件和硬件两个方面的相辅相成才能够实现的。说明书的前两章已经详细的介绍了各个模块的功能和选择。想成功的使用软件还需要选择一个开发平台,从而进行单片机程序编写。
3.1 软件开发环境及流程
本次设计采用了Keil C51的软件开发系统,从编程的角度来看C语言的优势也是很明显的,在结构性、功能性、可维护性,可移植性上都具有优秀的表现,而且在出现错误和发现问题的时候,因其简单上手,也便于漏洞的修改。开发平台选择使用Keil 4来运行[18],Keil提供了完整的开发计划,包括C编译器,库管理,宏程序集,连接器以及将这些组件组装到集成开发环境(Vision)中的非常强大的模拟器调试器,并且其集成环境也特别方便,非常适合STC89C51单片机程序的烧制。
3.2 坐姿警报程序介绍
本产品为智能学习桌控制系统,一切的前提都是在矫正不良坐姿改善用眼情况的基础上,使用当使用者距离避障传感器过近的时候,蜂鸣器会发出提示,无论是哪种工作模式都要遵守本前提。
其具体的坐姿警报流程图3.1如下。
图3.1 坐姿警报流程图
3.3 自动模式程序介绍
系统在确认使用者坐姿正确的情况下,自动模式只有确认有人使用,并且光线值大于100的情况下[19],才可以由操作系统自动控制亮度。
其具体流程图3.2如下。
图3.2自动模式程序流程图
3.4 手动模式红外遥控程序介绍
本控制系统在手动模式下,可以通过按键或者红外遥控的形式,进行亮度的切换。使用者可使用本功能自由的改变LED的亮度,增强系统的实用性。
其具体流程图3.3如下
图3.3手动,模式红外遥控程序流程图
**原理图**

附录2 源程序代码
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include <intrins.h>
#include "delay.h"
#include "rc522.h"
#include "1602.h"//宏定义
#define uint unsigned int
#define uchar unsigned char
uint X1=0;
uint X2;
//头函数
#include <reg52.h>
#include <ADC0809.h>
//时间计算
#define Imax 14000 //此处为晶振为11.0592时的取值,
#define Imin 8000 //如用其它频率的晶振时,
#define Inum1 1450 //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
//解码变量
unsigned char Im[4]={0x00,0x00,0x00,0x00};
uchar show[2]={0,0};
//全局变量
uchar f;
unsigned long m,Tc;
unsigned char IrOK;
//LED灯光强度
uchar LL=0;
uint YK=0;
uint ZY=0,Xi=0,FZ=0;
uchar Mode=1;
//函数声明
void Init();
void delay(uchar i);
//管脚声明
sbit LED = P1^4;
sbit LEDR= P2^2;
sbit LEDG= P2^4;
sbit LEDY= P2^6;
sbit set = P1^5;
sbit add = P1^6;
sbit dec = P1^7;
//主函数
void main()
{
//定时器初始化100HZ
Init();
m=0;
f=0;
//模式1
LEDR=1;
LEDY=1;
LEDG=1;
delay(3);
LEDR=0;
LEDY=1;
LEDG=1;
//循环
while(1)
{
//读取亮度AD值
LL=ADC0809();
//
//亮度控制
//光敏控制Ok
if(Mode==2)
{
if(LL>50)
{
X1=0;
}
else
{
if(LL-1>0xf0)
LL=1;
X1=1020-LL*20;
}
}
//遥控器ok
else if(Mode==1)
{
X1=YK;
ZY++;
else
ZY--;
}
if(ZY==400)
{
FZ=1;
}
if(ZY==0)
{
{
X1--;
}
LED=1;
X2=1000-X1;
while(X2!=0)
{
X2--;
}
///
if(set==0)
{
delay(20);
if(set==0)
{
Mode++;
if(Mode==1)
{
LEDR=1;
LEDY=1;
LEDG=1;
delay(100);
LEDR=0;
LEDY=1;
LEDG=1;
}
if(Mode==2)
{
LEDR=1;
LEDY=1;
LEDG=1;
delay(100);
LEDR=1;
LEDY=1;
LEDG=0;
}
if(Mode==3)
{
LEDR=1;
LEDY=1;
LEDG=1;
delay(3);
LEDR=1;
LEDY=0;
LEDG=1;
}
if(Mode==4)
{
Mode=1;
LEDR=1;
LEDY=1;
LEDG=1;
delay(100);
LEDR=0;
LEDY=1;
LEDG=1;
}
while(set==0);
}
}
if(add==0)
{
delay(20);
if(add==0)
{
YK=YK+100;
if(YK>1000)
{
YK=0;
}
while(add==0);
}
}
if(dec==0)
{
delay(20);
if(dec==0)
{
YK=YK-100;
if(YK>1000)
{
YK=0;
}
while(dec==0);
}
}
if(IrOK==1)
{
//1键
if(Im[2]==0x0c)
{
LEDR=1;
LEDY=1;
LEDG=1;
delay(100);
LEDR=0;
LEDY=1;
LEDG=1;
Mode=1;
}
//2键
else if(Im[2]==0x18)
{
LEDR=1;
LEDY=1;
LEDG=1;
delay(100);
LEDR=1;
LEDY=1;
LEDG=0;
Mode=2;
}
//3键
else if(Im[2]==0x5e)
{
LEDR=1;
LEDY=1;
LEDG=1;
delay(3);
LEDR=1;
LEDY=0;
LEDG=1;
Mode=3;
}
//+
else if(Im[2]==0x40)
{
YK=YK+100;
if(YK>1000)
{
YK=0;
}
}
//-
else if(Im[2]==0x19)
{
YK=YK-100;
if(YK>1000)
{
YK=0;
}
}
IrOK=0;
}
}
}
//定时器初始化
void Init(void)
{
EA=1;//开启总中断
IT1=1;//下降沿有效
EX1=1;//外部中断1开
TMOD=0x11;//定时器初始化
TH0=0;//T0赋初值
TL0=0;
TR0=0;//t0开始计时
}
//延时
void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
//外部中断解码程序_外部中断0
void intersvr1(void) interrupt 2 using 1
{
LED=1;
TR0=1;
Tc=TH0*256+TL0;//提取中断时间间隔时长
TH0=0;
TL0=0; //定时中断重新置零
if((Tc>Imin)&&(Tc<Imax))
if(f==1)
{
if(Tc>Inum1&&Tc<Inum3)
{
Im[m/8]=Im[m/8]>>1|0x80; m++;
}
if(Tc>Inum2&&Tc<Inum1)
{
Im[m/8]=Im[m/8]>>1; m++; //取码
}
if(m==32)
{
m=0;
f=0;
if(Im[2]==~Im[3])
{
IrOK=1;
TR0=0;
}
else IrOK=0; //取码完成后判断读码是否正确
}
//准备读下一码
}
}
4 焊接与调试
4.1 电路焊接
焊接时采用的是手工焊接的方式,目前大规模的制作是不会使用这种方式的,但是为了控制成本,本设计采用手工焊接的方式。由于是手工焊接,所以操作上出现失误,就会导致成品本质上功能的失误。
焊接成品如下图4.1所示
图4.1 焊接成品展示图
结 论
本去篇论文针对的是在5到10岁的儿童,在日常的学习生活中,坐姿和用眼习惯的不端正,导致了大量的眼部疾病的产生。经过考察发现传统的智能学习桌无法有效的督促,而本设计可以有效的起到坐姿警报的作用,填补了这方面市场的空白。
本系统使用STC89C51单片机作为主控制器,利用ADC0809传感器作为模数转换模块,所用红外避障传感器检查使用者坐姿是否标准,为了起到环保节能的作用。在自动模式下,使用光敏电阻传递给模数转换器的电信号来检测环境的亮度,使用HC-SR501感应器检测周围是否有人,但操控者距离较远的时候,也可使用红外遥控装置进行远程的操控。本设计使用Keil 4进行C语言的编程,从而实现各个模块的功能。
经过了硬件和软件多次的测试,目前各个部分已经达到预期的标准。
经过本次设计,主要有以下体会:
1.熟练了红外遥控的应用。
2.进一步的掌握了STC89C51单片机和ADC0809模数转换装置的应用。
3.明白了如何通过输出不同的占空比来调节LED的亮度,从而对耗电量进行相应的管理。
4.对于HC-SR501人体感应器和E18-D50NK红外避障传感器的使用和调试有了进一步的了解。
5.培养了不懂就问和自主学习的能力。