模拟路灯控制系统1组液晶Word文件下载.docx

上传人:b****6 文档编号:21111494 上传时间:2023-01-27 格式:DOCX 页数:23 大小:335.81KB
下载 相关 举报
模拟路灯控制系统1组液晶Word文件下载.docx_第1页
第1页 / 共23页
模拟路灯控制系统1组液晶Word文件下载.docx_第2页
第2页 / 共23页
模拟路灯控制系统1组液晶Word文件下载.docx_第3页
第3页 / 共23页
模拟路灯控制系统1组液晶Word文件下载.docx_第4页
第4页 / 共23页
模拟路灯控制系统1组液晶Word文件下载.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

模拟路灯控制系统1组液晶Word文件下载.docx

《模拟路灯控制系统1组液晶Word文件下载.docx》由会员分享,可在线阅读,更多相关《模拟路灯控制系统1组液晶Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。

模拟路灯控制系统1组液晶Word文件下载.docx

这种方案单元控制器电路相当简单,支路控制器电路较为复杂,MCU工作负荷大,I/O资源紧张。

整体方案成本较低,易于实现,但不符合实际情况,不满足题意。

主从机协同控制法。

支路控制器、单元控制器各采用1片MCU进行控制,支路控制器的主MCU与单元控制器的从MCU之间采用串口通信进行数据交换。

支路控制器只用于人机界面、开关灯时间设定、自动亮度识别、道路通过检测及故障报警等,而各个LED恒流源及其控制、数据采集电路均集成到单元控制器电路中,并由其内部的从MCU通过串口接收主MCU的指令进行控制。

此方案各MCU分工合理,协同工作,负荷不高,电路、程序都较简单。

同时采用工业串口,传输距离远,可推广到实际应用中,故本系统采用该方案。

2理论分析与计算

2.1功率数据采集原理分析

单元控制器采集当前LED的输出功率数据分两步进行:

一、采集通过LED的电流值。

由于本系统采用压控恒流源,故通过LED的电流即为通过采样电阻的电流,因为采样电阻阻值为1Ω,所以电流等同于采样电阻上的电压。

又因为前级运放OP07接成电压跟随器,该值即为D/A输出的电压值,在单元控制器在设定LED输出功率时已知。

二、采集LED两端的电压值。

该值由LM358接成减法器直接在LED两端取得,经A/D转换送给从机。

将这两个值相乘,即得到当前LED的功率值。

2.2功率调节原理分析

设定功率时,单元控制器并不能一步到位。

必须先通过D/A输出一个初始的LED电流值,然后通过A/D把LED两端电压读回来,将电流与电压相乘得到的功率值与需设定值进行比较,如果小于设定值,则增加D/A的输出;

如果大于,则减小D/A的输出。

通过这种闭环系统,使当前输出功率值逐步逼近设定功率值。

2.3调节误差分析

D/A设定恒流源电流值、A/D采集电压数据都将带来转换误差,这是A/D、D/A器件本身硬件带来的,不可避免。

A/D、D/A位数越高,转化误差越小,调节误差也越小。

本系统采用12位的A/D、D/A器件,转换误差小于0.1%,而功率误差由电流转化误差与电压转换误差共同决定,由于他们之间是乘积关系,因此误差的数量级不会上升,总的调节误差小于0.5%,精度完全符合题目要求。

3电路设计

3.1系统框图

系统框图如图1所示。

图1系统框图

3.2显示器模块电路

该模块采用1个1602液晶模块构成,数据线控制线接单片机I/O,电路如图2所示。

图21602液晶显示电路图3光传感器电路

3.3光传感器模块

采用光敏电阻作为敏感元件,当环境亮度较高时,光敏电阻R1阻值很小,P17为低电平;

当环境亮度较低时,光敏电阻R1阻值很大,P17为高电平。

电路如图3所示。

3.4时钟电路

时钟模块用于给MCU提供精确时间数据,从而使支路控制器能够准确控制LED的开关灯时间。

该模块采用具有I2C接口的PCF8563来进行设计,只占用MCU2个I/O,该模块电路如图4所示。

图4PCF8563时钟电路

3.5反射式红外传感器检测电路

系统采用反射式红外传感器实现道路通过情况的检测。

反射式红外传感器使用起来非常方便,只需三条线(电源、地和数据线)就可以进行控制。

当该传感器接上电源后,如果没有物体通过,数据线保持高电平;

如果有物体通过时,其反射回来的红外信号将被传感器接收,数据线电平将被拉低。

3.6声光报警电路

采用一个普通发光二极管加一个蜂鸣器实现,当LED出现故障时的声光报警提示功能。

如图6所示为声光报警电路。

图6声光报警电路

3.7A/D电路

该模块采用TI公司双通道12位串行ADCTLC2552实现,用于采集LED上电压值到从机。

其电路如图7所示:

图7A/D转换电路

3.8D/A转换电路

该模块采用Linear公司12位串行DACLTC2622实现,用于设定恒流源的输出电流及功率。

