段洁模拟路灯控制系统的设计.docx

上传人:b****5 文档编号:29896279 上传时间:2023-08-03 格式:DOCX 页数:23 大小:236.83KB
下载 相关 举报
段洁模拟路灯控制系统的设计.docx_第1页
第1页 / 共23页
段洁模拟路灯控制系统的设计.docx_第2页
第2页 / 共23页
段洁模拟路灯控制系统的设计.docx_第3页
第3页 / 共23页
段洁模拟路灯控制系统的设计.docx_第4页
第4页 / 共23页
段洁模拟路灯控制系统的设计.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

段洁模拟路灯控制系统的设计.docx

《段洁模拟路灯控制系统的设计.docx》由会员分享,可在线阅读,更多相关《段洁模拟路灯控制系统的设计.docx(23页珍藏版)》请在冰豆网上搜索。

段洁模拟路灯控制系统的设计.docx

段洁模拟路灯控制系统的设计

模拟路灯控制系统的设计

段结

(中南林业科技大学计算机与信息工程学院,湖南长沙,410004)

摘要:

本设计以STC12C5A60S2单片机作为模拟路灯控制的核心;采用专用时钟芯片实现精确的时钟功能,设定并显示开关时间。

该控制系统根据环境明暗变化自动开关和关灯,已达到节能的要求。

系统采用线路简单、体积小的专用时钟芯片DS1302,DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW。

使用DS1302不但使电路功耗降低,而且节省IO口资源。

采用低功耗的字符型液晶作为显示器件,显示更为直观。

使用光敏电阻来检测环境明暗的变化,光敏电阻在不同光强下电阻会发生明显变化,单片机内部AD采集电阻值的变化量达到检测目的。

采用对射式收发一体光电传感器检测物体的运动,使用灵敏光电传感器更有效地实现在物体运动过程中路灯的自动控制,达到节能的要求。

挡路等电路出现故障时,单片机采集路灯电路采样点的电压后处理采集到的数据,实现自动报警功能。

该系统基于可靠地硬件设计和稳定的软件算法实现题目的基本要求。

关键词:

STC12C5A60S2;DS1302;光敏电阻;光电传感器;12864。

一、硬件电路设计

本系统采用STC12C5A60S2作为控制核心,通过传感器采集信号经单片机分析处理后控制路灯的亮灭,并且同时将时间显示出来,也可通过键盘设定和调整时间,再出现故障后同时将地址编号显示出来,并且将光敏电阻的检测电路的输出与单片机相连,可以达到根据环境条件自动调节的功能。

系统的方框图如图1所示:

图1模拟路灯系统控制框图

1、显示模块

使用7289芯片控制八位数码管和12864液晶显示(液晶显示驱动简单,耗电量小,无辐射危险,平面直角显示以及影响稳定不闪烁灯优势,显示直观、抗干扰能力强)。

图2显示模块电路图

2、时钟模块

采用DS1302实时时钟/日历芯片,最大总行速度400bit/s,每次读写数据后,其内嵌的字地址寄存器会自动产生增量的地址寄存器、分频器、可编程时钟输出、定时器、400Hz的I2总线接口,DS1302与单片机之间简单的采用同步串行的方式进行通信,仅需要用到三个口线,简单方便。

采用三线接口与CPU进行同布通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

本电路由Y2构成起镇。

3V的纽扣电池构成掉电保护电路,1302的CLK,I/O,RST口分别接单片机的IO口,从而控制1302时钟显示。

DS1302的2脚和3脚外接32.768KHz夫人晶振,7脚为串行时钟接口,与单片机的15脚相连,6脚为数据输入/输端,以便于总线控制,与单片机的17脚相连,5脚复位引脚,与单片机的P3.6相连,当时钟达到设定值时,自动复位。

电路图如图3。

图3时钟模块电路图

3、光敏模块

光敏电阻是一种典型的光电导器件。

所谓光电导效应是表示材料(或器件)受到光辐射后,材料(或器件)的电导率发生变化。

光敏电阻具有灵敏度高,光谱特性好,使用寿命长,稳定性高,无极性之分,使用方便,体积小以及制造工艺简单等特点。

基于此,在本系统中的光控部分才有了光敏电阻。

如图4,LM324作为比较电路,2脚作为基准电压,3脚接输入电压,1脚接单片机I/O口,作为标志位,控制路灯(LED灯)的亮灭。

图4光敏模块电路图

4、故障模块

LM324作为比较电路,2脚和6脚接基准电压,1脚和7脚接单片机I/O口,作为标志位控制LED1和LED2的点位,从而控制LED灯的亮灭。

通过LED灯的检测,判断路灯是否故障,给GZLED电平控制故障灯亮灭。

如图5所示。

图5故障模块电路图

5、位置模块

