1、创新设计路灯控制系统创新设计(学校路灯控制系统)专业班级:08电子(1)班 姓名:吴 剑 学号:200810330126设计简介:本设计是一个通过51单片机来控制路灯亮/灭。例如:晚上19:30路灯亮,到早上6:00熄灭,当时钟走到19:30时路灯点亮,同理在6:00时熄灭,实现自动控制。为了防止偶尔断电或停机后再开机致使设定值丢失,这里使用了AT24C02来记忆设定的定时值。P1口作为控制输出口控制继电器从而达到控制路灯的作用。亮、灭时间可随时调整,提高了控制的灵活性和准确性。为了进行校时及定时值设定,规定了六种工作状态。状态0(status=0):正常走时;状态1(status=1):输入
2、定时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/
3、S5进行加减。状态4:从左往右的显示依次为:状态4显示(1位);无显示;定时2的“时”显示。后两位无显示。按下S6/S5进行加减。状态5:从左往右的显示依次为:状态5显示(1位);无显示;时钟的“分”显示。后两位无显示。按下S6/S5进行加减。对AT24C02内部储存单元规划:80、81单元存放定时1的分、时值;90、91单元存放定时2的分、时值;100号单元存放首次写入的标志,若写入过,则100号单元置数100.框图如下: 电路图如下:源程序如下:#include #define uchar unsigned char#define uint unsigned intuchar code S
4、EG710=0xa0,0xbe,0x62,0x2a,0x3c,0x29,0x21,0xba,0x20,0x28; /*共阳*/uchar code ACT4=0xbf,0xdf,0xef,0x7f,0xfd,0xfe;sbit output=P10;#define INC_KEY 0xfb /S6按下#define DEC_KEY 0xf7 /S5按下#define OK_KEY 0xef /S4按下#define STATUS_KEY 0xdf /S3按下uchar status;uchar deda,sec,min,hour;uchar set1_dat2,set2_dat2;bit se
5、t1_flag,set2_flag;sbit SDA=P20;sbit SCL=P21;static uchar time_cnt; static bit bit_flag;void delay_icc(int n)int i;for(i=1;in;i+);void delay();void delay1ms(uint z)uint i,j;for(i=0;iz;i+)for(j=0;j110;j+);void start()/开始函数SDA=1;delay();SCL=1;delay();SDA=0;delay();void stop()/停止函数SDA=0;delay();SCL=1;de
6、lay();SDA=1;delay();void respons()/应答函数uchar i;SCL=1;delay();while(SDA=1)&(i250)i+;SCL=0;delay();void write_byte(uchar date)/写一字节uchar i,temp;temp=date;for(i=0;i8;i+)temp=temp1;SCL=0;delay();SDA=CY;delay();SCL=1;delay();SCL=0;delay();SDA=1;delay();uchar read_byte()uchar i,k;SCL=0;delay();SDA=1;delay
7、();for(i=0;i8;i+)SCL=1;delay();k=(k=20)deda=0;sec+; if(sec9)sec=0;min+; if(min9)min=0;hour+; if(hour23)hour=0; /*/void time1() interrupt 3 TH1=(65536-1000)/256; TL1=(65536-1000)%256; time_cnt+; bit_flag=bit_flag; if(status=0)if(time_cnt3)time_cnt=0; elseif(time_cnt9)time_cnt=0;uchar key()uchar temp;
8、P3=0xff;temp=P3;if(temp!=0xff)delay_icc(30);P3=0xff;temp=P3;return(temp);void pout()/输出判断子函数 if(min=set1_dat0)&(hour=set1_dat1)P1=0x00; if(min=set2_dat0)&(hour=set2_dat1)P1=0xff; /*/void main() uchar key_value; initial(); for(;) key_value=key(); pout(); if(key_value=STATUS_KEY)/如果S4键按下 status+; if(s
9、tatus=6) status=0; EA=0; pout(); write_add(100,88);delay_icc(250); write_add(80,set1_dat0);delay_icc(250); write_add(81,set1_dat1);delay_icc(250); write_add(90,set2_dat0);delay_icc(250); write_add(91,set2_dat1);delay_icc(250); write_add(70,(uchar)set1_flag);delay_icc(250); write_add(71,(uchar)set2_f
10、lag);delay_icc(250); EA=1; delay1ms(300); if(key_value=INC_KEY)/如果S1键按下 pout(); switch(status) case 1:if(set1_dat060)set1_dat0+;delay1ms(300);break; case 2:if(set1_dat123)set1_dat1+;delay1ms(300);break; case 3:if(set2_dat060)set2_dat0+;delay1ms(300);break; case 4:if(set2_dat123)set2_dat1+;delay1ms(3
11、00);break; case 5:if(min0)set1_dat0-;delay1ms(300);break; case 2:if(set1_dat10)set1_dat1-;delay1ms(300);break; case 3:if(set2_dat00)set2_dat0-;delay1ms(300);break; case 4:if(set2_dat10)set2_dat1-;delay1ms(300);break; case 5:if(min0)min-;delay1ms(300);break; default:break; if(key_value=OK_KEY)if(stat
12、us=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) case 0:P0=SEG7sec%10;P2=ACT5;break; case 1:P0=SEG7sec/10;P2=ACT4;break; case 2:P0=SEG7min%10;P2=ACT3;break; case 3:P0=SEG7min/10;P2=ACT2;break; case 4:P
13、0=SEG7hour%10;P2=ACT1;break; case 5:P0=SEG7hour/10;P2=ACT0;break; default:break; if(status=1) pout();switch(time_cnt) case 0:P0=SEG7status;P2=ACT0;break; case 1:P0=0xff;P2=ACT1;break; case 2:P0=SEG7set1_dat0%10;P2=ACT3;break; case 3:P0=SEG7set1_dat0/10;P2=ACT2;break; default:if(bit_flag)P0=SEG7set1_
14、dat0%10;P2=ACT3; else P0=SEG7set1_dat0/10;P2=ACT2; break; if(status=2) pout();switch(time_cnt) case 0:P0=SEG7status;P2=ACT0;break; case 1:if(set1_flag)P0=0xfb; else P0=0xff;P2=ACT1;break; case 2:P0=SEG7set1_dat1%10;P2=ACT3;break; case 3:P0=SEG7set1_dat1/10;P2=ACT2;break; default:if(bit_flag)P0=SEG7s
15、et1_dat1%10;P2=ACT3; else P0=SEG7set1_dat1/10;P2=ACT2;break; if(status=3)switch(time_cnt) case 0:P0=SEG7status;P2=ACT0;break; case 1:P0=0xff;P2=ACT1;break; case 2:P0=SEG7set2_dat0%10;P2=ACT3;break; case 3:P0=SEG7set2_dat0/10;P2=ACT2;break; default:if(bit_flag)P0=SEG7set2_dat0%10;P2=ACT3; else P0=SEG
16、7set2_dat0/10;P2=ACT2; break; if(status=4) switch(time_cnt) case 0:P0=SEG7status;P2=ACT0;break; case 1:if(set1_flag)P0=0xfb; else P0=0xff;P2=ACT1;break; case 2:P0=SEG7set2_dat1%10;P2=ACT3;break; case 3:P0=SEG7set2_dat1/10;P2=ACT2;break; default:if(bit_flag)P0=SEG7set2_dat1%10;P2=ACT3; else P0=SEG7se
17、t2_dat1/10;P2=ACT2;break; if(status=5)switch(time_cnt)case 0:P0=SEG7status;P2=ACT0;break; case 1:P0=0xff;P2=ACT1;break; case 2:P0=SEG7min%10;P2=ACT3;break; case 3:P0=SEG7min/10;P2=ACT2;break; default:if(bit_flag)P0=SEG7min%10;P2=ACT3; else P0=SEG7min/10;P2=ACT2; break; 参考文献:1、郭天祥,新概念单片机C语言教程, 电子工业出版社,2003年2、童诗白 华成英, 模拟电子技术基础, 高等教育出版社,2009年3、杨路明, C语言程序设计教程, 北京邮电大学出版社,2007年4、胡汉才, 单片机接口技术, 清华大学出版社,2009年5、丁明亮 唐前辉,单片机应用设计与仿真,北京航空航天大学出版社2009年
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1