电路如图8所示:

图8D/A转换电路

3.9串口接口电路

本系统采用工业串口485进行主机与从机间的通信,其接口电路如图9所示:

图9串口接口电路

4程序设计

4.1定时开关灯的实现

支路控制器通过不停的读取时钟芯片中的时间值,并将其与开关灯设定时间做比较,如果达到开灯或关灯时间,主机将产生中断,将开灯或关灯指令通过485串口发到相应的单元控制器,单元控制器一旦发现串口有数据送来,立即产生串口中断,并从串口数据中获取开灯或关灯指令,再通过控制继电器的闭合与断开实现该功能。

4.2功率调节的实现

当调节功率时,单元控制器并不能一步到位,立即使当前功率值等于设定功率值。

4.3程序流程图

主机的主程序流程图、从机程序流程图、从机中断程序流程图分别如图10、11、12所示。

图10主机主程序流程图

图11从机主程序流程图图12从机中断服务程序流程图

5系统测试

5.1测试仪器

DS-1双通道直流稳压源、C31-A型高精度指针式毫安表、C31-V型高精度指针式电压表

5.2测试方案

功能逐项测试法:

根据题目要求,依次逐项测试系统功能。

数据实测计算法:

使用精密毫伏表、电压表,实时测试通过LED的电流及其两端的电压,再计算出LED的输出功率,并将其与控制器设定的功率值进行比较,以计算出调节误差。

5.3测试结果

1)功能完成情况

经测试,系统可完成题目的基本及发挥部分全部功能。

2)指标完成情况

本题的指标主要是恒流源输出功率的调节误差。

经测试,测试数据及计算结果如表1所示:

表1恒流源的功率数据及调节误差表

设定功率百分比

仪器测量电流值(mA)

仪器测量电压值(V)

实际功率计算值(W)

调节误差

20%

64.99

2.81

0.1826

1.74%

55%

180.18

2.99

0.5387

1.13%

76%

240.13

3.11

0.7468

1.32%

100%

307.86

3.21

0.9882

1.18%

5.4结果分析

通过测试、计算和分析,系统完成题目的基本及发挥部分全部功能,并在设定调节LED输出功率的指标上达到题目发挥部分要求,整体性能达到题目发挥部分要求。

6总结

支路控制器接显示器和键盘组成人机界面,可通过外部时钟模块进行开关灯定时控制,可通过光敏传感器和电压比较器检测环境明暗程度,可通过发射式红外传感器检测交通情况,控制LED的亮灭。

支路控制器与单元控制器之间采用485工业串口进行通信,可推广到实际应用中。

所有功能和指标均达到或部分超过赛题要求。

参考文献

[1]宋文绪,杨帆.自动检测技术.北京:

高等教育出版社,2008.

[2]高吉祥.全国大学生电子设计竞赛培训系列教程.北京:

电子工业出版社,2007.

[3]周坚.单片机C语言轻松入门.北京:

北京航空航天出版社,2006.

[4]孙传友等.测控电路及装置.北京:

北京航空航天大学出版社,2002.

[5]李朝青著.单片机原理及接口技术.北京航空航天大学出版社,2005.

附件1:

支路控制器单片机电路图

附件2:

单元控制器单片机电路图

附件3:

恒流源电路图

附件4:

主要PCB图

1)恒流源PCB图

2)主控电路PCB

3)从机电路PCB

附件5:

主要元器件清单

序号

元器件名称

型号、规格

数量

1

单片机

AT89S51

3

2

路灯LED

1W

ADC

TLC2552

4

DAC

LTC2622

5

液晶显示器

1602

6

74LS138

7

LM358

8

OP-07

9

晶振

11.0592M

10

按键

11

大功率电阻

1欧5W

12

继电器

13

场效应管

IRFZ44N

14

三端稳压器

7809

15

各类电阻

若干

16

各类电容

附件6:

部分程序清单

(1)主机部分程序

#include<

reg52.h>

intrins.h>

#defineUINT8unsignedchar

#defineUINT16unsignedint

sbitRS=P2^5;

sbitRW=P2^6;

sbitE=P2^7;

//sbitout1=P1^0;

sbitin1=P1^7;

//sbitout2=P1^1;

sbitSpeaker=P3^7;

sbitRENENABLE=P3^2;

sbitNo1=P1^0;

sbitNo2=P1^1;

sbitNo3=P1^2;

sbitNo4=P1^3;

sbitNo5=P1^4;

sbitNo6=P1^5;

sbitNo7=P1^6;

sbitISDA=P3^4;

//IO口冲突

sbitISCL=P3^3;

#defineDataP0

#defineS10xfe//1号键

#defineS20xfd//2号键

#defineS30xfb//3号键

#defineS40xf7//4号键

#defineS50x7e//长按键

UINT8codetab[]={'

0'

'

1'

2'

3'

4'

5'

6'

7'

8'

9'

};

//字符变量数组

UINT8idataText1[16]="

**-RealTime-**"

;

