创新设计路灯控制系统.docx

上传人:b****5 文档编号:11953476 上传时间:2023-04-16 格式:DOCX 页数:15 大小:41.71KB
下载 相关 举报
创新设计路灯控制系统.docx_第1页
第1页 / 共15页
创新设计路灯控制系统.docx_第2页
第2页 / 共15页
创新设计路灯控制系统.docx_第3页
第3页 / 共15页
创新设计路灯控制系统.docx_第4页
第4页 / 共15页
创新设计路灯控制系统.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

创新设计路灯控制系统.docx

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

创新设计路灯控制系统.docx

创新设计路灯控制系统

创新设计(学校路灯控制系统)

专业班级:

08电子

(1)班姓名:

吴剑学号:

200810330126

设计简介:

本设计是一个通过51单片机来控制路灯亮/灭。

例如:

晚上19:

30路灯亮,到早上6:

00熄灭,当时钟走到19:

30时路灯点亮,同理在6:

00时熄灭,实现自动控制。

为了防止偶尔断电或停机后再开机致使设定值丢失,这里使用了AT24C02来记忆设定的定时值。

P1口作为控制输出口控制继电器从而达到控制路灯的作用。

亮、灭时间可随时调整,提高了控制的灵活性和准确性。

为了进行校时及定时值设定,规定了六种工作状态。

状态0(status=0):

正常走时;状态1(status=1):

输入定时1的“分”状态;状态2(status=2):

输入定时1的“时”状态;状态3(status=3):

输入定时2的“分”状态;状态4(status=4):

输入定时2的“时”状态;状态5(status=5):

校正走时态。

状态0:

从左往右六只数码管依次显示走时的时、分、秒。

状态1:

从左往右的显示依次为:

状态1显示(1位);无显示;定时1的“分”显示。

后两位无显示。

按下S6/S5进行加减。

状态2:

从左往右的显示依次为:

状态2显示(1位);无显示;定时1的“时”显示。

后两位无显示。

按下S6/S5进行加减

状态3:

从左往右的显示依次为:

状态3显示(1位);无显示;定时2的“分”显示。

后两位无显示。

按下S6/S5进行加减。

状态4:

从左往右的显示依次为:

状态4显示(1位);无显示;定时2的“时”显示。

后两位无显示。

按下S6/S5进行加减。

状态5:

从左往右的显示依次为:

状态5显示(1位);无显示;时钟的“分”显示。

后两位无显示。

按下S6/S5进行加减。

对AT24C02内部储存单元规划:

80、81单元存放定时1的分、时值;90、91单元存放定时2的分、时值;100号单元存放首次写入的标志,若写入过,则100号单元置数100.

框图如下:

 

电路图如下:

 

 

源程序如下:

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodeSEG7[10]={0xa0,0xbe,0x62,0x2a,0x3c,0x29,0x21,0xba,0x20,0x28};/*共阳*/

ucharcodeACT[4]={0xbf,0xdf,0xef,0x7f,0xfd,0xfe};

sbitoutput=P1^0;

#defineINC_KEY0xfb//S6按下

#defineDEC_KEY0xf7//S5按下

#defineOK_KEY0xef//S4按下

#defineSTATUS_KEY0xdf//S3按下

ucharstatus;

uchardeda,sec,min,hour;

ucharset1_dat[2],set2_dat[2];

bitset1_flag,set2_flag;

sbitSDA=P2^0;

sbitSCL=P2^1;

staticuchartime_cnt;

staticbitbit_flag;

voiddelay_icc(intn)

