创新设计专业班级:08电子(1)班姓名:吴剑学号:201810330126设计简介:本设计是一个通过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 <REG51.H>#define uchar unsigned char#define uint unsigned intuchar code SEG7[10]={0xa0,0xbe,0x62,0x2a,0x3c,0x29,0x21,0xba,0x20,0x28}; /*共阳*/ uchar code ACT[4]={0xbf,0xdf,0xef,0x7f,0xfd,0xfe};sbit output=P1^0;#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_dat[2],set2_dat[2];bit set1_flag,set2_flag;sbit SDA=P2^0;sbit SCL=P2^1;static uchar time_cnt;static bit bit_flag;void delay_icc(int n){int i;for(i=1;i<n;i++);}void delay(){;;}void delay1ms(uint z){uint i,j;for(i=0;i<z;i++)for(j=0;j<110;j++);}void start()//开始函数{SDA=1;delay();SCL=1;delay();SDA=0;delay();}void stop()//停止函数{SDA=0;delay();SCL=1;delay();SDA=1;delay();}void respons()//应答函数{uchar i;SCL=1;delay();while((SDA==1)&&(i<250))i++; SCL=0;delay();}void write_byte(uchar date)//写一字节{uchar i,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();}uchar read_byte(){uchar i,k;SCL=0;delay();SDA=1;delay();for(i=0;i<8;i++){SCL=1;delay();k=(k<<1)|SDA;SCL=0;}return k;}void write_add(uchar address,uchar date) {start();write_byte(0xa0);respons();write_byte(address);respons();write_byte(date);respons();stop();}uchar read_add(uchar address){uchar date;start();write_byte(0xa0);//芯片寻址(10100000)写respons();write_byte(address);respons();start();write_byte(0xa1);//芯片寻址(1010001)读respons();date=read_byte();stop();return date;}void initial(){uchar rd_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;ET1=1;TR1=1;EA=1;}/********************************************************/ void time0() interrupt 1{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;}}/*********************************************************/ void time1() interrupt 3{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;}}uchar key(){uchar temp;P3=0xff;temp=P3;if(temp!=0xff){delay_icc(30);P3=0xff;temp=P3;}return(temp);}void pout()//输出判定子函数{if((min==set1_dat[0])&&(hour==set1_dat[1]))P1=0x00;if((min==set2_dat[0])&&(hour==set2_dat[1]))P1=0xff;}/*********************/void main(){uchar key_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){case 1:if(set1_dat[0]<60)set1_dat[0]++;delay1ms(300);break;case 2:if(set1_dat[1]<23)set1_dat[1]++;delay1ms(300);break;case 3:if(set2_dat[0]<60)set2_dat[0]++;delay1ms(300);break;case 4:if(set2_dat[1]<23)set2_dat[1]++;delay1ms(300);break;case 5:if(min<60)min++;delay1ms(300);breakdefault:break;}}if(key_value==DEC_KEY){pout();switch(status){pout();case 1:if(set1_dat[0]>0)set1_dat[0]--;delay1ms(300);break;case 2:if(set1_dat[1]>0)set1_dat[1]--;delay1ms(300);break;case 3:if(set2_dat[0]>0)set2_dat[0]--;delay1ms(300);break;case 4:if(set2_dat[1]>0)set2_dat[1]--;delay1ms(300);break;case 5: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){case 0:P0=SEG7[sec%10];P2=ACT[5];break;case 1:P0=SEG7[sec/10];P2=ACT[4];break;case 2:P0=SEG7[min%10];P2=ACT[3];break;case 3:P0=SEG7[min/10];P2=ACT[2];break;case 4:P0=SEG7[hour%10];P2=ACT[1];break;case 5:P0=SEG7[hour/10];P2=ACT[0];break;default:break;}}if(status==1){ pout();switch(time_cnt){case 0:P0=SEG7[status];P2=ACT[0];break;case 1:P0=0xff;P2=ACT[1];break;case 2:P0=SEG7[set1_dat[0]%10];P2=ACT[3];break;case 3:P0=SEG7[set1_dat[0]/10];P2=ACT[2];break;default:if(bit_flag){P0=SEG7[set1_dat[0]%10];P2=ACT[3];} else P0=SEG7[set1_dat[0]/10];P2=ACT[2];break;}}if(status==2){ pout();switch(time_cnt){case 0:P0=SEG7[status];P2=ACT[0];break;case 1:if(set1_flag)P0=0xfb;else P0=0xff;P2=ACT[1];break;case 2:P0=SEG7[set1_dat[1]%10];P2=ACT[3];break;case 3: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){case 0:P0=SEG7[status];P2=ACT[0];break;case 1:P0=0xff;P2=ACT[1];break;case 2:P0=SEG7[set2_dat[0]%10];P2=ACT[3];break;case 3:P0=SEG7[set2_dat[0]/10];P2=ACT[2];break; default:if(bit_flag){P0=SEG7[set2_dat[0]%10];P2=ACT[3];} else P0=SEG7[set2_dat[0]/10];P2=ACT[2];break;}}if(status==4){switch(time_cnt){case 0:P0=SEG7[status];P2=ACT[0];break;case 1:if(set1_flag)P0=0xfb;else P0=0xff;P2=ACT[1];break;case 2:P0=SEG7[set2_dat[1]%10];P2=ACT[3];break;case 3: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){case 0:P0=SEG7[status];P2=ACT[0];break;case 1:P0=0xff;P2=ACT[1];break;case 2:P0=SEG7[min%10];P2=ACT[3];break;case 3:P0=SEG7[min/10];P2=ACT[2];break;default:if(bit_flag){P0=SEG7[min%10];P2=ACT[3];}else P0=SEG7[min/10];P2=ACT[2];break;}}}}参考文献:1、郭天祥,《新概念单片机C语言教程》,电子工业出版社,2003年2、童诗白华成英,《模拟电子技术基础》,高等教育出版社,2018年3、杨路明,《C语言程序设计教程》,北京邮电大学出版社,2007年4、胡汉才,《单片机接口技术》,清华大学出版社,2018年5、丁明亮唐前辉,《单片机应用设计与仿真》,北京航空航天大学出版社2018年。