单片机模拟路灯控制系统.docx
《单片机模拟路灯控制系统.docx》由会员分享,可在线阅读,更多相关《单片机模拟路灯控制系统.docx(34页珍藏版)》请在冰豆网上搜索。
![单片机模拟路灯控制系统.docx](https://file1.bdocx.com/fileroot1/2023-1/23/990a61ef-24b8-4a2a-8eca-93f5f231fb51/990a61ef-24b8-4a2a-8eca-93f5f231fb511.gif)
单片机模拟路灯控制系统
基于STC芯片的模拟路灯控制系统
摘要:
本文介绍了一个模拟路灯控制系统的解决方案。
本方案以宏晶公司的MCU芯片STC12C5410AD为核心,加以简单的外围电路,实现了模拟路灯控制系统所要求的全部技术内容。
STC单片机在最近几年应用越来越广泛,其可靠性、抗干扰能力和温度稳定性强,性价比高。
这是一个低成本的路灯控制解决方案,除了选用廉价的单片机芯片,还采用了廉价的红外对射传感器,大大降低了系统成本。
整个系统的电路简单,结构紧凑,经过多次测试,证实该系统能长时间稳定工作,满足设计指标要求。
关键词:
模拟控制、LED照明、单片机
Abstract
Thispaperpresentsasimulationofthecontrolsystemofstreetsolution.ThisplantomacrocrystalcompanyMCU,STC12C5410ADasthecore,tochiptheperipheryofthesimplecircuit,realizethesimulationstreetlampcontrolsystemalloftherequestedtechnologycontent.STCSCMinrecentyearsmoreandmorewideapplication,thereliabilityandanti-interferenceabilityandtemperaturestabilitystrong,cost-effective.Thisisalowcostcontrolsolutions,inadditiontostreetchoosecheapsingle-chipmicrocomputerchip,alsoadoptedthecheapinfraredDuiShesensor,andgreatlyreducethecostofsystem.Thewholesystemofthecircuitissimple,compactstructure.AfterDuoCitest,andconfirmthatthesystemcanworkstablyforalongtime,meetthedesignrequirementindex.
Keywords:
simulationcontrol,LEDlightingandsingle-chipmicrocomputer
目录
基于STC芯片的模拟路灯控制系统1
1.系统设计3
1.1设计要求3
1.2总体设计方案4
1.2.1功能分解及设计思路4
1.2.2方案论证与比较4
1.2.3系统各模块的最终方案7
1.3系统功能说明书(用户使用说明书)7
1.3.1路灯的工作模式7
1.3.2按键操作说明8
2.单元电路设计9
2.1每部分模块的电路设计9
2.1.1电源供电电路9
2.1.2单片机最小系统9
2.1.3输入与输出9
2.1.4电流源驱动及电流检测10
2.1.5光电检测电路11
3.软件设计12
3.1-----子程序12
3.2----系统主程序流程图13
3.2.1系统流程图13
3.2.2定时器溢出中断处理函数流程图14
3.2.3按键扫描流程图15
4.系统测试16
4.1测试仪器16
4.2指标测试16
4.2.1各部分测试的指标16
4.2.2系统实现的功能16
5.结论19
附录21
附录1程序代码21
附录2硬件原理图63
附录3PCB图(部分)65
1.系统设计
1.1设计要求
一、任务(来自原题)
设计并制作一套模拟路灯控制系统。
控制系统结构如图1所示,路灯布置如图2所示。
图1路灯控制系统示意图
图2路灯布置示意图(单位:
cm)
二、设计要求
1.基本要求
(1)支路控制器有时钟功能,能设定、显示开关灯时间,并控制整条支路按时开灯和关灯。
(2)支路控制器应能根据环境明暗变化,自动开灯和关灯。
(3)支路控制器应能根据交通情况自动调节亮灯状态:
当可移动物体M(在物体前端标出定位点,由定位点确定物体位置)由左至右到达S点时(见图2),灯1亮;当物体M到达B点时,灯1灭,灯2亮;若物体M由右至左移动时,则亮灯次序与上相反。
(4)支路控制器能分别独立控制每只路灯的开灯和关灯时间。
(5)当路灯出现故障时(灯不亮),支路控制器应发出声光报警信号,并显示有故障路灯的地址编号。
2.发挥部分
(1)自制单元控制器中的LED灯恒流驱动电源。
(2)单元控制器具有调光功能,路灯驱动电源输出功率能在规定时间按设定要求自动减小,该功率应能在20%~100%范围内设定并调节,调节误差≤2%。
(3)性价比高,工作稳定,符合电磁兼容(EMC)方面的要求,无对外干扰或干扰小。
1.2总体设计方案
1.2.1功能分解及设计思路
本模拟路灯控制系统的设计方案要实现的主要功能主要分解为以下五个方面:
一是时钟功能及定时开关灯。
二是根据环境明暗变化,自动开灯和关灯。
三是根据交通情况自动调节亮灯状态:
当汽车靠近路灯时,路灯能自动点亮;当汽车远离时,路灯自动熄灭。
四声光报警功能,当路灯出现故障时而不亮时,控制器发出信号,并显示有故障路灯的地址编号。
五是根据绿色节能照明要求,采用恒流源驱动LED路灯发亮且能调光,路灯驱动电源输出功率能在20%~100%范围内设定并调节,调节误差≤2%。
以上功能的实现,都是以单片机为核心,在单片机系统实现的输入输出和显示功能的基础上,由单片机的内置逻辑和运算功能,加上一定的外围电路得以实现。
针对以上的五个功能,采用模块化的设计思想,以下分别叙述之。
1.2.2方案论证与比较
1.2.2.1时钟功能及定时开关机。
方案一:
采用专用时钟芯片。
现在流行的串行时钟电路很多,如DS1302、DS1307、PCF8485等。
其优势是可以单独使用,直接连接到单片机外围,有自己独立的时钟晶振,精度较高。
单片机通过串行接口读取和写入当前的时钟值,时钟芯片的运行受单片机死机的影响少。
其缺点一是消耗了单片机IO口资源。
二是在编程时需要增加读写串行口的内容,消耗了单片机的运行时间。
三是增加了成本。
增加了时钟芯片及其外围电路的开支。
DS1302的典型应用电路如图3所示:
图3DS1302的典型应用电路
方案二:
采用单片机内置时钟振荡电路及定时器构建时间平台。
本方案直接利用单片机的内置定时器,通过定时器的中断和简单运算实现时钟功能。
例如:
STC单片机,在4M时钟时,单个指令的运行时间是1微秒,设置定时器1每125个指令周期产生一个中断,即125微秒,8个中断后,时间平台是1毫秒,设置以下时间计数变量分别为:
ucharTo1mS=0x00;//当该变量增加到某个数值时,表示经过了1毫秒
ucharTo2mS=0x00;//当该变量增加到某个数值时,表示经过了2毫秒
ucharIs2mS=0;//到达2毫秒时刻
ucharTo20mS=0x00;//当该变量增加到某个数值时,表示经过了20毫秒
ucharIs20mS=0;//到达20毫秒时刻
ucharTo1S=0x00;//当该变量增加到某个数值时,表示经过了1秒
ucharIs1S=0;//到达1秒时刻
在秒时间平台,用ToMIN变量,计数60秒后进入分钟平台,计数60分钟后,进入小时平台。
方案二没有增加外置电路,充分利用了单片机的定时器功能,实施简洁方便,主要的缺点是当控制系统断电或死机以后,需要人工重新定时。
本系统的时钟功能实现采用方案二。
1.2.2.2根据环境明暗变化,自动开灯和关灯功能。
方案一:
采用比较器的解决方案。
光敏电阻与固定电阻串联,加一级电压跟随器后输入比较器,与比较器负输入端的电压值进行比较,得到一个高电平或低电平输出,进入单片机的IO口。
优点是电路比较直观,操作比较方便,可直接通过电位器调节路灯的开启亮度。
对维护人员的要求不高。
缺点是不方便进行数码控制。
方案二:
采用AD变换。
光敏电阻与固定电阻串联,由单片机内置的AD变换接口读入当前的电压值,然后根据读取的电压值判断当前的环境亮度。
路灯的开启电平由内部的变量控制。
方案二的优点在于可以方便以实现对路灯开启电平的数码控制和远程控制。
本系统采用方案二。
1.2.2.3根据交通情况自动调节亮灯状态。
当汽车靠近路灯时,路灯能自动点亮;当汽车远离时,路灯自动熄灭。
方案一:
采用工业级的光电传感器。
这种光电传感器普遍运用于电梯、生产线等工业场所。
优点是使用方便,型号很多,输出量是开关量,不需调理电路。
缺点是价格较贵。
方案二:
采用廉价的红外对射传感器。
红外对射的特点是传输距离较远,能量集中。
当没有物体遮挡时,红外光直射到红外探头上,红外接收管连续输出低电平到单片机,当有物体经过时,红外光被遮住,此时红外探头输出高电平到单片机。
由于红外光的发射有一定的偏角,本设计利用了黑色套管遮挡红外发射灯头,以减少红外光的散失。
本系统采用方案二。
1.2.2.4故障报警功能
采用光敏电阻检测路灯的亮度,同时排除环境光的干扰。
利用单片机的AD口,读入光敏电阻上检测到的路灯亮度值。
1.2.2.5恒流源驱动LED及20%到100%范围内可调亮度。
方案一:
采用恒流源驱动芯片,目前市场上成品的恒流源驱动芯片比较多,一般采用使用取样电阻调节输出电流的方式。
这些芯片使用方便,性能较好,但价格较贵。
方案二:
采用PWM方式驱动功率三极管输出驱动电流,用电流取样电阻串入LED供电回路,用AD口读取当前的电流值,实现闭环控制。
方案二利用了单片机的AD变换资源,同时采用PWM方式,可以使LED工作在断断续续的状态,可以延长LED的使用寿命。
本系统采用方案二。
1.2.3系统各模块的最终方案
1.3系统功能说明书(用户使用说明书)
1.3.1路灯的工作模式
本模拟路灯控制系统具备5种工作模式,分别是自动群控模式、自动分控模式、根据照度自动控制模式、根据交通情况自动控制模式、手动控制模式,下面对每种工作模式简单介绍如下:
(1)自动群控模式
在该模式下,支路控制器根据设定好的定时信息,自动地同时打开或者关闭两盏路灯。
系统启动后默认进入该模式。
(2)自动分控模式
在该模式下,支路控制器根据设定好的定时信息,分别控制两盏路灯的开关,例如,当系统的时间和路灯1开灯的时间相等时,开启路灯1;当系统的时间和路灯2关灯的时间相等时开启路灯2。
(3)根据照度自动控制模式
在该模式下,当环境照度低于一定的值时开启两盏路灯,当环境照度高于一定的值时关闭两盏路灯。
(4)根据交通情况自动控制模式
在该模式下,当可移动物体M由左到右到达S点时(见图××),灯1亮;当物体M到达B点时,灯1灭,灯2亮;若物体M由右到左移动时,则亮灯的次序与上相反。
(5)手动控制模式
在手动模式时,两盏路灯只能由支路控制器用增加和减少键手动的调整亮度,路灯的亮度可以在0%~100%自由的上下调整,步进为10%。
(1)~(4)等四种工作模式是互斥的,即在某一时刻只能具有其中的一种功能,不过各种模式可以手动的切换,手动调整路灯亮度的功能在这四种模式中都是有效的。
另外,该路灯控制系统还具备故障检测功能,当路灯出现无法正常工作的状况时,该控制系统能够判定是哪一环节出现问题,并将故障通过声音警报及数码管显示告知用户。
1.3.2按键操作说明
⏹支路控制器具备5个按键,分别为时间调整键、模式选择键、增加键、减少键、确认键。
⏹时间调整键:
按时间调整键时,可以循环地选择系统时间、路灯1和2共同的开关灯时间、路灯1的开关灯时间和路灯2的开关灯时间。
⏹模式选择键:
按模式选择键可以进行系统工作模式的切换,顺序为自动群控模式自动分控模式根据照度自动控制模式根据交通情况自动控制模式手动控制模式。
⏹
⏹增加、减少键:
按这两个键可以对时间或者亮度进行增减,长按时时间或者亮度可以连续变换。
●确认键:
确认键只在时间调整时有效,分别确认小时、分钟、秒的输入。
2.单元电路设计
2.1每部分模块的电路设计
2.1.1电源供电电路
采用变压器与三端稳压器相结合
2.1.2单片机最小系统
其核心芯片是STC12C5404AD。
2.1.3输入与输出
键盘:
采用AD变换输入口为键盘输入口,节省了IO口资源。
LED显示:
2.1.4电流源驱动
3.软件设计
软件采用C语言编写,可移植性和可读性强。
软件编写体现了模块化的任务驱动方式。
代码尽量符合变量定义规范。
3.1-----子程序
本系统包含以下子程序
//键盘处理------------------------------
voidKeyboardScan(void);//键盘扫描函数
voidKeyboardOperate(ucharKeyNum);//按键处理函数
//定时器处理------------------------------
voidInitTimer(void);//定时器参数设定及启动
//路灯控制------------------------------
voidBrightnessSet(ucharLightNum,ucharBrightness);//亮度调整
//AD采样------------------------------
voidADExchange(ucharNum);//AD采样
/**************************************************************
*亮度调整函数*
**************************************************************/
voidBrightnessSet(ucharLightNum,ucharBrightness);
/**************************************************************
*溢出中断处理程序*
**************************************************************/
voidinterrupt6TimerInterrupt(void);
3.2----系统主程序流程图
3.2.1系统流程图
3.2.2定时器溢出中断处理函数流程图
3.2.3按键扫描流程图
4.系统测试
4.1测试仪器
流明计
数字示波器
功率计
万用表
直流电源等
4.2指标测试
4.2.1各部分测试的指标
功率测试
设置功率/W
路灯两端电压/V
路灯电流/A
实际功率/W
误差/%
0.2
5.58
0.036
0.201
0.4
0.3
5.71
0.053
0.303
0.9
0.4
5.81
0.068
0.395
1.2
0.5
5.91
0.084
0.496
0.7
0.6
6.02
0.101
0.608
1.3
0.7
6.06
0.115
0.697
0.4
0.8
6.09
0.132
0.804
0.5
0.9
6.12
0.147
0.900
0.0
1
6.17
0.163
1.006
0.6
功能测试
序号
指标(目标值)
实测值
1
故障指示(编号)
LCD上显示正确
2
过中点后前灯亮后灯灭,试验成功率(100%)
100%
3
自动开关灯功能,试验成功率
100%
4
实时误差,采用时间加速方法(误差小于5MIN)
误差<1MIN
5
单元控制器具有调光功能,路灯驱动电源输出功率能在规定时间按设定要求自动减小,该功率应能在20%~100%范围内设定并调节,调节误差≤2%。
电流从0mA至850mAm变化平缓稳定
4.2.2系统实现的功能
1.基本要求
序号
功能
是否实现
1
支路控制器有时钟功能,能设定、显示开关灯时间,并控制整条支路按时开灯和关灯。
是
2
支路控制器应能根据环境明暗变化,自动开灯和关灯。
是
3
支路控制器应能根据交通情况自动调节亮灯状态:
当可移动物体M(在物体前端标出定位点,由定位点确定物体位置)由左至右到达S点时(见图2),灯1亮;当物体M到达B点时,灯1灭,灯2亮;若物体M由右至左移动时,则亮灯次序与上相反。
是
4
支路控制器能分别独立控制每只路灯的开灯和关灯时间。
是
5
当路灯出现故障时(灯不亮),支路控制器应发出声光报警信号,并显示有故障路灯的地址编号。
是
2.发挥部分
序号
功能
是否实现
1
自制单元控制器中的LED灯恒流驱动电源
是
2
单元控制器具有调光功能,路灯驱动电源输出功率能在规定时间按设定要求自动减小,该功率应能在20%~100%范围内设定并调节,调节误差≤2%。
是
3.特色功能
序号
功能
是否实现
1
自制微型红外光发射与光敏电阻组合替代工业光电传感器
是
2
利用单片机的AD变换功能,实现用一个IO口读多个按键
是
3
使用单片机内部的定时器代替时钟芯片,实现时钟功能和定时开关机功能
是
4
采用PWM与电流取样方式,实现闭环的恒流源控制
是
5.结论
本方案的系统设计符合本次试题的要求,经过功率扩大、电网通讯等方面的改良,可以用于实际路灯控制,是一个低成本,高可靠性的合理方案。
参考文献
[1]阎石.数字电子技术基础(第四版).北京:
高等教育出版社,1997年.
[2]郑学坚,周斌.微型计算机原理及应用(第三版).北京:
清华大学出版社,2000年.
附录
附录1程序代码
/**************************************************************
*程序主要功能:
模拟路灯控制系统*
*完成时间:
2011.06.13*
*作者:
*
**************************************************************/
#include"STC12C5410AD.h"
#include"intrins.h"
#include
#defineuintunsignedint
#defineucharunsignedchar
uchardis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x3e,0x77,0x40,0x00,0x76,0x71,0x37};//10_V,A,-,熄灭,H,F_15,N,
//////
sfrADC_RES=0xC6;//ADChigh8-bitresultregister
/////
#defineADC_POWER0x80//ADCpowercontrolbit
#defineADC_FLAG0x10//ADCcompleteflag
#defineADC_START0x08//ADCstartcontrolbit
#defineADC_SPEEDLL0x00//420clocks
#defineADC_SPEEDL0x20//280clocks
#defineADC_SPEEDH0x40//140clocks
#defineADC_SPEEDHH0x60//70clocks
////////////////////////ISP//////////////////
#defineENABLE_ISP0x83//系统工作时钟<12MHz时,对IAP_CONTR寄存器设置此值
/////////////////////////////////////////////////////////////////////////////
sbitk1=P1^0;//按钮
sbitk2=P1^1;
sbitk3=P1^2;
sbitk4=P1^3;
sbitk5=P1^4;
////
sbiten1=P3^4;//373使能端端码
sbiten2=P3^5;//373使能端位码
///
sbitfeng=P3^7;
///
sbitpwm_out=P3^2;
sbitled2=P3^3;/////////函数定义部分
uchard[8];
charshi=0,fen=0,miao=0,set_miao=0,pwm,
set_fen=0;set_on_shi=0,set_off_shi=0,light=0,pwm_count=0;
bitshijian_bit=1,pwm_bit=1,light_bit=1;
uintsum2=0,shi_count=0;
////
voidIAP_Disable();
ucharByte_Read(ucharaddh,ucharaddl);
voidSector_Erase(ucharaddh,ucharaddl);
voidByte_Program(ucharaddh,ucharaddl,ucharch);
////////////////////////////////
voidInitADC();//ADC转换初始化
ucharGetADCResult(ucharch);//取ADC转换初值
uintget_adc(ucharch);
///////////////取ADC转换数据10位
voiddelay(uinti);
voidjiyi();
voidread_jiyi();
voidrun_shijian();//延时1MS
/////////////////////////////////////////////////////////////////////////
voiddelay(uinti)//延时函数
{
uinta,b;
for(a=0;a
for(b=0;b<120;b++);
}
//////////////////
voiddisplay()//显示函数
{
uchari,s=0x01;
for(i=0;i<8;i++)
{
P2=dis[d[i]];
en1=1;en1=0;
P2=~s;
en2