支路控制器应能根据交通情况自动调节亮灯状态:

当可移动物体M(在物体前端标出定位点,由定位点确定物体位置)由左至右到达S点时,灯1亮;当物体M到达B时,灯1灭,灯2亮;若物体M由右至左移动时,则亮灯次序与上相反。

如图6所示。

在位置模块中,通过光电传感器来实现对物体的检测,若物体到达位置S.B.S’,排针1.2.3作为标志信号与单片机I/O口连接,控制LED灯亮灭,实现所需要求

图6路灯布置示意图

二、软件设计

C语言表达能力和运算能力比较强,且具有很好的可移植性和硬件控制能力,所以系统采用C语言编程实现各项功能。

 

1、系统程序框图如下:

图7主程序框图

2、程序清单

#include

#include"LCD_Dis.h"

#include"ds1302.h"

#defineucharunsignedchar

#defineuintunsignedint

voiddelayms(uint);

 

sbitled1=P1^1;

sbitled2=P1^0;

sbitcomled1=P3^2;

sbitcomled2=P3^3;

sbitgzled=P1^4;

sbitgd1=P3^4;

sbitgd2=P3^5;

sbitgd3=P3^7;

sbitgmr=P1^2;

 

sbitcs=P2^3;

sbitclk=P2^2;

sbitkey=P2^1;

sbitdat=P2^0;

#defineCMD_RESET0xa4

#defineCMD_TSET0xbf

#defineDECODE00x80

#defineDECODE10xc8

#defineCMD_READ0x15

#defineUNDECODE0x90

#defineRTL_CYCLE0xa3

#defineRTR_CYCLE0xa2

#defineRTL_UNCYCLE0xa1

#defineRTR_UNCYCLE0xa0

#defineACTCTL0x98

#defineSEGON0xe0

#defineSEGOFF0xc0

#defineBLINKCTL0x88

 

//uchardatachuzhi[]={0x23,0x59,0x50};

//uchardatadis1[]={0x00,0x00,0x0a,0x00,0x00,0x0a,0x00,0x00};

 

ucharsec,min,hou,day,mon,week,year,gz1,gz2,gdflag1,gdflag2,ledflag1,ledflag2,gmflag,a,b;

 

voidlong_delay(void);

voidshort_delay(void);

voiddelay10ms(unsignedchar);

voidwrite7279(unsignedchar,unsignedchar);

voidledcontrol(void);

voidgzcontrol(void);

voidrightthrough(void);

voidleftthrough(void);

voidgmrcontrol(void);

voidgdcontrol(void);

 

unsignedcharread7279(unsignedchar);

voidsend_byte(unsignedchar);

unsignedcharreceive_byte(void);

voiddelayms(uintxms)

{

uinti,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--);

}

 

voidwrite7279(unsignedcharcmd,unsignedchardat)

{

send_byte(cmd);

send_byte(dat);

cs=1;

}

unsignedcharread7279(unsignedcharcommand)

{

send_byte(command);

return(receive_byte());

}

//传一个字节//

voidsend_byte(unsignedcharout_byte)

{

unsignedchari;

cs=0;

clk=0;

long_delay();

for(i=0;i<8;i++)

{

if(out_byte&0x80)

{

dat=1;

}

else

{

dat=0;

}

clk=1;

short_delay();

clk=0;

short_delay();

out_byte=out_byte*2;

}

dat=1;

}

unsignedcharreceive_byte(void)

{

unsignedchari,in_byte;

dat=1;

long_delay();

for(i=0;i<8;i++)

{

clk=1;

short_delay();

in_byte=in_byte*2;

if(dat)

{

in_byte=in_byte|0x01;

}

clk=0;

short_delay();

}

dat=0;

cs=1;

return(in_byte);

}

voidlong_delay(void)

{

unsignedinti;

for(i=0;i<0x30;i++);

}

voidshort_delay(void)

{

unsignedchari;

for(i=0;i<8;i++);

}

//*********************.1n*10ms**********************

voiddelay10ms(unsignedchartime)

