嵌入式课程设计报告具有日历功能电子时钟.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 课程设计 报告 具有 日历 功能 电子 时钟
- 资源描述:
-
嵌入式系统开发 课程设计专周报告 题目: 具有日历功能的电子时钟 系别及专业: 计算机工程系 计算机应用技术 班级: 10511 学生姓名: 权胜(14) 王希(05) 严家强(23) 指导老师: 宋国明 完成时间: 2012-12-24/2012-12-28 课程设计(报告) Ⅰ、课程设计题目:具有日历功能的电子时钟 Ⅱ、课程设计步骤及内容 一、课程设计目标 1、培养综合运用知识和独立开展实践创新的能力; 2、培养学生将理论知识与实际应用结合在一起; 3、培养学生的自我学习能力和解决问题的能力; 4、培养学生的协作意识和团队合作能力; 5、培养学生的总结经验的能力。 二、研究方法及手段应用 1、问题解决模块化,将任务分成若干模块,分模块调试和完成任务; 2、查阅网上的相关素材,查阅相关论文资料,进行比较、研究; 3、在独立思考的基础上,请教老师,和同组同学讨论、学习; 4、反复调试、总结经验、排除差错; 5、连接PC和EDUKIT-III ARM嵌入式开发实验箱,完成整个实验环境搭建; 6、运用μVision4和超级终端软件进行软件编译和进行调试查看; 7、使用ULINK2仿真器下载至实验箱进行观察、调试。 三、课程设计预期效果 1、程序启动后,蜂鸣器响三声,8位LED数码管显示初始值“0”,1秒后显示当前日期和时间,日期格式:****年**月**日,时间格式:*(星期)-**时**分**秒。PC机超级终端同时显示相关的信息。 2、按下“D”键,可进行日期、时间的修改、设置:有按键时,把键值显示到最右侧,后续按键时,把以前的按键左移,把当前按键值显示到最右侧数码管。设置完毕后,按“FUN”键确认,退出设置,时钟显示修改后的时间。 3、显示控制和闹钟设置: 按键“*”,进行数码管闪烁/不闪烁的切换。 按键“A”,设置闹钟时间。时间到达后,闹铃(蜂鸣器)响,按“FUN”键,关闭闹铃。 按键设置时,PC的超级终端显示相应的提示信息,同时把所按的键值,通过串口发送到超级终端显示。 4、闹铃声音频率及音量控制: 按下“B”键时,进入闹铃声音的设置。 采集AIN2的ADC值,根据ADC的值,控制蜂鸣器的声音频率。控制PWM1的频率。(为100Hz 至1KHz,最低值和最高值可以根据实际效果调整)。并把实际调整的频率打印到超级终端,如“100Hz”。 采集AIN1的ADC值,根据ADC的值,控制蜂鸣器的音量。控制PWM1的占空比。(为0% 至100%,最低值和最高值可以根据实际效果调整).并把实际调整的占空比打印到超级终端上,如“50%”。 按“FUN”键结束设置。 学生姓名: 权胜 王希 严家强 专业年级: 计算机应用技术10511 目录 前言 5 第一章系统设计 6 第一节课题目标及总体方案 6 第二节项目设计模块描述及流程图 5 1、模块描述 6 2、总体设计流程图 6 3、功能设计流程图 7 4、闹钟功能程序流程图 8 一、主函数模块 9 二、功能实现模块 10 1、8个LED灯的按位显示程序 10 2、获取系统时间 11 3、*键功能实现 12 4、按键判断函数 12 5、时间及日期设置 13 6、闪烁/不闪烁切换函数 17 7、发声函数 18 8、键值对应到键盘函数 18 9、中断函数 19 三、闹钟功能实现模块 20 1、A键设置闹钟功能实现 20 2、闹钟设置函数 21 3、闹铃函数 23 第二章 结果与显示 24 结果显示 24 心得体会 24 参考文献 25 前 言 近年来,随着计算机技术及集成电路技术的发展,嵌入式技术日渐普及,在通讯、网络、工控、医疗、电子等领域发挥着越来越重要的作用。嵌入式系统无疑成为当前最热门最有发展前途的IT应用领域之一。 实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。RTC具有计时准确、耗电低和体积小等特点,特别适用于在各种嵌入式系统忠记录事件发生的时间和相关信息,尤其是在通信工程、电力自动化、工业控制等自动化程度较高领域的无人职守环境。随着集成电路技术的不断发展,RTC器件的新品也不断推出。这些新品不仅具有准确的RTC,还有大容量的存储器、温度传感器和A/D数据采集通道等,已成为集RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。 关键字:嵌入式系统、实时时钟RTC 第一章系统设计 第一节课题目标及总体方案 随着嵌入式技术的发展,我们身边充斥着各类各样的嵌入式电子产品。实时时钟(RTC)就是一种在现代电子设备中应用非常普遍,可以帮助人们实时、准确的掌握时间的器件,如手机、PDA及一些智能仪表都提供了时钟显示。 我们本次课题的目标就是要基于SAMSUNG S3C2410AL-20芯片设计出一个实时时钟,编写C语言可以通过μVision4和超级终端软件调试,然后通过ULINK2仿真器下载至实验箱内进行观察。在试验箱中的LED显示灯上显示出时间和日历。另外,我们将要实现的系统分为三个模块实现,每个模块间相对独立而又相互联系。 第二节项目设计模块描述及流程图 1.模块描述:我先进行了整个系统的规划,将整个系统分为两大模块:第一,主函数模块;第二,功能实现模块(进行时间和闹钟的设定,以及其他一些显示功能);第三,闹钟功能实现模块。 2.总体设计流程图: 开始 课程目标确定 总体方案规划 流程图设计 查阅资料 模块化设计 编译程序 仿真 硬件观察调试 得到预期效果 优化 结束 N Y 3、功能设计流程图 开始 程序主界面 0按键 1按键 D按键 A按键 *按键 显示时间 显示日期 时间设置 设置闹钟 闪烁显示 按FUN键确认 再按*不闪烁 显示系统时间 结束 N N N N 4、闹钟功能程序流程图 开始 程序主界面 到达闹铃时间 设置闹钟 FUN键确定 闹铃响 FUN键停止 显示系统时间 结束 A键按下? N N Y Y 一、主函数模块 int i; int main(int argc,char **argv) { sys_init(); //初始化系统 iic_init_8led(); //初始化8个led灯 for(i=0;i<8;i++) { iic_write_8led(0x70, 0x10+i,0xfc); //8个灯全0 } for(i=0;i<3;i++) { jiao(); //调用发声函数 delay(5000); } uart_printf("欢迎使用具有日历功能的电子时钟\n请根据提示按键操作\n0键:显示时钟\n1键:显示日期\nA键:设置闹钟\nD键:设置日期时间\n*键:数码管闪烁/不闪烁的切换\n"); rtc_init(); //实时时钟初始化 rtc_display1(); //显示时间 while(1){ rtc_init(); display(); } } 二、功能实现模块 1、8个LED灯的按位对应显示程序 void display_Time(void) //对应到8个LED灯按位显示 { iic_init_8led(); //显示时间 iic_write_8led(0x70, 0x10+0, num[g_nHour%16]); iic_write_8led(0x70, 0x10+1, num[g_nHour/16]); iic_write_8led(0x70, 0x10+2, 0x02); iic_write_8led(0x70, 0x10+3, num[g_nWeekday]); iic_write_8led(0x70, 0x10+4, num[g_nSec%16]); iic_write_8led(0x70, 0x10+5, num[g_nSec/16]); iic_write_8led(0x70, 0x10+6, num[g_nMin%16]); iic_write_8led(0x70, 0x10+7, num[g_nMin/16]); } void display_data(void) { iic_init_8led(); //显示日期 iic_write_8led(0x70, 0x10+0, num[g_nYear%4096%256%16]);//取个位 iic_write_8led(0x70, 0x10+1, num[g_nYear/16%16]);//取十位 iic_write_8led(0x70, 0x10+2, num[g_nYear/256%16]);//取百位 iic_write_8led(0x70, 0x10+3, num[g_nYear/4096]);//取千位 iic_write_8led(0x70, 0x10+4, num[g_nDate%16]); iic_write_8led(0x70, 0x10+5, num[g_nDate/16]); iic_write_8led(0x70, 0x10+6, num[g_nMonth%16]); iic_write_8led(0x70, 0x10+7, num[g_nMonth/16]); } 2、获取系统时间 void rtc_display1(void) { int a; INT32T nTmp; rRTCCON = 0x01; ucChar=0; st1=1; //代表正在显示时钟 st1=2代表正在显示日期 while(ucChar>29||ucChar<=0) { iic_init_8led(); while(1) { if(rBCDYEAR==0x99) //获取系统日期及时间 g_nYear = 0x1999; else g_nYear = 0x2000 + rBCDYEAR; g_nMonth = rBCDMON; g_nWeekday = rBCDDAY; g_nDate = rBCDDATE; g_nHour = rBCDHOUR; g_nMin = rBCDMIN; g_nSec = rBCDSEC; if(g_nSec!=nTmp) // 相同时间不显示 节约资源 { nTmp = g_nSec; break; } } 3、*键功能实现 if(st2==1){ //按*键执行闪烁 for(a=0;a<8;a++){ iic_write_8led(0x70,0x10+a,0x00); //8个灯熄灭 } delay(1000);//延时1s display_Time(); //再显示 }else{ display_Time();//未按下不变 } 4、按键判断函数 void display(void) { if(ucChar==0x01){ //判断是否按下0键 uart_printf("\n按键0,数码管显示时间:\n"); rtc_display1();//显示时间函数 } else if(ucChar==0x02){ //判断是否按下1键 uart_printf("\n按键1,数码管显示日期:\n"); rtc_display2();//显示日期函数 } else if(ucChar==0x14){ //判断是否按下D键 uart_printf("\n按下键D,进入日期设置,请先输入日期(格式 年年年年月月日日)。输入完成后按fun键确认。\n"); setDate();//设置时间函数 } else if(ucChar==0x1c){ //判断是否按下*键 if(st3==1){ //若按下*键,数码管闪烁显示 uart_printf("\n按下键*,数码管停止闪烁显示。\n"); st3=0; ss(); //调用闪烁/不闪烁切换 }else{ //再次按下*键,数码管停止闪烁 uart_printf("\n按下键*,数码管闪烁显示。\n"); st3=1; ss(); } } else if(ucChar==0x11){ //判断是否按下A键 uart_printf("\n按下键A,设置闹钟。请输入闹钟时间,按fun键确认。\n"); isAlam=1;//已设置了闹钟 alam_jiao();//调用闹铃函数 } else if(st1==1){ //判断当前是否显示时间,调用显示时间函数 rtc_display1(); } else if(st1==2){ //判断当前是否显示日期,调用显示日期函数 rtc_display2(); } } 5、时间及日期设置函数 void setDate(void) { int i,u; ucChar=0; for(u=0;u<8;u++){ iic_write_8led(0x70,0x10+u,0x00); //灯灭 } i=0; while(1) { iic_init_8led(); while(g_nKeyPress--) {keyboard_init(); g_nKeyPress = 0;//按键值置0 while(g_nKeyPress == 0);//空循环,等待有键按下 iic_read_keybd(0x70, 0x1, &ucChar); if(i==8||i==17){ //判断日期和时间输入完成 while(1){ while(g_nKeyPress--){ keyboard_init(); g_nKeyPress=0; while(g_nKeyPress==0); iic_read_keybd(0x70, 0x1, &ucChar); ucChar=key_set(ucChar); if(ucChar==0xff){ //按下FUN键确认 if(i==8){ uart_printf("\n完成日期设置,继续设置时间(格式 星期-时时分分秒秒)\n"); }else{ uart_printf("\n完成时间设置。\n"); } i++; break; } } if(i==9||i==18){//输入超出,跳出程序 break; } } } if(ucChar != 0)//判断是否有键按下,并对应LED灯8位按位显示 { ucChar= key_set(ucChar); switch(i){ case 0: iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nYear=ucChar*4096; //设置年 i++; break; case 1: iic_write_8led(0x70, 0x10+5, num[g_nYear/4096]); iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nYear=g_nYear+ucChar*256; i++; break; case 2: iic_write_8led(0x70, 0x10+6, num[g_nYear/4096]); iic_write_8led(0x70, 0x10+5, num[g_nYear/256%16]); iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nYear=g_nYear+ucChar*16; i++; break; case 3: iic_write_8led(0x70, 0x10+7, num[g_nYear/4096]); iic_write_8led(0x70, 0x10+6, num[g_nYear/256%16]); iic_write_8led(0x70, 0x10+5, num[g_nYear/16%16]); iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nYear=g_nYear+ucChar; i++; break; case 4: iic_write_8led(0x70, 0x10+0, num[g_nYear/4096]); iic_write_8led(0x70, 0x10+7, num[g_nYear/256%16]); iic_write_8led(0x70, 0x10+6, num[g_nYear/16%16]); iic_write_8led(0x70, 0x10+5, num[g_nYear%4096%256%16]); iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nMonth=ucChar*16;//设置月 i++; break; case 5: iic_write_8led(0x70, 0x10+1, num[g_nYear/4096]); iic_write_8led(0x70, 0x10+0, num[g_nYear/256%16]); iic_write_8led(0x70, 0x10+7, num[g_nYear/16%16]); iic_write_8led(0x70, 0x10+6, num[g_nYear%4096%256%16]); iic_write_8led(0x70, 0x10+5, num[g_nMonth/16]); iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nMonth= g_nMonth+ucChar; i++; break; case 6: iic_write_8led(0x70, 0x10+2, num[g_nYear/4096]); iic_write_8led(0x70, 0x10+1, num[g_nYear/256%16]); iic_write_8led(0x70, 0x10+0, num[g_nYear/16%16]); iic_write_8led(0x70, 0x10+7, num[g_nYear%4096%256%16]); iic_write_8led(0x70, 0x10+6, num[g_nMonth/16]); iic_write_8led(0x70, 0x10+5, num[g_nMonth%16]); iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nDate=ucChar*16;//设置日 i++; break; case 7: iic_write_8led(0x70, 0x10+3, num[g_nYear/4096]); iic_write_8led(0x70, 0x10+2, num[g_nYear/256%16]); iic_write_8led(0x70, 0x10+1, num[g_nYear/16%16]); iic_write_8led(0x70, 0x10+0, num[g_nYear%4096%256%16]); iic_write_8led(0x70, 0x10+7, num[g_nMonth/16]); iic_write_8led(0x70, 0x10+6, num[g_nMonth%16]); iic_write_8led(0x70, 0x10+5, num[g_nDate/16]); iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nDate=g_nDate+ucChar; i++; break; case 9: for(u=0;u<8;u++){ iic_write_8led(0x70,0x10+u,0x00);//8个灯灭 } i++; break; case 10: iic_write_8led(0x70, 0x10+5, num[ucChar]); iic_write_8led(0x70, 0x10+4, 0x02); g_nWeekday=ucChar;//设置星期 i++; break; case 11: iic_write_8led(0x70, 0x10+6, num[g_nWeekday]); iic_write_8led(0x70, 0x10+5, 0x02); iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nHour=ucChar*16;//设置小时 i++; break; case 12: iic_write_8led(0x70, 0x10+7, num[g_nWeekday]); iic_write_8led(0x70, 0x10+6, 0x02); iic_write_8led(0x70, 0x10+5, num[g_nHour/16]); iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nHour=g_nHour+ucChar; i++; break; case 13: iic_write_8led(0x70, 0x10+0, num[g_nWeekday]); iic_write_8led(0x70, 0x10+7, 0x02); iic_write_8led(0x70, 0x10+6, num[g_nHour/16]); iic_write_8led(0x70, 0x10+5, num[g_nHour%16]); iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nMin=ucChar*16;//设置分钟 i++; break; case 14: iic_write_8led(0x70, 0x10+1, num[g_nWeekday]); iic_write_8led(0x70, 0x10+0, 0x02); iic_write_8led(0x70, 0x10+7, num[g_nHour/16]); iic_write_8led(0x70, 0x10+6, num[g_nHour%16]); iic_write_8led(0x70, 0x10+5, num[g_nMin/16]); iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nMin=g_nMin+ucChar; i++; break; case 15: iic_write_8led(0x70, 0x10+2, num[g_nWeekday]); iic_write_8led(0x70, 0x10+1, 0x02); iic_write_8led(0x70, 0x10+0, num[g_nHour/16]); iic_write_8led(0x70, 0x10+7, num[g_nHour%16]); iic_write_8led(0x70, 0x10+6, num[g_nMin/16]); iic_write_8led(0x70, 0x10+5, num[g_nMin%16]); iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nSec=ucChar*16;//设置秒钟 i++; break; case 16: iic_write_8led(0x70, 0x10+3, num[g_nWeekday]); iic_write_8led(0x70, 0x10+2, 0x02); iic_write_8led(0x70, 0x10+1, num[g_nHour/16]); iic_write_8led(0x70, 0x10+0, num[g_nHour%16]); iic_write_8led(0x70, 0x10+7, num[g_nMin/16]); iic_write_8led(0x70, 0x10+6, num[g_nMin%16]); iic_write_8led(0x70, 0x10+5, num[g_nSec/16]); iic_write_8led(0x70, 0x10+4, num[ucChar]); g_nSec=g_nSec+ucChar; i++; break; case 18: rRTCCON = rRTCCON & ~(0xf) | 0x1;// No reset, Merge BCD counters, 1/32768, RTC Control enable rBCDYEAR = rBCDYEAR & ~(0xff) | g_nYear; rBCDMON = rBCDMON & ~(0x1f) | g_nMonth; rBCDDAY = rBCDDAY & ~(0x7) | g_nWeekday; rBCDDATE = rBCDDATE & ~(0x3f) | g_nDate; rBCDHOUR = rBCDHOUR & ~(0x3f) | g_nHour; rBCDMIN = rBCDMIN & ~(0x7f) | g_nMin; rBCDSEC = rBCDSEC & ~(0x7f) | g_nSec; rRTCCON = 0x0; rtc_display1(); //显示时间函数 break; } } } } } 6、闪烁/不闪烁切换函数 void ss(void){ if(st3==0){//若按下*键 if(st1==1){ //判断当前是否显示时间,调用显示时间函数 st2=0; rtc_display1(); }else if(st1==2){ //判断当前是否显示日期,调用显示日期函数 st2=0; rtc_display2(); } }else{//未按下键,再次判断显示日期还是时间,再进行调用当前显示函数 if(st1==1){ st2=1; rtc_display1(); }else if(st1==2){ st2=1; rtc_display2(); } } } 7、发声函数 void jiao() { int u; rGPFCON=0x5500; rGPFUP=0; rGPBCON = rGPBCON & 0xFFFFFC|1; rGPBDAT &= 0xFFFFFE; rGPFDAT=0;//初始化蜂鸣器设置 for(u=0;u<100000;u++); rGPFDAT=0xF0; for(u=0;u<100000;u++); delay(5000);//延时5s rGPBDAT |= 1; delay(5000); rGPFCON = 0x55aa; } 8、键值对应到键盘函数 UINT8T key_set(UINT8T ucChar) { switch(ucChar) { case 1: case 2: case 3: case 4: case 5: ucChar-=1; break; case 9: case 10: case 11: case 12: case 13: ucChar-=4; break; case 17: case 18: case 19: case 20: case 21: ucChar-=7; break; case 25: ucChar = 0xF; break; case 26: ucChar = '+'; break; case 27: ucChar = '-'; break; case 28: ucChar = '*'; break; case 29: ucChar = 0xFF; break; default: ucChar = 0; } return ucChar; } 9、中断函数 void __irq rtc_int0_int(void) { ClearPending(BIT_EINT0); rRTCRST = (1<<3) | 3; than 30 g_nSec } void __irq rtc_int(void)//到达设定闹钟时间,触发中断 { int i; ClearPending(BIT_RTC); f_nIsRtcInt = 1; } void __irq rtc_tick(void) { ClearPending(BIT_TICK); f_unTickCount++; } 三、闹钟功能实现模块 1、A键设置闹钟功能实现 if(isAlam==1){ //按下A键设置闹钟 //在超级终端上显示 已设定的闹钟为- uart_printf(" %x:%x:%x %s,%x/%x/%x 已设定闹钟 %x:%x:%x,%x/%x/%x\r",g_nHour,g_nMin,g_nSec,day[g_nWeekday],g_nMonth,g_nDate,g_nYear,rALMHOUR,rALMMIN,rALMSEC,rALMYEAR,rALMMON,rALMDATE); if(f_nIsRtcInt==1){ //判断到了设定的闹钟 f_nIsRtcInt==0; //到了闹钟时间久置为初始值 isAlam=0;//将设置的闹钟置0(已设置闹钟) uart_printf("\n闹钟叫了,请按FUN键停止。\n"); naoz();//调用闹钟函数 } }else{ //未按下A键就不变 uart_printf(" %x:%x:%x %s,%x/%x/%x\r",g_nHour,g_nMin,g_nSec,day[g_nWeekday],g_nMonth,g_nDate,g_nYear); } keyboard_init();//接受键盘的输入,并且将值放在ucChar g_nKeyPress = 0; iic_read_keybd(0x70, 0x1, &ucChar); } display();//按键判断函数 rRTCCON = 0x0; // No reset, Merge BCD counters, 1/32768, RTC Control disable(for power consumption) } void naoz(void){//闹钟函数 int i; while(1){ //闹钟响后,按FUN键停止 while(g_nKeyPress--){ keyboard_init();//接受键盘的输入,并且将值放在ucChar g_nKeyPress=0; iic_read_keybd(0x70, 0x1, &ucChar); ucChar=key_set(ucChar); if(ucChar==0xff){ //按下FUN键 ucChar=0; //给按键值置0 uart_printf("\n闹钟已停止。\n"); return展开阅读全文

咨信网声明:本文档由用户上传并分享,仅供学习交流、研究之用,未经授权,严禁复制、发行、汇编、翻译或网络传播等,侵权必究。
咨信网小贴示:
1、浏览或下载可查看了解,请点击【咨信网告知】。
2、下载文件中如有侵权或不适当内容,将立即纠正。
3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
4、开具发票登录电脑端申请,请点击【索取发票】。
咨信网客服组:【微信客服】
1、浏览或下载可查看了解,请点击【咨信网告知】。
2、下载文件中如有侵权或不适当内容,将立即纠正。
3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
4、开具发票登录电脑端申请,请点击【索取发票】。
咨信网客服组:【微信客服】


嵌入式课程设计报告具有日历功能电子时钟.doc
















自信AI助手














微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/9628200.html