{inti;

for(i=1;i

}

voiddelay()

{;;}

voiddelay1ms(uintz)

{uinti,j;

for(i=0;i

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

}

voidstart()//开始函数

{SDA=1;

delay();

SCL=1;

delay();

SDA=0;

delay();

}

voidstop()//停止函数

{SDA=0;

delay();

SCL=1;

delay();

SDA=1;

delay();

}

voidrespons()//应答函数

{uchari;

SCL=1;

delay();

while((SDA==1)&&(i<250))i++;

SCL=0;

delay();

}

voidwrite_byte(uchardate)//写一字节

{uchari,temp;

temp=date;

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

{temp=temp<<1;

SCL=0;

delay();

SDA=CY;

delay();

SCL=1;

delay();

}

SCL=0;

delay();

SDA=1;

delay();

}

ucharread_byte()

{uchari,k;

SCL=0;

delay();

SDA=1;

delay();

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

{SCL=1;

delay();

k=(k<<1)|SDA;

SCL=0;

delay();

}

returnk;

}

voidwrite_add(ucharaddress,uchardate)

{start();

write_byte(0xa0);

respons();

write_byte(address);

respons();

write_byte(date);

respons();

stop();

}

ucharread_add(ucharaddress)

{uchardate;

start();

write_byte(0xa0);//芯片寻址(10100000)写

respons();

write_byte(address);

respons();

start();

write_byte(0xa1);//芯片寻址(1010001)读

respons();

date=read_byte();

stop();

returndate;

}

voidinitial()

{ucharrd_value;

rd_value=read_add(100);delay_icc(250);

if(rd_value==88)

{set1_dat[0]=read_add(80);delay_icc(250);

set1_dat[1]=read_add(81);delay_icc(250);

set2_dat[0]=read_add(90);delay_icc(250);

set2_dat[1]=read_add(91);delay_icc(250);

}

TMOD=0x11;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TH1=(65536-1000)/256;

TL1=(65536-1000)%256;

TR0=1;

ET0=1;

ET1=1;

TR1=1;

EA=1;

}

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

voidtime0()interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

deda++;

if(deda>=20){deda=0;sec++;}

if(sec>9){sec=0;min++;}

if(min>9){min=0;hour++;}

if(hour>23){hour=0;}

}

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

voidtime1()interrupt3

{

TH1=(65536-1000)/256;

TL1=(65536-1000)%256;

time_cnt++;

bit_flag=~bit_flag;

if(status==0){if(time_cnt>3)time_cnt=0;}

else{if(time_cnt>9)time_cnt=0;}

}

ucharkey()

{uchartemp;

P3=0xff;

temp=P3;

if(temp!

=0xff)

{delay_icc(30);

P3=0xff;

temp=P3;

}

return(temp);

}

voidpout()//输出判断子函数

{

if((min==set1_dat[0])&&(hour==set1_dat[1]))P1=0x00;

if((min==set2_dat[0])&&(hour==set2_dat[1]))P1=0xff;

}

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

voidmain()

{

ucharkey_value;

initial();

for(;;)

{

key_value=key();

pout();

if(key_value==STATUS_KEY)//如果S4键按下

{status++;

if(status==6)

{status=0;

EA=0;

pout();

write_add(100,88);delay_icc(250);

write_add(80,set1_dat[0]);delay_icc(250);

write_add(81,set1_dat[1]);delay_icc(250);

write_add(90,set2_dat[0]);delay_icc(250);

write_add(91,set2_dat[1]);delay_icc(250);

write_add(70,(uchar)set1_flag);delay_icc(250);

write_add(71,(uchar)set2_flag);delay_icc(250);

EA=1;

}

delay1ms(300);

}

if(key_value==INC_KEY)//如果S1键按下

{pout();

switch(status)

{case1:

if(set1_dat[0]<60)set1_dat[0]++;delay1ms(300);break;

case2:

if(set1_dat[1]<23)set1_dat[1]++;delay1ms(300);break;

case3:

if(set2_dat[0]<60)set2_dat[0]++;delay1ms(300);break;

case4:

if(set2_dat[1]<23)set2_dat[1]++;delay1ms(300);break;

case5:

if(min<60)min++;delay1ms(300);break

default:

break;

}

}

if(key_value==DEC_KEY)

{pout();

switch(status)

{pout();

case1:

if(set1_dat[0]>0)set1_dat[0]--;delay1ms(300);break;

case2:

if(set1_dat[1]>0)set1_dat[1]--;delay1ms(300);break;

case3:

if(set2_dat[0]>0)set2_dat[0]--;delay1ms(300);break;

case4:

if(set2_dat[1]>0)set2_dat[1]--;delay1ms(300);break;

case5:

if(min>0)min--;delay1ms(300);break;

default:

break;}

}

if(key_value==OK_KEY)

{if((status==1)||(status==2)){set1_flag=!

set1_flag;delay1ms(300);}

if((status==3)||(status==4)){set1_flag=!

set1_flag;delay1ms(300);}

}

if(status==0)

{pout();

switch(time_cnt)

{case0:

P0=SEG7[sec%10];P2=ACT[5];break;

case1:

P0=SEG7[sec/10];P2=ACT[4];break;

case2:

P0=SEG7[min%10];P2=ACT[3];break;

case3:

P0=SEG7[min/10];P2=ACT[2];break;

case4:

P0=SEG7[hour%10];P2=ACT[1];break;

case5:

P0=SEG7[hour/10];P2=ACT[0];break;

default:

break;

}

}

if(status==1)

{pout();

switch(time_cnt)

{case0:

P0=SEG7[status];P2=ACT[0];break;

case1:

P0=0xff;P2=ACT[1];break;

case2:

P0=SEG7[set1_dat[0]%10];P2=ACT[3];break;

case3:

P0=SEG7[set1_dat[0]/10];P2=ACT[2];break;

default:

if(bit_flag){P0=SEG7[set1_dat[0]%10];P2=ACT[3];}

elseP0=SEG7[set1_dat[0]/10];P2=ACT[2];

break;

}

}

if(status==2)

{pout();

switch(time_cnt)

{case0:

P0=SEG7[status];P2=ACT[0];break;

case1:

if(set1_flag)P0=0xfb;

elseP0=0xff;P2=ACT[1];break;

case2:

P0=SEG7[set1_dat[1]%10];P2=ACT[3];break;

case3:

P0=SEG7[set1_dat[1]/10];P2=ACT[2];break;

default:

if(bit_flag){P0=SEG7[set1_dat[1]%10];P2=ACT[3];}

else{P0=SEG7[set1_dat[1]/10];P2=ACT[2];}break;

}

}

if(status==3)

{switch(time_cnt)

{case0:

P0=SEG7[status];P2=ACT[0];break;

case1:

P0=0xff;P2=ACT[1];break;

case2:

P0=SEG7[set2_dat[0]%10];P2=ACT[3];break;

case3:

P0=SEG7[set2_dat[0]/10];P2=ACT[2];break;

default:

if(bit_flag){P0=SEG7[set2_dat[0]%10];P2=ACT[3];}

elseP0=SEG7[set2_dat[0]/10];P2=ACT[2];

break;

}

}

if(status==4)

{

switch(time_cnt)

{

case0:

P0=SEG7[status];P2=ACT[0];break;

case1:

if(set1_flag)P0=0xfb;

elseP0=0xff;P2=ACT[1];break;

case2:

P0=SEG7[set2_dat[1]%10];P2=ACT[3];break;

case3:

P0=SEG7[set2_dat[1]/10];P2=ACT[2];break;

default:

if(bit_flag){P0=SEG7[set2_dat[1]%10];P2=ACT[3];}

else{P0=SEG7[set2_dat[1]/10];P2=ACT[2];}break;

}

}

if(status=5)

{switch(time_cnt)

{case0:

P0=SEG7[status];P2=ACT[0];break;

case1:

P0=0xff;P2=ACT[1];break;

case2:

P0=SEG7[min%10];P2=ACT[3];break;

case3:

P0=SEG7[min/10];P2=ACT[2];break;

default:

if(bit_flag){P0=SEG7[min%10];P2=ACT[3];}

elseP0=SEG7[min/10];P2=ACT[2];

break;}

}

}

}

 

参考文献:

1、郭天祥,《新概念单片机C语言教程》,电子工业出版社,2003年

2、童诗白华成英,《模拟电子技术基础》,高等教育出版社,2009年

3、杨路明,《C语言程序设计教程》,北京邮电大学出版社,2007年

4、胡汉才,《单片机接口技术》,清华大学出版社,2009年

5、丁明亮唐前辉,《单片机应用设计与仿真》,北京航空航天大学出版社2009年

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

当前位置:首页 > 工程科技 > 能源化工

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

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