模拟路灯控制系统.docx
《模拟路灯控制系统.docx》由会员分享,可在线阅读,更多相关《模拟路灯控制系统.docx(44页珍藏版)》请在冰豆网上搜索。
模拟路灯控制系统
Documentserialnumber【UU89WT-UU98YT-UU8CB-UUUT-UUT108】
衡阳市第四届大学生科技创新大赛
成果总结材料
项目名称面向节能的路灯控制系统研制
参赛学生蒋军王实铭敬文毅
指导教师李祖林王韧
参赛学校湖南工学院
申报时间2010-5-27
材料清单
一、研究报告
1.成果简介……………………………………………………………1
2.项目研究背景和意义………………………………………………1
3.研究计划……………………………………………………………2
4.研究内容……………………………………………………………4
5.成果创新点…………………………………………………………9
二、附件材料
附件一:
电路原理图……………………………………………………10
附件二:
实物图片………………………………………………………12
附件三:
程序清单………………………………………………………13
三、实物作品
衡阳市第四届大学生创新大赛相关项目的研究报告
项目名称:
面向节能的路灯控制系统研制
项目类型:
实用型
成果形式:
1、研究报告;2、实用作品
参赛学生:
蒋军王实铭敬文毅
指导教师:
李祖林王韧
一、成果简介
本系统是基于单片机控制的路灯模拟控制系统,以单片机AT89S52为主控制器,对路面交通情况、外界环境亮度对交通灯的影响和故障等信息进行采集,实现对路灯的智能化节能控制。
该系统以1W高亮度LED灯作为模拟路灯,制作了LED灯恒流驱动电源,电流调节范围在0-1A内可调。
通过红外式反射光电传感器检测路面交通情况,控制LED路灯亮、灭。
通过光敏三极管对环境变化及路灯故障等信号进行检测,实现了路灯亮、灭控制和路灯故障报警。
LED灯能在规定时间实现自动减小亮度,并能在规定范围内设定调节,调节误差小于2%。
该系统节能,性价比高,具有应用价值。
二、项目研究背景和意义
节能是二十一世纪的热门主题,面对全球能源危机,全世界都以节能为方向进行各方面的研究。
LED就是节能的一个研究方向,高亮度LED以其低热损耗,高流明而迅速取代传统照明工具。
系统以高亮度LED灯作为模拟路灯,可以实现路灯的节能控制。
系统附带了周围环境检测功能,可以根据周围环境亮度开启和关闭路灯。
系统还可以根据路面交通情况,控制路灯的调光功能,实现真正意义的节能环保。
综合以上功能,该模拟路灯控制系统有很好的应用价值和研究意义。
三、研究计划
项目确定前期,我们为了更快更好的完成研究设计,做了如下计划:
2009年5月---2009年8月:
进行相关调研。
2009年9月:
组内三人讨论确定总体方案。
2009年9月---2009年10月:
分工协作完成项目的软、硬件设计。
2009年10月---2009年11月:
完成实际系统的制作、调试及测试。
2009年12月---2010年3:
完成项目的总结。
四、研究内容
1、方案的提出
方案描述
针对题目的功能和指标进行分析,基于AT89S52单片机为模拟路灯支路控制器,通过光电传感器对路灯信号的检测,控制二路恒流源驱动LED路灯。
系统整体设计原理框图如图1所示:
方案论证与比较
(1)系统控制方案选择
方案一:
选用数字电路进行控制,但整个系统电路制作复杂,实现题目发挥部分的指标有困难。
方案二:
选用AT89S52单片机为控制器,易于编程控制,外围控制资源丰富,整个控制系统操作更加灵活,电路制作简单、方便、性价比高。
因此,我们选择方案二。
(2)路灯信号检测
选用金属传感器,该传感器精度高,反应灵敏,但是金属传感器价格较高。
选用红外反射式光电传感器和光敏三极管,该传感器反应灵敏且价格便宜,外围检测电路简单。
考虑到系统检测电路和性价比,我们选择方案二。
(3)LED灯恒流驱动电源
题目要求用恒流源驱动1WLED灯,并具有调光功能,驱动电源输出功率能在规定时间内按设定要求自动减小,该功率要求能在20%~100%范围内设定并调节,调节误差≤2%,方案比较如下。
选用模拟电路中所学的比例电流源,电路虽然简单,但该方案为电流-电流转换,且输出电流小,不能驱动1WLED灯。
采用开关电路实现恒流源,通过控制PWM信号占空比,并将该信号作为驱动电路的控制信号,实现MOS驱动电路的导通时间,实现电压-电流转换,电源效率高,控制方便,但是电源纹波较多,制作困难。
方案三:
线性数控电流源,用单片机控制DAC0832的输出,通过集成运放控制MOSFET管,实现电压-电流的线性转换,电路制作简单,性价比高。
因此,我们选择方案三。
2、理论分析与设计
单元电路设计
(1)单片机最小系统
支路控制器控制芯片选用AT89S52,以DS1302作为时钟芯片,采用8255作并口扩展,以24c04作为掉电保护,外接矩阵式键盘和液晶显示器和二路DAC0832电路。
(2)路灯信号检测电路
该装置选用红外式反射光电传感器,当小车经过传感器位置时,小车上的铝箔将红外线反射回去,红外接收管接收到信号输出到比较器整形送给单片机,让单片机对路灯进行控制。
其原理图如图2所示:
图2信号检测电路
(3)环境变化检测和故障检测
环境变化和故障检测选用光敏三极管,当环境亮度达到光敏三极管的导通阈值时,光敏三极管导通,信号送给单片机,单片机实现对路灯的控制和发出声光报警。
其原理图如图3所示:
图3光敏三极管检测电路
(4)LED恒流驱动电源
该恒流驱动电源是通过单片机控制DAC0832的输出电压,经运放控制MOS管的导通,MOSFET的源极经1Ω采样电阻接地,对恒流源输出电流进行控制,实现了输出电流的线性数控。
其原理图如图4所示,假设DAC0832输出至运放OP07同相端的输入为
,由运放虚短可知,MOSFET的源极电压
为
则恒流源输出电流
通过单片机控制输入电压
,可线性控制恒流源的输出电流
。
图4LED恒流驱动电源
系统软件设计
3、系统测试及分析
系统测试
测试仪器:
数字示波器RIGOLDS5022/25Mhz
直流稳压电源1731B
指针式毫安表精度级
数字万用表DT-890
秒表卷尺
功能测试:
将系统各个单元模块组装好,用小车对系统进行模拟,依次测试如下功能:
时钟功能、能设定、显示开关灯时间,控制整条支路按时开灯和关灯、故障检测及报警功能,实现了题目给定的基本要求和发挥部分。
指标测试:
LED恒流驱动电源输出功率的设定与调节测量结果如表1-1所示:
表1-1LED驱动电源输出功率的设定与调节测量结果
预置功率(W)
LED电压(V)
LED电流(mA)
LED功率(W)
误差
66
1%
130
192
244
299
结果分析
经系统调试及测量,我们得出该系统能够满足以下要求:
(1)时钟功能、能设定、显示开关灯时间,控制整条支路按时开灯和关灯;
(2)根据环境明暗自动开关灯;
(3)根据交通状况自动调节亮灯状态;
(4)独立控制每只路灯的开关灯时间;
(5)故障地址检测及报警功能;
(6)单元控制器具有调光功能;
(7)路灯驱动电源输出功率能在规定时间按设定要求自动减小;
(8)功率能在20%~100%范围内设定并调节,调节误差为1%。
五、成果创新点
1.节能环保。
本项目使用高亮度LED为交通灯,具有低热损耗,高流明等特点,系统可以根据路面交通情况实现交通灯的开启和关闭,并根据实际情况调节路灯的亮度,实现节能环保。
2.智能化控制。
路灯可以根据周围环境的变化为参考,实现自动开启和关闭,自动检测路面交通情况,控制LED路灯亮、灭。
3.实用性。
项目经过进一步的开发,具有很好的实用价值和工程应用价值。
附录一系统电路原理图
1.单片机系统原理图
2.传感器及LED驱动电路原理图
附录二程序清单
7f7f7f7f0832A24C3a24C2c24C2c24C24C0832A0832A0832A0832A0832A0832A0832A0832A0832A0c}
if(y==3||y==4)//第三第四行
{
basex=0x88;//下半屏
y=(y-3)*16;//垂直位址都是从0X80开始的,不管上下半屏。
}
for(i=0;i{write_command(0x80+y+i);//写入垂直位址。write_command(basex+x-1);//再写入水平位址(上半屏第一字为0X80,……第七字为0X8//下半屏第一字为0X88,……第七字为0Xfor(j=0;j<2;j++)//再写入两个8位元的数据,AC会自动增一,接着写数据write_data(color);}write_command(0x36);//写完数据,开图片显示}/*****************汉字显示函数******************/voiddisplayhz(ucharm,ucharn,uchar*p){//m表示行n表示列都为首地址switch(m){case1:write_command(0x7f+n);break;//液晶第一行case2:write_command(0x8f+n);break;//0x90+(x-1)case3:write_command(0x87+n);break;case4:write_command(0x97+n);break;default:break;}while(*p)write_data(*p++);}/////////////////////////////////////////////////////////////////////*****************以下是键扫程序******************///////////////////////////////////////////////////////////////////////////////////////////////*键扫描函数*/////////////////////////ucharkey_scan(void){ucharscancode,tmpcode;PC8255=0xf0;//在列行没有接高电平发全0列扫描码if((PC8255&0xf0)!=0xf0)//若哪行有0代表有键按下{delay_ms(10);//延时去抖动if((PC8255&0xf0)!=0xf0)//延时后再判断一次,去除抖动影响{scancode=0xfe;//从第一列开始发0while((scancode&0x10)!=0)//逐行扫描{PC8255=scancode;//输出列扫描码if((PC8255&0xf0)!=0xf0)//本行有键按下{tmpcode=(PC8255&0xf0)|0x0f;//*返回特征字节码,为1的位即对应于行和列*/return((~scancode)+(~tmpcode));}elsescancode=(scancode<<1)|0x01;//行扫描码左移一位}}}return(0);//无键按下,返回值为原来key值(这是松开键让它一直执行子程序),如返回值为0(是按一下才执行键功能程序,松开就不执行);}/////////////////////////////////////////////////////////////////////*****************以下是延时程序******************///////////////////////////////////////////////////////////////////////////////////////////////*延时子程序*///////////////////////////voiddelay(ucharus){while(us--);}////////////////////////*延时子程延时1ms*/////////////////////////voiddelay_ms(unsignedinti){unsignedintj;for(;i>0;i--){for(j=0;j<125;j++){;}}}/////////////////////////////////////////////////////////////////////*****************以下是1302程序******************////////////////////////////////////////////////////////////////////////////////////*****从1302读取一个字节*****///////////////ucharread_1302(void)//从1302中读取一个字节{uchari,data_1302;for(i=0;i<8;i++){data_1302>>=1;if(DS1302_IO){data_1302|=0x80;}DS1302_CLK=1;DS1302_CLK=0;}return(data_1302);}///////////******向1302写入1个字节******////////////voidwrite_1302(uchardata_1302)//向1302中写入一个字节{uchari;for(i=0;i<8;i++){DS1302_IO=(bit)(data_1302&0x01);DS1302_CLK=1;DS1302_CLK=0;data_1302>>=1;}}//////////******向1302的某一地址中写入一个字节的数据******//////////voidwrite_all_1302(ucharaddr,uchardata_1302){DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;write_1302(addr);//先写地址write_1302(data_1302);//再写数据DS1302_CLK=1;DS1302_RST=0;}////////////*******从1302的某一地址中读取一个字节的数据******//////////ucharread_all_1302(ucharaddr){uchardata_1302;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;write_1302(addr|0x01);data_1302=read_1302();DS1302_CLK=1;DS1302_RST=0;return(data_1302);}////////////*****对1302写入初始化时间程序*****///////////////*voidwrite_1302time(void)//向1302写入初始时间 包括对1302的初始化{write_all_1302(0x8e,0x00);//关闭写保护write_all_1302(0x80,0x80);//停止秒的走动write_all_1302(0x8c,time[1]);//年write_all_1302(0x8a,time[0]);//周write_all_1302(0x88,time[2]);//月write_all_1302(0x86,time[3]);//日write_all_1302(0x84,time[4]);//时write_all_1302(0x82,time[5]);//分write_all_1302(0x80,time[6]);//秒write_all_1302(0x8e,0x80);//打开写保护write_all_1302(0x80,0x00);//开启秒的走动 开始计时}////////////*****对1302写入初始化时间程序*****///////////////*voidwrite_1302time_1(void)//向1302写入初始时间 包括对1302的初始化{write_all_1302(0x8e,0x00);//关闭写保护write_all_1302(0x80,0x80);//停止秒的走动write_all_1302(0x8c,time[1]);//年write_all_1302(0x8a,time[0]);//周write_all_1302(0x88,time[2]);//月write_all_1302(0x86,time[3]);//日write_all_1302(0x80,time[6]);//秒write_all_1302(0x8e,0x80);//打开写保护write_all_1302(0x80,0x00);//开启秒的走动 开始计时}////////////*****对1302写入初始化时间程序*****//////////////voidwrite_1302time_2(void)//向1302写入初始时间 包括对1302的初始化{write_all_1302(0x8e,0x00);//关闭写保护write_all_1302(0x80,0x80);//停止秒的走动write_all_1302(0x84,time[4]);//时write_all_1302(0x82,time[5]);//分write_all_1302(0x80,time[6]);//秒write_all_1302(0x8e,0x80);//打开写保护write_all_1302(0x80,0x00);//开启秒的走动 开始计时}///////////////////////***读1302的时间****//////////////////////////voidread_1302time(void)//读1302的时间 读出的是BCD码{y=read_all_1302(0x8d);//年w=read_all_1302(0x8b);//周mon=read_all_1302(0x89);//月d=read_all_1302(0x87);//日h=read_all_1302(0x85);//时m=read_all_1302(0x83);//分s=read_all_1302(0x81);//秒second=s/16*10+s%16;//秒的转换 为十进制minute=m/16*10+m%16;//分的转换hour=h/16*10+h%16;//时的转化week=w/16*10+w%16;//周de转化day=d/16*10+d%16;//日的转换month=mon/16*10+mon%16;//月的转换year=y/16*10+y%16;//年的转换}////////////////******显示1302时间******///////////////////voiddisplay1(void)//第一路显示程序 {read_1302time();if(disbuffer[11]!=year/10||disbuffer[10]!=year%10){write_command(0x90);//首地址write_data(0x32);write_data(0x30);disbuffer[11]=year/10;disbuffer[10]=year%10;write_data(dispcode[disbuffer[11]]);//年write_data(dispcode[disbuffer[10]]);displayhz(2,3,"年");}if(disbuffer[9]!=month/10||disbuffer[8]!=month%10){write_command(0x93);//首地址disbuffer[8]=month%10;disbuffer[9]=month/10;write_data(dispcode[disbuffer[9]]);//月write_data(dispcode[disbuffer[8]]);displayhz(2,5,"月");}if(disbuffer[7]!=day/10||disbuffer[6]!=day%10){write_command(0x95);//首地址disbuffer[6]=day%10;disbuffer[7]=day/10;write_data(dispcode[disbuffer[7]]);//日write_data(dispcode[disbuffer[6]]);displayhz(2,7,"日");}}voiddisplay2(void){read_1302time();if(disbuffer[5]!=hour/10||disbuffer[4]!=hour%10){write_command(0x89);disbuffer[4]=hour%10;disbuffer[5]=hour/10;write_data(dispcode[disbuffer[5]]);//时write_data(dispcode[disbuffer[4]]);displayhz(3,3,"时");}if(dis
write_command(0x80+y+i);//写入垂直位址。
write_command(basex+x-1);//再写入水平位址(上半屏第一字为0X80,……第七字为0X8
//下半屏第一字为0X88,……第七字为0X
for(j=0;j<2;j++)//再写入两个8位元的数据,AC会自动增一,接着写数据
write_data(color);
write_command(0x36);//写完数据,开图片显示
/*****************汉字显示函数******************/
voiddisplayhz(ucharm,ucharn,uchar*p)
{//m表示行n表示列都为首地址
switch(m)
case1:
write_command(0x7f+n);break;//液晶第一行
case2:
write_command(0x8f+n);break;//0x90+(x-1)
case3:
write_command(0x87+n);break;
case4:
write_command(0x97+n);break;
default:
break;
while(*p)
write_data(*p++);
///////////////////////////////////////////////////////////////
//////*****************以下是键扫程序******************////////
////////////////////////*键扫描函数*/////////////////////////
ucharkey_scan(void)
ucharscancode,tmpcode;
PC8255=0xf0;//在列行没有接高电平发全0列扫描码
if((PC8255&0xf0)!
=0xf0)//若哪行有0代表有键按下
delay_ms(10);//延时去抖动
=0xf0)//延时后再判断一次,去除抖动影响
scancode=0xfe;//从第一列开始发0
while((scancode&0x10)!
=0)//逐行扫描
PC8255=scancode;//输出列扫描码
=0xf0)//本行有键按下
tmpcode=(PC8255&0xf0)|0x0f;//*返回特征字节码,为1的位即对应于行和列*/
return((~scancode)+(~tmpcode));
elsescancode=(scancode<<1)|0x01;//行扫描码左移一位
return(0);//无键按下,返回值为原来key值(这是松开键让它一直执行子程序),如返回值为0(是按一下才执行键功能程序,松开就不执行);
//////*****************以下是延时程序******************////////
////////////////////////*延时子程序*///////////////////////////
voiddelay(ucharus)
while(us--);
////////////////////////*延时子程延时1ms*/////////////////////////
voiddelay_ms(unsignedinti)
unsignedintj;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}
//////*****************以下是1302程序******************////////
/////////////*****从1302读取一个字节*****///////////////
ucharread_1302(void)//从1302中读取一个字节
uchari,data_1302;
for(i=0;i<8;i++)
data_1302>>=1;
if(DS1302_IO)
data_1302|=0x80;
DS1302_CLK=1;
DS1302_CLK=0;
return(data_1302);
///////////******向1302写入1个字节******////////////
voidwrite_1302(uchardata_1302)//向1302中写入一个字节
uchari;
DS1302_IO=(bit)(data_1302&0x01);
//////////******向1302的某一地址中写入一个字节的数据******//////////
voidwrite_all_1302(ucharaddr,uchardata_1302)
DS1302_RST=0;
DS1302_RST=1;
write_1302(addr);//先写地址
write_1302(data_1302);//再写数据
////////////*******从1302的某一地址中读取一个字节的数据******//////////
ucharread_all_1302(ucharaddr)
uchardata_1302;
write_1302(addr|0x01);
data_1302=read_1302();
////////////*****对1302写入初始化时间程序*****//////////////
/*
voidwrite_1302time(void)//向1302写入初始时间 包括对1302的初始化
write_all_1302(0x8e,0x00);//关闭写保护
write_all_1302(0x80,0x80);//停止秒的走动
write_all_1302(0x8c,time[1]);//年
write_all_1302(0x8a,time[0]);//周
write_all_1302(0x88,time[2]);//月
write_all_1302(0x86,time[3]);//日
write_all_1302(0x84,time[4]);//时
write_all_1302(0x82,time[5]);//分
write_all_1302(0x80,time[6]);//秒
write_all_1302(0x8e,0x80);//打开写保护
write_all_1302(0x80,0x00);//开启秒的走动 开始计时
voidwrite_1302time_1(void)//向1302写入初始时间 包括对1302的初始化
voidwrite_1302time_2(void)//向1302写入初始时间 包括对1302的初始化
///////////////////////***读1302的时间****//////////////////////////
voidread_1302time(void)//读1302的时间 读出的是BCD码
y=read_all_1302(0x8d);//年
w=read_all_1302(0x8b);//周
mon=read_all_1302(0x89);//月
d=read_all_1302(0x87);//日
h=read_all_1302(0x85);//时
m=read_all_1302(0x83);//分
s=read_all_1302(0x81);//秒
second=s/16*10+s%16;//秒的转换 为十进制
minute=m/16*10+m%16;//分的转换
hour=h/16*10+h%16;//时的转化
week=w/16*10+w%16;//周de转化
day=d/16*10+d%16;//日的转换
month=mon/16*10+mon%16;//月的转换
year=y/16*10+y%16;//年的转换
////////////////******显示1302时间******///////////////////
voiddisplay1(void)//第一路显示程序
read_1302time();
if(disbuffer[11]!
=year/10||disbuffer[10]!
=year%10)
write_command(0x90);//首地址
write_data(0x32);
write_data(0x30);
disbuffer[11]=year/10;
disbuffer[10]=year%10;
write_data(dispcode[disbuffer[11]]);//年
write_data(dispcode[disbuffer[10]]);
displayhz(2,3,"年");
if(disbuffer[9]!
=month/10||disbuffer[8]!
=month%10)
write_command(0x93);//首地址
disbuffer[8]=month%10;
disbuffer[9]=month/10;
write_data(dispcode[disbuffer[9]]);//月
write_data(dispcode[disbuffer[8]]);
displayhz(2,5,"月");
if(disbuffer[7]!
=day/10||disbuffer[6]!
=day%10)
write_command(0x95);//首地址
disbuffer[6]=day%10;
disbuffer[7]=day/10;
write_data(dispcode[disbuffer[7]]);//日
write_data(dispcode[disbuffer[6]]);
displayhz(2,7,"日");
voiddisplay2(void)
if(disbuffer[5]!
=hour/10||disbuffer[4]!
=hour%10)
write_command(0x89);
disbuffer[4]=hour%10;
disbuffer[5]=hour/10;
write_data(dispcode[disbuffer[5]]);//时
write_data(dispcode[disbuffer[4]]);
displayhz(3,3,"时");
if(dis
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1