{

unsignedchari;

unsignedintj;

for(i=0;i

{

for(j=0;j<0x490;j++);

}

}

 

voiddisplay()

{

write7279(DECODE0+0,sec%10);

write7279(DECODE0+1,sec/10);

write7279(DECODE0+3,min%10);

write7279(DECODE0+4,min/10);

write7279(DECODE0+6,hou%10);

write7279(DECODE0+7,hou/10);

write7279(DECODE0+2,0x0a);

write7279(DECODE0+5,0x0a);

ClrScreen();

PutString_cn(5,5,"时钟");

ShowShort(15,20,hou,1);

PutString(30,20,":

");

ShowShort(45,20,min,1);

PutString(60,20,":

");

ShowShort(75,20,sec,1);

PutString(60,20,":

");

ShowShort(15,35,year,1);

PutString_cn(30,35,"年");

ShowShort(45,35,mon,1);

PutString_cn(60,35,"月");

ShowShort(75,35,day,1);

PutString_cn(90,35,"日");

delayms(50);//让数码管正常显示出来

}

voidmain()

{

TMOD=0x01;

EA=1;

ET0=0;

TR0=0;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

sec=0;

min=0;

led1=1;

led2=1;

gz1=1;

gz2=1;

hou=0;

ledflag1=1;

ledflag2=1;

gmflag=1;

gdflag2=1;

init1302();

SetBackLight(90);

ClrScreen();//设置背光的亮度等级为0

FontMode(0,1);

PutString_cn(5,5,"时钟");

FontSet(1,1);

while

(1)

{

sec=Read1302(0x81);

min=Read1302(0x83);

hou=Read1302(0x85);

day=Read1302(0x87);

year=Read1302(0x8d);

mon=Read1302(0x89);

display();

ledcontrol();

gmrcontrol();

gdcontrol();

gzcontrol();

}

}

 

voidledcontrol()

{

if((hou==18)&&(min==0)&&(sec==0))

{

led1=0;

led2=0;

gz1=0;

gz2=0;

ledflag1=0;

ledflag2=0;

gdflag2=1;

}

//delayms(1000);

if((hou==18)&&(min==0)&&(sec==20))

{

led1=1;

led2=1;

gz1=1;

gz2=1;

ledflag2=1;

ledflag1=1;

gdflag2=1;

}

delayms(50);

}

 

voidgzcontrol()

{

delayms(100);

if((gz1==0)&&(comled1==1))

{

delayms(10);

if((gz1==0)&&(comled1==1))

{

gzled=0;

ShowShort(15,50,1,1);

PutString_cn(20,50,"号有故障");

}

}

delayms(100);

if((gz2==0)&&(comled2==1))

{

delayms(10);

if((gz2==0)&&(comled2==1))

{

gzled=0;

ShowShort(15,50,2,1);

PutString_cn(20,50,"号有故障");

//delayms(50);

}

}

delayms(1000);

}

voidrightthrough()

{

if(gd1==1)

{

led1=0;

led2=1;

gz1=0;

gz2=1;

}

delayms(10);

if(gd2==1)

{

led1=1;

led2=0;

gz1=1;

gz2=0;

}

delayms(10);

if(gd3==1)

{

led1=1;

led2=1;

gz1=1;

gz2=1;

TR0=0;

ET0=0;

gdflag2=1;

}

//delayms(10000);

}

 

voidleftthrough()

{

if(gd3==1)

{

led2=0;

led1=1;

gz2=0;

gz2=1;

}

if(gd2==1)

{

led2=1;

led1=0;

gz2=1;

gz1=0;

}

delayms(10);

if(gd1==1)

{

led2=1;

led1=1;

gz2=1;

gz1=0;

TR0=0;

ET0=0;

gdflag2=1;

}

}

 

voidgdcontrol()

{

if((ledflag1==1)&&(ledflag2==1)&&(gdflag2==1)&&(gmflag==1))

{

if(gd1==1)

{

gdflag1=0;

gdflag2=0;

ET0=1;

TR0=1;

}

if(gd3==1)

{

gdflag1=1;

gdflag2=0;

ET0=1;

TR0=1;

}

}

if((gdflag1==0)&&(gdflag2==0))

{

rightthrough();

}

if((gdflag1==1)&&(gdflag2==0))

{

leftthrough();

}

}

voidgmrcontrol()

{

if((gmr==0)&&(ledflag1==1)&&(ledflag2==1))

{

led1=0;

led2=0;

gz1=1;

gz2=1;

gmflag=0;

gdflag2=1;

}

delayms(10);

if((gmr==1)&&(ledflag1==1)&&(ledflag2==1)&&(gdflag2==1))

{

led1=1;

led2=1;

gz1=1;

gz2=1;

gmflag=1;

gdflag2=1;

}

 

}

 

voidT0_time()interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

a++;

if(a==20)

{

b++;

a=0;

if(b==5)

{

led1=1;

led2=1;

a=0;

b=0;

gdflag2=1;

TR0=0;

ET0=0;

}

}

}

三、总结

硬件设计和软件设计是电子设计中不可缺少的内容,为了满足设计的功能和指标的要求,我们必须在开始设计时就考虑到硬件与软件的协调;不然会增加软件实现时困难和复杂程度,有时即使硬件和软件单独能用,却不能使他们组成的系统工作,故在设计过程中必须考虑软硬件的处理能力以及它们的借口是否兼容,实现软硬件的信号过度。

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

当前位置:首页 > 经管营销 > 经济市场

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

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