《嵌入式系统原理及应用课程设计(共13页).doc》由会员分享,可在线阅读,更多相关《嵌入式系统原理及应用课程设计(共13页).doc(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上嵌入式系统原理及应用课程设计报告题 目:电子时钟的设计与实现 班 级:文专电0931 姓 名:杨 阳 学 号:5 试验台号:10 指导老师:邱秀芹 程序成绩: 报告成绩: 总 成 绩:优 良 中 及格 不及格2012年2月25日一课程设计目的通过该课程设计将嵌入式系统原理及应用课程中所学的处理器和接口等技术应用于实际设计中。通过中断、PWM定时器、串口、SIO、GPIO等技术在实验平台上进行综合设计,在理论和实验的基础上进一步提高综合设计能力。二. 课程设计内容及功能要求1. 通过一个PWM定时计数器,采用定时中断的功能,设计能够在LED上进行时分秒显示的时钟;2.
2、通过键盘实现对钟的功能;3. 实现闹钟的功能,闹钟的时间由键盘输入进行设定;4. 将时钟在超级终端上显示;时间的设定可以通过超级终端实现;三功能实现1.总体功能框图开始设置中断72中断到时钟运转键盘按下键值时钟设置闹钟设置闹钟判断 显示控制 N Y Y 2.详细设计:(将所设计的各部分的功能程序框图及相关程序代码进行详细的描述) #includeuhal.h#includemyuart.h#includeKeyBoard.h#includeTimer.h#includeIsr.h#include44b.h#include Zlg7289.h#include def.h#include lcd3
3、20.hint Timer3INTCount=0;int hour = 0 ;int minute = 0 ;#pragma import(_use_no_semihosting_swi) / ensure no functions that use semihosting int main(void) int clock_h = 23 ; int clock_m = 59 ; int clock_s = 0 ; int key ; int val=0; ARMTargetInit();/开发版初始化 Zlg7289_Reset(); Init_Timer3(100,16,40000,2000
4、0); INTS_OFF();/Disable interrupt in PSR SetISR_Interrupt(INT_TIMER3_OFFSET, Timer3_ISR,0); Open_INT_GLOBAL(); Open_INT(BIT_TIMER3); INTS_ON();/Enable interrupt in PSR Start_Timer3(); Uart_Printf(n); /lcd屏*lcd屏*lcd屏* LCD_Init(); LCD_ChangeMode(DspTxtMode);/转换LCD显示模式为文本显示模式 /lcd屏*lcd屏*lcd屏* while(1)
5、/*对钟*/ while(!(rPDATG&ZLG7289_KEY) /有按键按下时进入while死循环,松开时跳出 key=Zlg7289_ReadKey(); /按键值赋给key 。/ Stop_Timer3() ; /防止中断影响键盘扫描,关掉中断。 Delay(100); /延时防止时序错误。 if( key = 18 | key = 10 | key = 2 ) /对钟键按下是。 if( key = 18) /秒设置,键盘3按下时扫描值为18 Delay(1000);Delay(1000);Delay(1000); /延时让数码管频率显示可见。 Delay(1000);Delay(1
6、000);Delay(1000); Timer3INTCount = Timer3INTCount + 1 ; if(Timer3INTCount59) Timer3INTCount = 0 ; if( key = 10 ) /秒设置,键盘2按下时扫描值为10 Delay(1000);Delay(1000);Delay(1000); /延时让数码管频率显示可见。 Delay(1000);Delay(1000);Delay(1000); minute = minute + 1 ; /分钟加一 if(minute 59 ) /分钟大于59时清零 minute = 0 ; / Timer3INTCo
7、unt = 0 ; /秒清零 if( key =2 ) /原理同分钟 Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); hour = hour + 1 ; if(hour 23 ) hour = 0 ; / Timer3INTCount = 0 ; Delay(1000); LED_Display(Timer3INTCount , minute , hour); /在数码管显示时分秒 Uart_Printf(%d:%d:%d
8、n,hour,minute,Timer3INTCount); /在超级终端显示时分秒 /闹钟设置*闹钟设置*闹钟设置* else if( key =1 key = 9| key = 17 ) /原理参照对钟设置 if( key = 1) Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); clock_h = clock_h + 1 ; if( clock
9、_h 23 ) clock_h = 0 ; if( key =9 ) Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); clock_m = clock_m + 1 ; if( clock_m 59 ) clock_m = 0 ; if( key = 17 ) Delay(1000);Delay(1000);Delay(1000); Delay(1000
10、);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000); LED_Display(clock_s , clock_m , clock_h); Uart_Printf(%d:%d:%dn,hour,minute,Timer3INTCount); else ; /闹钟设置*闹钟设置*闹钟设置* / Start_Timer3(); /闹钟判断*闹钟判断*闹钟判断* while( hour = clock_h & minute = c
11、lock_m & key != 1 & key != 9 & key != 17 & key != 2 & key != 10 & key != 18 ) / 闹钟时间到且闹钟启动时,进入下面的闹钟显示 / Uart_Printf( time is over ! geting up now ! n ); LCD_printf( time is over ! geting up now ! n ); Delay(1000); LED_Display(clock_s , clock_m , clock_h); /闹钟判断*闹钟判断*闹钟判断* Uart_Printf(%d:%d:%dn,hour,
12、minute,Timer3INTCount); Delay(1000); LED_Display(Timer3INTCount , minute , hour); / Uart_Printf(r%d ,rTCNTO3); Delay(1000); Delay(1000); Delay(1000); Delay(1000); Delay(1000); Delay(1000); #include Timer.h#include 44b.h#include def.h#include ZLG7289.hextern Timer3INTCount , hour , minute ;void Init_
13、Timer3(U8 prescaler1,U8 divider3,U16 countb3,U16 compb3) U8 div; switch(divider3) case 2: div=0x00;break; case 4: div=0x01;break; case 8: div=0x02;break; case 16: div=0x03;break; default: div=0x00; /prescaler1 is for timer2&3 /Fre(Timer)=MCLK/(prescaler+1)/divider rTCFG0&=(0xff8); rTCFG0|=(prescaler
14、18); /All interrupt,select MUX input for TimerN rTCFG1&=(0x0f24|0x0f12); rTCFG1|=(div12); rTCMPB3=compb3; rTCNTB3=countb3; rTCON|=(0x0119);/Auto reloadvoid Start_Timer3(void) rTCON|=(0x0117);/Manual Update rTCON&=(0x0118);/Inverter off rTCON|=(0x0116);/Start Timer3 rTCON&=(0x0117);/Must clear Manual
15、 update bitvoid Stop_Timer3(void)rTCON&=(0x0159) /秒累加到59时清零 Timer3INTCount=0; minute = minute + 1 ; if(minute 59) /分钟累加到59时清零 minute = 0 ; hour = hour + 1 ; if(hour23) /小时累加到23时清零 hour=0 ; / LED_Display(Timer3INTCount , minute , hour);/ Uart_Printf(r%d ,Timer3INTCount); #include 44b.h#includeuhal.h#
16、include zlg7289.h#include def.hint Zlg7289SIOBand;int Zlg7289SIOCtrl;void Zlg7289_Reset()ZLG7289_ENABLE();WriteSDIO(ZLG7289_CMD_RST);ZLG7289_DISABLE();Delay(20);unsigned int Zlg7289_ReadKey()unsigned int key;ZLG7289_ENABLE();WriteSDIO(ZLG7289_CMD_RDKEY);key=ReadSDIO();ZLG7289_DISABLE();return key;vo
17、id LED_Display(unsigned int value , unsigned int m , unsigned int h) unsigned char LED8; int i ; if(value9999)return;/无用 /秒显示* for(i=0;i2;i+) LEDi=value%10; / 分离秒个位 value=value/10; / 分离秒十位 if(value=0)break; ZLG7289_ENABLE(); Delay(5); WriteSDIO(ZLG7289_CMD_HIDE); WriteSDIO(0xff=0;i-) /八位循环显示 WriteSD
18、IO(ZLG7289_CMD_DATA0|i); WriteSDIO(LEDi); Delay(1); /秒显示* / 分钟显示 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa for(i=3;i5;i+) LEDi=m%10; / 分离分钟个位 m=m/10; / 分离分钟十位 if(m=0)break; ZLG7289_ENABLE(); Delay(5); WriteSDIO(ZLG7289_CMD_HIDE); WriteSDIO(0xff=0;i-) /八位循环显示 LED2 = 10 ; LED5 = 10 ; WriteSDIO(ZLG728
19、9_CMD_DATA0|i); WriteSDIO(LEDi); Delay(1); / 分钟显示 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa / 小时显示 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa LED7 = 0 ; for(i=6;i8;i+) LEDi=h%10; / 分离小时个位 h=h/10; / 分离小时十位 if(h=0) i=7 ; break; ZLG7289_ENABLE(); Delay(5); WriteSDIO(ZLG7289_CMD_HIDE); WriteSDIO(0xff=0
20、;i-) /八位循环显示 LED2 = 10 ; /时钟横杠显示 LED5 = 10 ; /时钟横杠显示 WriteSDIO(ZLG7289_CMD_DATA0|i); WriteSDIO(LEDi); Delay(1); / 小时显示 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ZLG7289_DISABLE();四总结(1)任务要求:把时钟设置中调整原小时1键改成0键,把原调整分钟2键改成.键,把原调整秒3键改成ENTER键把闹钟设置中调整原小时4键改成num键,把原调整5键改成/键,把原显示闹钟6键改成*键(2)调整后的程序为/*对钟*/ while(
21、!(rPDATG&ZLG7289_KEY) /有按键按下时进入while死循环,松开时跳出 key=Zlg7289_ReadKey(); /按键值赋给key 。/ Stop_Timer3() ; /防止中断影响键盘扫描,关掉中断。 Delay(100); /延时防止时序错误。 if( key = 26 | key = 19 | key = 11 ) /对钟键按下是。 if( key = 26) /秒设置,键盘ENTER按下时扫描值为26 Delay(1000);Delay(1000);Delay(1000); /延时让数码管频率显示可见。 Delay(1000);Delay(1000);Del
22、ay(1000); Timer3INTCount = Timer3INTCount + 1 ; if(Timer3INTCount59) Timer3INTCount = 0 ; if( key = 19 ) /秒设置,键盘.按下时扫描值为19 Delay(1000);Delay(1000);Delay(1000); /延时让数码管频率显示可见。 Delay(1000);Delay(1000);Delay(1000); minute = minute + 1 ; /分钟加一 if(minute 59 ) /分钟大于59时清零 minute = 0 ; / Timer3INTCount = 0
23、; /秒清零 if( key =11 ) /原理同分钟 Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); hour = hour + 1 ; if(hour 23 ) hour = 0 ; / Timer3INTCount = 0 ; Delay(1000); LED_Display(Timer3INTCount , minute , hour); /在数码管显示时分秒 Uart_Printf(%d:%d:%dn,hour,
24、minute,Timer3INTCount); /在超级终端显示时分秒 /闹钟设置*闹钟设置*闹钟设置* else if( key = 4 | key = 12 | key = 20 ) /原理参照对钟设置 if( key = 4 ) Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); clock_h = clock_h + 1 ; if( clock_
25、h 23 ) clock_h = 0 ; if( key =12 ) Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); clock_m = clock_m + 1 ; if( clock_m 59 ) clock_m = 0 ; if( key = 20 ) Delay(1000);Delay(1000);Delay(1000); Delay(1000
26、);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000);Delay(1000);Delay(1000); Delay(1000); LED_Display(clock_s , clock_m , clock_h); Uart_Printf(%d:%d:%dn,hour,minute,Timer3INTCount); else ;( 3 ) 通过中断、PWM定时器、串口、SIO、GPIO等技术在实验平台上进行综合设计使自己提高了对这门课程的认识,同时更加深了对PWM定时器所实现的功能的了解。 通过以上程序的修改实现了利用“0键”“、键”“ENTER键”对时钟的调整,以及利用“number键”“/键”“*键”对闹钟的调整与查看。通过对实践任务的完成,更加了解熟悉了程序的编译过程以及实现过程。通过对试验箱的操作实践中,使我们的动手能力有了更好的提高。专心-专注-专业