嵌入式系统及应用实验设计

  • 格式:doc
  • 大小:6.15 MB
  • 文档页数:11

嵌入式系统及应用实验设计报告班级:网络工程1班姓名:马全武学号:1105020319一、设计简介本次设计为电子时钟,总共分为两个模块,第一个模块为时间显示模块,用来显示时、分、秒,并且可以调整到自己想要的时间,第二个模块为日期显示,可以显示年、月、日,可以根据当前的日期来调整显示。

注:本来想加入星期显示的可是最后没14天为循环日期总会出错,所以删除了放弃日期显示。

二、功能需求系统具备以下基本模块:2.1显示时间:能够显示正常的时分秒。

2.2调整时间:能够调整时间显示。

2.3显示日期:能够显示正常的年月日。

2.4调整日期:能够调整日期的显示。

2.5在显示日期中加入了平年闰年的判断和月份天数的判断。

三、规格说明本系统的所有显示均在八位数码管实现:1、时分秒的显示示例为12 23 40,其中第1位和第2位显示时,第3位不显示,第4位和第5位显示分,第6位不显示,第7位和第8位显示秒;2、年月日的显示示例为2015 06 20,其中第1位到第4位显示年份,第5位和第6位显示月份,第7位和第8位显示日期;3、时间的显示和日期的显示通过K1来切换;4、在时间显示状态下,通过K3来调整时的显示,每次按下,时+1,到24重置为0;通过K2来调整分的显示,每次按下分+1,秒置0,到60重置为0,时+1;5、在日期显示状态下,通过K2来调整的显示,每次按下,月份+1,当到达最大值12时,年份+1,因大月和小月的区别,再调整月份的过程中可能会出现6月31号的情况,所以在系统中又加入了日期判断模块,会判断当天数大于所调整的月份的最大天数时会自动置为当前月份的最大天数,如:当从5月31号,当按下K3时,日期会自动变为6月30号。

6、通过K3来调整日的显示,每次按下,年份+1;因大月和小月的区别,再调整月份的过程中可能会出现6月31号的情况,所以在系统中又加入了判断模块,会判断当天数大于所调整的月份的最大天数时会自动置为当前月份的最大天数,如:当从5月31号,当按下K3时,日期会自动变为6月30号。

7、至于如何判断当前年份的2月是28天还是29天呢?系统中添加了年份判断模块和日期判断模块、如平年或者闰年的判断,其中大小月份独立分开,另外若为闰年2月为29天,平年2月为28天。

