创新设计路灯控制系统.docx
- 文档编号:6547391
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:11
- 大小:24.92KB
创新设计路灯控制系统.docx
《创新设计路灯控制系统.docx》由会员分享,可在线阅读,更多相关《创新设计路灯控制系统.docx(11页珍藏版)》请在冰豆网上搜索。
创新设计路灯控制系统
创新设计(学校路灯控制系统)
设计简介:
本设计是一个通过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);// 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年
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 创新 设计 路灯 控制系统