//字符变量数组

UINT8idataText2[16]="

*---:

:

---*"

//字符变量数组00:

00:

00

UINT8idataText3[16]="

**-OpenTime-**"

UINT8idataText4[16]="

**CloseTime-**"

UINT8codeText5[16]="

**Test1**"

UINT8codeText6[16]="

**Test2**"

UINT8codeText7[16]="

**Test3**"

UINT8codeText8[16]="

**Normal**"

UINT8idataText9[16]="

Power0is%"

UINT8idataText10[16]="

Power1is%"

UINT8codeText11[16]="

Led0wasbroken."

UINT8codeText12[16]="

Led1wasbroken."

UINT8codeText13[16]="

Welcome..."

UINT8Time=0;

UINT8Sec=00,Min=00,Hou=00;

UINT8Mod=0,Set=0;

UINT8OpenHou0,OpenMin0,OpenSec0,CloseHou0,CloseMin0,CloseSec0;

UINT8OpenHou1,OpenMin1,OpenSec1,CloseHou1,CloseMin1,CloseSec1;

UINT8TextModNum=0;

UINT8PowerA=70,PowerB=70;

UINT8AdjustN=0;

UINT8Hypotaxis=0;

bitLedFlag0=0;

bitLedFlag1=0;

bitLed1=0,Led2=0,Led3=0,Led4=0,Led5=0,Led6=0;

bitNum=0;

bitTimeFlag0=0;

bitTimeFlag1=0;

bitLedFlag2=1;

bitReadFlag=0;

bitAdjustFlag=0;

bitAdjustPowerFlag=0;

bitL1BFlag=0,L2BFlag=0;

bitTestLedFlag=0;

bitLedFlagLight1=0;

bitLedFlagLight2=0;

/******************通讯协议***********************/

#defineADDR10x01

#defineADDR20x02

#defineLedLight0x03

#defineLedDrown0x04

#defineLedTest0x05

#defineLedBro0x06

#defineLedRight0x07

/*************************************************/

/**********************函数声明*******************/

voidAdjust(void);

voidDelayms(unsignedintcount)

{

unsignedinti;

for(i=0;

i<

count;

i++);

}

voidDelay_ms(UINT16t)

UINT16i,j;

t;

i++)

for(j=0;

j<

124;

j++);

voidWriteCommand(unsignedcharCom)

E=0;

RS=0;

E=1;

RW=0;

Data=Com;

RS=0;

voidWriteData(unsignedcharDat)

RS=1;

Data=Dat;

voidInit1602()

Delayms(500);

WriteCommand(0x38);

Delayms(200);

Delayms(1400);

//显示模式设置,开始要求每次检测忙信号

WriteCommand(0x08);

//关闭显示

WriteCommand(0x01);

//显示清屏

WriteCommand(0x06);

//显示光标移动设置

WriteCommand(0x0C);

//显示开及光标设置

voidShow_Text(char*Text,charrow)//显示行

unsignedchari;

if(row==0)

{

WriteCommand(0x80);

Delayms(1400);

for(i=0;

16;

{

WriteData(Text[i]);

}

}

else

WriteCommand(0xC0);

}

(2)从机部分程序

#include<

math.h>

UINT16ADCDat[2];

UINT8Power;

UINT16codetable[9]={1,30,80,90,130,160,190,220,260};

sbitDA_CS=P1^3;

sbitDA_SCK=P1^4;

sbitDA_SDI=P1^5;

sbitADCS=P1^2;

sbitADCLK=P1^1;

sbitADSDO=P1^0;

sbitRENENABLE=P1^6;

sbitBUTTON=P2^0;

floatA=100;

floatErrorData=65536;

floatRealPower=0;

UINT16AnsK=0;

UINT16k=0,Temp2=100;

bitflag;

bitLedBroken=0;

bitLedFlag=0;

/********************通讯协议********************/

#defineAddr0x01

/************************************************/

/*********************函数声明*******************/

voidWrite_LTC2622(UINT16Data);

voidRead_TLC2552(void);

/********************系统初始化******************/

voidSysInit()

RENENABLE=0;

SCON=0xf0;

TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

TR1=1;

EA=1;

ES=1;

/******************功率调节**********************/

voidAdjustPower(UINT8P)

UINT8temp1;

UINT16Add=0;

floattemp=0;

floattt=0;

bitFlag1=0;

temp1=P/10;

switch(temp1)

case2:

k=table[0];

break;

case3:

k=table[1];

case4:

k=table[2];

case5:

k=table[3];

case6:

k=table[4];

case7:

k=table[5];

case8:

k=table[6];

case9:

k=table[7];

case10:

k=table[8];

while

(1)

Write_LTC2622(k);

Delay_ms

(1);

Read_TLC2552();

tt=(5000/4096)*ADCDat[0];

RealPower=((2500*k)/4096)*tt;

if(tt>

=3500)

LedBroken=1;

else

LedBroken=0;

temp=(P*10-RealPower);

if(temp<

0)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1