所以,我们在电路中与光敏电阻串联的电阻选择为10k
,符合上述的范围要求。
2.2.2模数转换模块
模数转换电路主要由ADC0804构成。
当温度值转换为电压后,还需要将电压值进行A/D转换,转换后的8位二进制才能送到单片机进行处理。
ADC0804芯片是典型的8位8通道逐次逼近式A/D转换器,可对8路模拟电压实现分时转换。
为了换算方便,设置基准电压为5V,即模拟量输入为+5.0时,ADC输出为0FFH,即255,系统分辨率为5/255=0.02V/LSB。
其外围设计电路为:
2.2.3AT89C51单片机
单片机主要通过程序来控制灯的亮灭或灯的亮度。
AT89C51单片机电路图如下:
2.2.4LED显示模块
LED显示模块主要由高亮LED灯构成。
主要是由单片机的外部中断来控制LED灯的亮度。
单片机每接收到一个同步信号后,就启动一个延时程序。
而延时的长短由按键或是外界光强来改变。
当延时结束后,单片机会产生一个触发信号,使灯发光。
电路连接如下:
2.2.5电源模块
电源模块主要是由学习板连接电脑所获得的电压,再分别连到所需电路中去。
3软件设计
根据智能照明系统的思想和原理,本次设计制作的电路比较简单。
系统重点在软件设计,硬件设计相对较简单。
主要和关键的问题是根据光敏电阻、A/D芯片和学习板上的51单片的工作原理来编写程序以达到所要求实现的照明系统和智能系统。
其流程图如下所示:
基本要求:
系统能够随时间和环境的光线强度自动控制灯的亮灭。
(先定时5s使灯不受外界环境变化的影响,5s结束后,灯随外界光强度变化,25s后,灯一直亮)
(a)主程序(b)中断程序
发挥部分:
1.灯的亮度由外界光线的变化调节;
发挥部分:
2.灯的亮度由学习板上的按键手动调节;
(a)手动调节的主程序
(b)数码管显示芯片
4系统测试
4.1测试方案
步骤1:
基于proteus和keil软件,根据基本要求实现仿真;
步骤2:
先安上元件后,焊接电路,用万用表测试电路是否正确连通,以确定无虚焊、漏焊和焊接错误等问题,然后将集成芯片安上。
以此可以防止集成芯片由于电压过大而烧坏;
步骤3:
将焊接好的电路与学习板上的51单片机相连,检查连接无误后,装载程序,调试,运行;
步骤4:
观察硬件反映情况,检查错误,调整程序,以达到实现所要求的功能和现象的目的。
4.2测试结果
当装载基本要求的程序后,数码管由5--0倒计时,在此期间高亮发光二极管灯灭,且当外界变暗或是变亮,都对灯没有影响;当数码管为0时,在接下来的25秒内,外界的变化会影响灯的亮灭;
当装载自动调节灯的亮灭的程序后,光线逐渐变强的时候,灯的亮度也会逐渐增加。
当装载手动调节灯的亮度的程序,随着按键的变化,可以发现灯随着按键K0,数码管显示的占空比增加,灯变亮;若按K1键,数码管显示的占空比减小,灯变暗;若按K3键占空比清零。
4.3结果分析
在实现基本要求时,光敏电阻对光线比较敏感,外界光线变化会使灯亮灭明显,不足的是数码管显示系统控制灯的时间(t1)和外界控制灯的时间(t2)是同步的,限制了t2>t1;
在手动调节灯的亮灭的时候,数码管可以正确显示占空比的值,不足是灯的亮度改变等级不明显。
经过各项性能的测试,系统的指标和电路基本达到预期的效果,如果能考虑到实际的光敏电阻的感光性和灯的亮灭区间,系统将更加完善。
5结语
本报告详细讲述了系统设计方案,并给出了相关程序流程。
由于系统架构设计合理,功能电路实现较好,系统性能优良、稳定,较好地达到了题目要求的各项指标。
基于学习板系统进行软件调试很容易。
在自动调节灯的亮度时,通过延时用数码管显示灯的亮的占空比,从而改变了灯的亮度。
本系统的智能控制是以51学习板上的AT89C51单片机控制单元为核心,通过电脑的驱动,完成对系统灯的控制,采用一个高亮发光二级管的亮灭来显示整个系统的效果。
系统设计智能化控制的同时,还设计了手动按键的控制,达到了简单的智能照明。
附录:
附1:
元器件明细表
器件名称
规格
数量
电容
150PF
1个
光敏电阻
1个
电阻
10千欧
4个
芯片底座
20pin
1个
芯片
ADC0804
1个
学习板
1个
插针
若干
杜邦线
19根
LED灯
高亮灯
一个
附2:
电路图图纸
实物图
附3:
程序清单
基本要求的程序:
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitadcs=P1^7;
sbitadrd=P3^7;
sbitadwr=P3^6;
sbitled=P1^5;
sbitSeg_ce=P1^0;
sbitDig_ce=P1^1;
uchartab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0到9
uintad_data,m=0,n=0,t1=5,t2=25;//ad_data表示AD输出8位2进制,t1为定时5秒后启动光采集电路,t2为定时25秒后关闭光采集电路
voiddelay(uinti)
{
uintj;
for(i;i>0;i--)
for(j=124;j>0;j--);
}
voidkeyscan(uintnum)//显示5秒
{
uintge,shi;
ge=num%10;
shi=num/10;
P0=0;Seg_ce=1;Seg_ce=0;//清段选
P0=0xff;Dig_ce=1;Dig_ce=0;//清位选
P0=tab[ge];Seg_ce=1;Seg_ce=0;
P0=0xfe;Dig_ce=1;Dig_ce=0;//显示5秒
}
voidread_ad()
{
adcs=0;
adwr=0;delay
(1);adwr=1;delay
(1);//启动AD,开始采样(/wr低电平保持的最短时间为100ns启动转换后必须加入一个延时以等待AD采样结束
adrd=0;delay
(1);ad_data=P2;delay
(1);adrd=1;//读数据读取转换结果(/rd>200ns)
adcs=1;
}
voidmain()
{P0=0;
P1=0x2c;//初始化P1_5为低(灯一开始是灭的)
TMOD=0x01;//方式1,16位定时器
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//设置定时器初值
IE=0x82;//设置中断允许
TR0=1;//启动定时器
while
(1)
{
if(m==0)keyscan(t1);
if(t1==0)//5秒已完,启动光采集电路
{
while(t2)
{
read_ad();
if(ad_data<125)//当外界很亮的时候关灯
{
led=1;
}
else
{
led=0;//亮灯
delay
(1);
}
}
if(t2==0)led=0;//25秒已完,forever亮
}
}
}
voidT0_timer()interrupt1//定时器T0中断函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(t1!
=0)m++;//不为0说明光采集电路还未启动,还在5秒之内
if(m==20)//1秒时间
{
m=0;
t1--;
}
if(t2!
=0)n++;//不为0说明还在25秒之内
if(n==20)//1秒时间
{
n=0;
t2--;
}
}
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitDig_ce=P1^1;
sbitSeg_ce=P1^0;
sbitKey_ce=P1^3;
sbitled=P1^5;
uintz;
uchartab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0-9
voiddelay(uinti)
{
uintj;
for(i;i>0;i--)
for(j=19;j>0;j--);
}
voidkeyscan()
{
ucharTemp1,Temp2;
P0=0;Seg_ce=1;Seg_ce=0;
P0=0xfe;Dig_ce=1;Dig_ce=0;delay
(1);//扫描第一行,将第一行置低电平
Key_ce=0;//将P1_3口拉低,74LS244使能
Temp1=P0;//读P0口数据
Temp1=Temp1&0x0f;//提取按键相关数据-P0口的低四位
if(Temp1!
=0x0f)//判断是否有按键按下
{
delay(10);//延时消抖
Temp2=P0;Temp2=Temp2&0x0f;//再读P0口,并提取P0口低四位数据
if(Temp1==Temp2)
{
switch(Temp2)
{
case0x0e:
z=z+10;break;//按K0键每按一次键就增加10%的亮度,从而逐渐变亮,若低四位的值与0x0e相等,就执行其后的语句
case0x0d:
z=z-10;break;//按K1键每按一次键就减少10%的亮度,从而逐渐变暗
case0x07:
z=0;break;//按K3键清零
default:
break;
}//等待按键释放
while(Temp2!
=0x0f)
{
//不断地读取P0口数据,只要结果不等于0x0f,说明有按键没有被释放,直到释放,才退出
Temp2=P0;
Temp2=Temp2&0x0f;
}
}
}
Key_ce=1;//关使能端
if(z<=100)
{P0=0xff;Dig_ce=1;Dig_ce=0;//清段选
P0=tab[z%10];Seg_ce=1;Seg_ce=0;delay(5);//个位
P0=0xfe;Dig_ce=1;Dig_ce=0;delay(5);
P0=0xff;Dig_ce=1;Dig_ce=0;
P0=tab[(z/10)%10];Seg_ce=1;Seg_ce=0;delay(5);//十位
P0=0xfd;Dig_ce=1;Dig_ce=0;delay(5);
P0=0xff;Dig_ce=1;Dig_ce=0;
P0=tab[z/100]|0x80;Seg_ce=1;Seg_ce=0;delay(5);//百位
P0=0xfb;Dig_ce=1;Dig_ce=0;delay(5);
}
elsez=0;
}
voidmain()
{
P0=0;
P1=0x2c;
z=0;//100为100%的占空比//机器周期
led=1;
while
(1)
{
keyscan();
led=0;
delay(z);
led=1;
delay(100-z);
}
}
拓展2(自动控制灯的亮灭)
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitadcs=P1^7;
//A/D使能端
sbitadrd=P3^7;
sbitadwr=P3^6;
sbitled=P1^5;
uintad_data,num;
voiddelay(uintz)//50微
{
uintx,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
voidread_ad()
{
adcs=0;
adwr=0;delay(10);adwr=1;delay(10);//启动AD,开始
adrd=0;delay(10);ad_data=P2;delay(10);adrd=1;//读数据读取转换结果(/rd>200ns)
adcs=1;
}
voidmain()
{
uintz[]={0,10,20,30,40,50,60,70,80,90};
P0=0xff;//初始化
while
(1)
{
read_ad();
if(ad_data<=50)
num=0;
//判断外界光的强弱从而判断灯应该亮的等级
elseif(ad_data>50&&ad_data<=60)
num=1;
elseif(ad_data>60&&ad_data<=73)
num=2;
elseif(ad_data>73&&ad_data<=87)
num=3;
elseif(ad_data>87&&ad_data<=120)
num=4;
elseif(ad_data>120&&ad_data<=140)
num=5;
elseif(ad_data>140&&ad_data<=160)
num=6;
elseif(ad_data>160&&ad_data<=180)
num=7;
elseif(ad_data>180&&ad_data<=215)
num=8;
elseif(ad_data>215&&ad_data<=255)
num=9;
led=0;delay(z[num]);
led=1;delay(100-z[num]);
}
}