四、构件设计1、功能流程图:开始K3天数判断时间显示日期显示年份判断时间设置日期设置1、时间和年份显示是通过参数show来控制当show=0显示时间show=1显示日期;2、时间显示和调整模块:while(1){LED_SEL=0;// week=check_week(year,month,day);//显示时间if(show==0){for(i=0;7*i<1000;i++){key=KEY_Scan();if(key==1){show=1;}if(key==2){minute++;second=0;if(minute==60){minute=0;}if(key==3){hour++;if(hour==24){hour=0;}}// SetLed(0,week);// delay_ms(1);SetLed(0,hour/10);delay_ms(1);PortationDisplay(1,hour%10);delay_ms(1);SetLed(2,minute/10);delay_ms(1);PortationDisplay(3,minute%10);delay_ms(1);SetLed(4,second/10);delay_ms(1);SetLed(5,second%10);delay_ms(1);}second++;if(second==60){second=0;minute++;}if(minute==60){minute=0;hour++;}if(hour==24){hour=0;day++;}if(day>dayl){day=1;month++;if(month>12){month=1;year++;}dayl=check_day(year,month);// week=check_week(year,month,day);}3、年份显示和调整模块:{for(i=0;9*i<1000;i++){key=KEY_Scan();if(key==1){show=0;}if(key==2){day++;if(day>check_day(year,month))day=1;week=check_week(year,month,day);}if(key==3){month++;if(day>check_day(year,month))day=check_day(year,month);week=check_week(year,month,day);if(month>12){year++;month=1;}week=check_week(year,month,day);}LED_SEL=0;SetLed(0,year/1000);delay_ms(1);SetLed(1,(year/100)%10);delay_ms(1);SetLed(2,((year/10)%100)%10); delay_ms(1);SetLed(3,((year%1000)%100)%10); delay_ms(1);SetLed(4,month/10);delay_ms(1);SetLed(5,month%10);delay_ms(1);SetLed(6,day/10);delay_ms(1);SetLed(7,day%10);delay_ms(1);LED_SEL=1;w(week);delay_ms(1);}second++;if(second==60){second=0;minute++;}if(minute==60){minute=0;hour++;}if(hour==24){hour=0;day++;}if(day>dayl){day=1;month++;}if(month>12){month=1;year++;dayl=check_day(year,month);week=check_week(year,month,day);}}}4、闰年判断:int check_year(int y){if((y % 4 == 0 && y % 100 != 0) ||y%400==0) return 1;elsereturn 0;}5、月份天数判断:int check_day(int y,int m){int a[12];if(check_year(y)==0){a[0]=31;a[2]=31;a[4]=31;a[6]=31;a[7]=31;a[9]=31;a[11]=31;a[1]=28;a[3]=30;a[5]=30;a[8]=30;a[10]=30;}else{a[0]=31;a[2]=31;a[4]=31;a[6]=31;a[7]=31;a[9]=31;a[11]=31;a[1]=29;a[3]=30;a[8]=30;a[10]=30;}return a[m-1];}五、系统集成与测试1、随机的闰年闰月;正常时间的显示;正常年份的显示;六、小结在了解了基础知识之后,我开始进行上机操作,当然,其中遇到很多的难题,很多东西都是第一次接触,幸好有书本和同学在旁边指导操作,仅仅两个简单的模块就做的很难。

然而坚持就是胜利,牙一咬眼一闭坚持做下去,而通过本次实验,我感觉收获还是蛮多的。

对于嵌入式的知识学习的还是不太多,但是这之外的东西收获颇丰。

它让我学会了如何通过自己的努力去认知一个新事物,更重要的是端正自己的学习态度,只有真正下功夫去学习,才能有收获,正所谓“一份耕耘,一份收获。

”没有付出,何谈回报呢?再者,通过本次实验,我也学会了如何去分析问题,如何找出自己设计中的不足,继而去排除解决问题,这就是一个自我学习的过程。

当我们通过实验去学习理论知识时,自己动手得出的结论,不仅能加深我们对嵌入式的理解,更能加深我们对此的记忆。

当然,在这其中,我也发现自己的许多不足之处,由于学期伊始我没有好好学习,才落到如此地步,这也可以说是一个教训吧!我相信在以后的学习工作中,我一定会端正自己的学习态度,一丝不苟的去对待每一件事。

只有做好足够的准备,才能事半功倍!七、附录1、外部中断初始化:void EXTIX_Init(void){RCC->APB2ENR|=1<<4; //使能PORTC时钟GPIOC->CRL&=0XFFFFFFF0;//PC0-2设置成输入GPIOC->CRL|=0X00000008;Ex_NVIC_Config(GPIO_C,0,FTIR);//下降沿触发MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);//抢占2,子优先级2,组2}2、初始化与LED连接的硬件接口:void LED_Init(void){RCC->APB2ENR|=1<<0; //使能AFIORCC->APB2ENR|=1<<3; //使能PORTB时钟RCC->APB2ENR|=1<<6; //使能PORTE时钟AFIO->MAPR |= 0x02000000; //设置PB.3为I/O口可用,且可以SW仿真// GPIOB->CRL &= 0xFFFF0FFF;// GPIOB->CRL |= 0x00003000; //PB.3推挽输出// GPIOB->ODR |= 0x00000008; //PB.3输出高GPIOB->CRL &= 0xFFFF0000;GPIOB->CRL |= 0x00003333; //PB.3推挽输出GPIOB->ODR |= 0x000000FF; //PB.3输出高GPIOE->CRH&=0X00000000;GPIOE->CRH|=0X33333333; //PE.8-15推挽输出GPIOE->ODR|=0x00000000; //PE.8-15输出低}3、延时初始化:void delay_init(u8 SYSCLK){SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟HCLK/8 fac_us=SYSCLK/8;fac_ms=(u16)fac_us*1000;}。