基于单片机的光控路灯设计含程序和仿真图.docx
《基于单片机的光控路灯设计含程序和仿真图.docx》由会员分享,可在线阅读,更多相关《基于单片机的光控路灯设计含程序和仿真图.docx(24页珍藏版)》请在冰豆网上搜索。
基于单片机的光控路灯设计含程序和仿真图
摘要
随着社会文明的不断发展,城市照明已经不仅仅局限于街道的照明,而更是发展成为了城市景观等装饰性照明的综合市政工程。
本系统采用51单片机和相关的光电检测设备来设计智能光控路灯控制器,利用单片机可编程控制八位逻辑I/O端口实现路灯的智能化,达到节能、自动控制的目的,避免了传统电路对能源的浪费,且路灯的自动控制更方便了工作人员的管理。
而且所用的路灯采用LED灯,众所周知,LED是目前最为节能的发光元件,通过采用LED发光可以节省大量的电能,因此,智能光控节能路灯必将在未来得到广泛的应用。
本设计方案采用光线强度、时间以及道路车流量的三重模式控制,在很大程度上做到了“随需而控”,同时符合了当今社会所倡导的节约型、可持续性发展的标准,因而拥有良好的可行性和具有很大的实用价值。
本设计是以光敏电阻对于外界光线强弱的感应能力为基础进行的路灯自动化控制系统设计。
当光线强度弱到一定程度的时候,路灯就会自动灭掉;当光线强到一定程度的时候,路灯就会自动开启。
本设计以当外界光线强度弱到使光敏电阻阻值大于等于200欧的时候,LED灯会自动开启;小于200欧的时候,自动关闭。
关键字:
单片机,光敏电阻,LED,路灯照明
摘要··························································1
绪论
随着社会的发展,路灯已经成为一个城市的照明系统中不可分割的一部分,在城市照明中发挥着举足轻重的作用,而其所依靠的就是路灯自动化控制系统。
但当前大多采用的是定时的路灯自动化控制系统。
其通常都是采用全夜式开启路灯的自动化控制系统。
但因为夏天跟冬天因为天亮与天黑的时差颇大,使得夏天晚上过早的路灯就开启,早上又过晚的关闭。
且世界奇观这么多,偶尔总会出现点极端的天气状况,会造成白天天过黑、夜晚又如白昼般亮的情况(如日全食等),而路灯又不会自动开启或者关闭,这就使得交通事故的发生概率增大,路灯在这种情况下失去了其应有的价值和意义也造成能源的白白浪费。
而且现在路灯已经全球基本普及,大到世界有名的大城市,小到小城镇、小乡村都已经有了路灯,可想而知世界能源在这块的浪费上是多么的巨大。
光控路灯不仅可以解决这类问题,还可以使路灯在有需要的时候自动开启或者关闭,避免了路灯在不需要的时候自动开启或者关闭。
大大的避免了能源不必要的浪费,对于地球环保和能源的节约,可以起到巨大的作用。
一个城市每年在这块能源的经济支出上对于普通人来说简直是一个天文数字,一个人一辈子的用电可能都没有城市路灯几天的使用量大。
光控路灯如果可以普及化,不仅可以为城市省下了一大笔的开支,使其可以将节省下的资金投资到更有意义的地方去,使得城市可以更好、更快的发展。
对于世界来说,更是可以取得巨大的节约能源效果,对于绿色地球的实现做出巨大的贡献。
路灯自动化的控制方式有很多,本系统采用STC89C52和七段数码管显示器、LED灯等相关的光电检测、控制、显示设备,来设计智能光控路灯自动化系统。
实现能根据外界光线条件通过IIC总线模块、AD/DA转换模块等的处理实现控制路灯的自动化开启或者关闭功能。
一、目标及任务
本设计是以光敏电阻可以根据外界光线的强度而改变自身阻值的特性(光线越强,阻值越小;光线越弱,阻值越大)为基础设计的光控路灯自动化控制系统。
其原理是利用光敏电阻感受外界光线强度并体现在自身阻值的变化上,然后根据这一阻值的大小来判断外界的光线亮度情况,然后根据所得数据判断LED是该亮起还是该灭掉。
即当外界光线强度弱到使光敏电阻阻值大于等于200欧的时候,LED灯会自动开启;小于200欧的时候,自动关闭。
二、硬件设计
2.1主要模块构成:
(1)光敏电阻感应模块与AD/DA转换模块
所谓的AD/DA转换就是模数/数模转换,该设计中我们涉及到的是ADC(模数转换)。
PCF8591是具有IIC总线接口的8位A/D及D/A的转换器,具有4路A/D输入、1路A/D输出。
这里该设计利用PCF8591来实现ADC转换数据的功能和连接IIC总线的功能。
其引脚:
1)ANI0~ANI3为模拟信号输入端,不用时接地。
2)SDA为IIC总线数据输入输出端
3)SDL为IIC总线时钟输入端
4)VREF为基准电压输入端
其原理为:
光敏电阻通过感应外界的光线强度获得数据,通过PCF8591的ANI0端口(数据输入端口)输入数据,进行ADC(模数转换)将感应数据转换成数字数据。
AD/DA模块和光敏电阻感应模块仿真图如下:
(AD/DA转换模块与光敏电阻感应模块)
(2)IIC总线模块
随着大规模集成电路技术的发展,一个系统所需要的组件越来越多,所以各组成部分之间便需要总线来实现组件之间数据的传输、控制。
而IIC总线具有简单、有效、高性能优点。
可以大大简化系统的硬件设计。
因此得到广泛应用。
因为AT24C02拥有存储芯片,且可重复擦除数百万次和重复读写的能力。
因此在这里我们便采用AT24C02来实现IIC总线的EEPROM功能。
用它来存储数据并控制数据的输出与接收,实现IIC总线的双向串口通信功能。
其引脚:
a)SDA为串行数据输入输出端,是一个双向漏极开路结构的引脚,这里作为IIC总线数据输入输出端。
b)SCL为串行移位时钟控制端,这里作为IIC总线时钟输入。
写入数据时,上升沿有效;读出数据时,下降沿有效。
IIC总线仿真图如下:
(IIC总线模块)
(3)LED灯与数码管显示模块
这里我们应用了74HC573,它包含八路D型透明锁存器。
适用于面向总线的三态输出。
所有锁存器共用一个锁存使能(LE)端和一个输出使能(OE)端。
利用74HC573的锁存功能,使其LE端口接单片机。
利用单片机编程控制锁存数据的输入延迟时间,以此来达到控制LED灯亮与灭和七段数码管显示数值的稳定。
使得LED灯和七段数码管不会一直亮灭亮灭的闪。
其引脚:
a)当LE为高电平时,数据从Dn输入到锁存器;
b)当LE为低电平时,锁存器存储D输入上的信息一段就绪时间直到LE的下降沿来临。
c)当OE为低电平时,8个锁存器的内容可被正常输出;
d)当OE为高电平时,输出进入高阻态。
LED灯模块和七段数码管模块仿真图如下:
(LED灯显示模块)
(七段数码管显示模块)
(4)单片机最小化系统模块
最小系统是51单片机的最基本的组成部分,51单片机的引脚虽然只有四十,但它有很多的扩展功能,根据相应的课题设计要求可以设计相应的外围电路。
编写出相应的控制程序便可以跟外围电路很好的组合成功能复杂的系统。
其引脚:
a)18,19脚为单片机的晶振引脚;外接11.0592MHz的晶振,晶振外围还有2个22pF的起振电容,可以使单片机更好的起振。
b)9脚为单片机的复位引脚;当复位引脚出现连续两个机器周期的高点平时,单片机复位。
c)31引脚为/EA引脚;当/EA接高电平时读取内部储存数据,当内部存储器读取完成后,单片机自动读取外部存储器;当/EA接低电平是,单片机只读取外部存储器,
单片机仿真图如下:
(单片机最小系统模块)
2.2电路设计
该设计是将上述的六个模块拼接一起组成一个系统体系,以实现设计所需要的功能及光控路灯自动化控制系统。
单个模块其功能相对会比较简单、单一,但将一些模块合理的串接起来就可以实现复杂的功能。
当然也可以实现该设计所需的功能。
其连接方式:
1)光敏电阻通过感应外界的光线强度,将其转换成模拟信号,利用PCF8591的AIN0模拟信号输入端,将模拟数据输入到PCF8591。
2)PCF8591对数据进行ADC转换(模数转化)将模拟信号转换成数据信号。
并根据单片机对SCL(IIC总线时钟输入端)高低电平的控制,利用SDA(IIC总线数据输入输出端)将数据传输至IIC总线的缓存元件AT24C02使其行使EEPROM功能。
3)根据单片机传输给AT24C02的SCL(串行移位时钟控制端)端口的高低电平信号来执行数据的写入或者读出。
写入数据时,上升沿有效;读出数据时,下降沿有效。
利用AT24C02的SDA端来进行数据的双向串口通信。
4)AT24C02在SCL为下降沿的时候通过SDA端将缓存的数据传输给单片机。
5)74H573的LE端口接单片机的端口,利用单片机对LE的输入电平进行控制。
当LE为高电平时,数据从Dn输入到锁存器;当LE为低电平时,锁存器存储D输入上的信息一段就绪时间直到LE的下降沿来临。
实现对LED灯模块跟七段数码管显示模块的延时时间控制,防止一闪一闪的。
6)单片机通过处理数据,判断LED灯模块该亮还是该灭,并输出数据到LED灯模块和七段数码管模块所连接的74HC573的Dn端口。
7)单片机通过对SCL和LE端口电平的输入来控制各模块间数据的传输、接收。
其模块连接流程图:
电路总图如下:
2.3系统流程
其流程为:
光敏电阻读取外界光线的强度,通过ADC转换为数据编码传输给单片机,单片机接收、处理、输出数据使得七段数码管显示出数据(当前光敏电阻的阻值)。
执行中断,判断该光线的强度是否达到设定的要求(这里设定光敏电阻阻值大于、等于200时,LED灯亮;小于200时,LED灯灭),若达到则LED灯亮起;若达不到则LED灯灭掉。
其系统框图如下:
(系统框图)
三、系统的软件设计
启动该程序,接收光敏电阻传输进来的模拟数据,启动ADC转换程序将模拟数据转换成数字数据,并启动IIC总线控制程序将数据缓存到AT24C02中,利用单片机编程对数据进行处理和传输的控制,使得整个系统可以很好的相互协调运行。
以达到实现光控路灯自动化控制系统所需要的功能的实现。
对于IIC总线,、AD/DA转换程序主要利用的是对PCF8591和AT24C02的SDA、SCL端口的输入电平来实现程序的启动和关闭,以此达到控制数据的输出和输入的功能;通过对74HC573的LE端口电平的输入控制,来达到LED灯和七段数码管显示时间的延迟,防止其一闪一闪的。
3.1详细步骤
启动该程序,光敏电阻感应外界光线的强度并转换成模拟信号,经过PCF8591的AIN0数据输入端口输入到PCF8591里面,经过ADC转换成数据总线。
当SDA端口由从高到低一次跳变,IIC通信开始。
SDA将出具传输到AT24C02里面缓存起来。
当SDA由低到高的一次跳变,IIC通信结束。
将SDA接单片机的P3.2端口,SCL接单片机的P3.3端口。
利用单片机的编程控制P3.2和P3.3端口高低电平的输入就可以控制ADC转换的数据输出延迟时间和IIC总线缓存区的数据输入单片机中或者单片机反馈的数据输入到缓存区里面。
单片机的P0端口接的是74HC573,这是一个八路透明锁存器。
其端口LE接单片机的P1.0跟P1.1,利用单片机的编程来控制P1.0跟P1.1端口高低电平的输出,以控制74HC573的数据传输到LED灯跟七段数码管的延迟时间,防止LED灯和七段数码管的闪动。
当数据显示在数码管中后,中断程序启动,执行判断程序。
判断当百位〉=2的时候LED灯亮起来;判断〈2的时候LED灯就灭掉。
程序中还用到了数据的动态读取与发送程序,使得七段数码管的数值可以随着光敏电阻的感应数据一起不断的变化。
还有延迟函数,可以设定显示函数的延迟时间。
还有IIC总线的启动、结束程序。
还有数据的发送接收函数与显示函数。
3.2具体程序设计
见附录:
程序。
3.3系统软件执行流程
本系统的软件执行流程图如下:
四、结论与设计调试
4.1结论
随着社会的发展,路灯已经全球化。
几乎只要有人群的地方就会有路灯。
而用于控制路灯的自动化控制系统因为世界有这个需求,所以也出现了好多利用不同外部因素来实现路灯的自动化控制系统,用来控制路灯的自动亮起或者自动关闭。
当前大多数地方采用的都是定时的路灯自动化控制系统,晚上路灯一整夜都开启着,白天全天关闭着。
但因为夏天跟冬天因为天亮与天黑的时差颇大,使得夏天晚上过早的路灯就开启,早上又过晚的关闭。
且世界奇观这么多,偶尔总会出现点极端的天气状况,会造成白天天过黑、夜晚又如白昼般亮的情况(如日全食等),而路灯又不会自动开启或者关闭,使得一个路灯每年都得应为这个原因而白白浪费了多少能源。
而世界路灯总量又是多么的庞大,那每年世界在路灯这块的能源浪费上课想而知是一个多么庞大的天文数字啊。
光控路灯比时控路灯明显的先进实用、灵活性上更是远远的超越时控路灯。
未来必然会成为世界路灯自动化控制系统的主流。
本设计采用的是利用单片机进行的光控路灯自动化控制系统设计。
但本设计所利用的元器件等原材料并不属于极强耐用型,且设计不够完善,无法随需要而进行修改自己的所想要的光线强度设定其值,高于等于该值就亮;低于就灭。
因此此设计并不适合于现实中大规模的应用。
需要修改一下使用的元器件,改为使用寿命高的元器件进行设计,并添加设定极限值功能和防瞬间强光灯也会亮的防“虚强光”功能——添加个感应强光的设定时间值即可,强光保持一定时间灯才会灭;反之也一样,弱光保持一定时间灯才会亮。
利用修改后的系统就可以在现实中进行大规模的应用。
4.2课程设计过程中遇到的主要问题以及解决办法
由于要设计本课题所需要用到的知识有很多都是没有教过的,所有使用的一些元器件也是完全没接触过的型号。
在实验中遇到不少的问题:
1)要实现本课题所需要的内容需要用到好多脑子里几乎没半点概念的知识;
2)对于所需要使用到的模块不了解,如AD/DA转换、IIC总线等;
3)对于原理图多需要用到的芯片不会用,如PCF8591、AT24C02、光敏电阻等;
4)对于原理图跟程序之间,各模块如何连接使其成为一个系统不了解。
解决办法:
1)花了的一段时间自学那些没教过的知识,AD/DA转换、IIC总线的应用等,并知道要实现这些功能多需要用到的元器件。
2)花了几天时间全面地查询、了解所需要用到的元器件其原理及怎样应用。
3)又花了几天的时间将上面查询到的资料“消化”掉,以便开始课程设计的开始动工设计。
4)资料理解完之后,对于整个系统的构成已经有一个大体的理念了,可以开始动手设计了。
五、心得体会
这次设计的思想来源于平时的生活,在生活中路灯是随处可见的,有很多得地方的路灯是时控的,这种控制方法有一些缺点,比如冬夏天黑和天亮的时间是不同的,时控的话不能使路灯得到更充分的应用。
所以这次我们决定做一个光控的路灯。
经过这一次的电子创新设计,才发现到目前为止学到的东西太少了,应用在实际操作中真的感觉什么都不会。
让我了解到我的知识是那么的稀少、那么的浅薄。
电子元件的世界那么大,我现在所学的,连皮毛都还算不上。
需要多多的努力学习,想要基础的掌握更多的电子元件,光靠课堂的学习是不够的,课后仍需要自学许多的知识。
这次的电子创新设计让我看到了我自身在电子方面的学习上的不足点。
太多元器件不懂,各种软件也不会用,脑子里面压根就没有存储任何资料,对一些元器件不管是原理还是怎样应用都是一个致命的盲点。
让我知道了,
在学校里学的东西不去实践是更本没有学懂的,所以在学校剩下的这些时间里。
不管事情忙不忙都得抽时间出来自学各种各样的元器件其原理还有怎样应用。
不一定要全部精通,但至少也一定要略懂。
这样以后在设计其他东西的时候,脑子里面才可以本能的想想可能会用到什么元器件,并在次查看设计需求和元器件应用方式看是否真可以用得上。
这次的课程设计,让我更加熟悉了单片机需要用到的Proteus仿真软件、Keil程序编写软件的功能和使用方法;也让我学习到了好几种电子元器件的使用方法和原理。
收获颇丰。
我从这次的设计中感受到了坚持的重要性,做事不能轻言放弃,虽然过程不顺利,但只要我们坚持下来了,朝着自己最开始的目标前进,就一定会到达终点。
在这过程中的挫折实际是为成功的美景做铺垫,当我们完成设计后才发现过程中的挫折只是在考验我们对目标是否坚定。
在设计的过程中遇到许多的困难,很感谢帮助我们解答困惑的所有人。
当然这对提升我自己查找和运用资料的能力也起很好的推动作用,对不懂问题的解答思路能力也很有帮助。
电子创新设计,不仅让我们的知识掌握的更牢固,还让我意识到我们所学的知识可以跟现实生活紧密的联系起来。
这让我对自己的学习有了更多的信心,因为感觉我们来大学不是混日子的了,而是在学习真正对我们生活有用、有帮助的知识能力。
我会更加珍惜现在这有优越的学习环境,努力学习知识让自己在激烈的社会竞争中不被打倒。
参考资料:
[1]张义和等.例说51单片机(C语言版)(第3版).北京:
人民邮电出版社,2010.
[2]彭伟.单片机C语言程序设计实训100例——基于8051+Proteus仿真.北京:
电子工业出版社.,2009.
[3]李健,蒋全胜,任灵芝.智能路灯控制系统设计[J].工业控制计算机.2010年,第六期
[4]胡斌.元器件及实用电路[M].电子工业出版社,2007年7月
[5]冯育长等编著.单片机系统设计与实例分析[M].西安电子科技大学出版,2007
附录
Proteus仿真图:
(符合条件,LED灯亮起)
(未达到条件,LED灯灭)
源程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
unsignedchardispcount;
sbita=P1^0;//段控制
sbitb=P1^1;//位控制
sbitLeDen=P1^2;//LED灯控制端
sbitLine=P1^3;//点阵行控制端
sbitrst=P3^4;//DS1302复位端,低电平关闭
sbitSDA=P3^2;
sbitSCL=P3^3;
unsignedcharDuanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsignedcharWeima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchartempdata[8];
///////延时函数//////
voidDelay(uintz)//延时函数延时1ms
{
ucharx,y;
for(x=0;xfor(y=0;y<120;y++);
}
//////////启动总线////////
voidStart()
{
SDA=1;//时钟保持高,数据线从高到低一次跳变,I2C通信开始
SCL=1;
Delay(0);
SDA=0;
Delay(0);
SCL=0;
}
//////////结束总线///////////
voidStop()
{
SDA=0;//时钟保持高,数据线从低到高一次跳变,I2C通信停止
SCL=1;
Delay(0);
SDA=1;
Delay(0);
SCL=0;
}
//////非应答函数/////////
voidNoack()//函数功能:
从机发送非应答位子程序,迫使数据传输过程结束
{
SDA=1;
Delay(0);
SCL=1;
Delay(0);
SCL=0;
}
voidAck()//函数功能:
主机应答位检查子程序,迫使数据传输过程结束
{
SDA=0;
Delay(0);
SCL=1;
Delay(0);
SCL=0;
}
/////////数据发送函数//////
voidSend(ucharc)
{
ucharbite;
for(bite=0;bite<8;bite++)//向SDA上发送一位数据字节,共八位
{
if((c<elseSDA=0;//传送位0
SCL=1;
Delay(0);
SCL=0;
}
SDA=1;
Delay(0);
Delay(0);
Delay(0);
}
///////接收函数///////////
ucharRec()
{
ucharbyte,bite;
SDA=1;//从SDA线上读取上一数据字节,共八位
for(bite=0;bite<8;bite++)
{
SCL=0;
Delay(0);
SCL=1;
Delay(0);
byte<<=1;
if(SDA==1)byte+=1;//若接收到的位为1,则数据的最后一位置1
}
SCL=0;//结束接收
Delay(0);
return(byte);
}
//////////显示函数//////////////
voidDisplay(unsignedcharFirstBit,unsignedcharNum)
{
staticuchari=0;
P0=0x00;//数码管消隐
a=1;
P0=0x00;
Delay(0);
a=0;
P0=0x00;
b=1;
P0=Weima[i+FirstBit];
Delay(0);
b=0;
P0=0x00;
a=1;
P0=tempdata[i];
Delay(0);
a=0;
i++;
if(i==Num)//缓存数据
i=0;
}
///////////读取数值////////
ucharRead(ucharAI)
{
ucharz;
Start();
Send(0x90);
Ack();
Send(0x40|AI);//括号中的参数AI数值从0--3为四路AD的地址,通过改变该参数可以改变输入通道
Ack();
Start();
Send(0x91);
Ack();
z=Rec();
Noack();
Stop();
return(z);
}
////////主函数////////////
voidMain()
{
ucharnum=0;
TMOD|=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
EA=1;//总中断打开
ET0=1;//定时器中断打开
TR0=1;//定时器开关打开
rst=0;//关闭1302时钟
P0=0X00;//关闭点阵
Line=0;
P0=0XFF;//关闭LED灯
LeDen=0;
while
(1)
{
num=Read(0);//括号中的参数0--3为四路AD的地址,通过改变该参数可以改变输入通道
tempdata[0]=Duanma[num/1000];//千位
tempdata[1]=Duanma[num/100];//百位
tempdata[2]=Duanma[(num%100)/10];//十位
tempdata[3]=Duanma[(num%100)%10];//个位
Delay(50);
}
}
voidTimer0(void)interrupt1
{if(tempdata[1]>=Duanma[2])
{