当前位置:文档之家› 嵌入式系统原理及应用课程设计

嵌入式系统原理及应用课程设计

嵌入式系统原理及应用课程设计报告题目:电子时钟的设计与实现班级:文专电0931*****学号:************试验台号:10指导老师:***程序成绩:报告成绩:总成绩:优良中及格不及格2012年2月25日一.课程设计目的通过该课程设计将嵌入式系统原理及应用课程中所学的处理器和接口等技术应用于实际设计中。

通过中断、PWM定时器、串口、SIO、GPIO等技术在实验平台上进行综合设计,在理论和实验的基础上进一步提高综合设计能力。

二. 课程设计内容及功能要求1. 通过一个PWM定时计数器,采用定时中断的功能,设计能够在LED上进行时分秒显示的时钟;2. 通过键盘实现对钟的功能;3. 实现闹钟的功能,闹钟的时间由键盘输入进行设定;4. 将时钟在超级终端上显示;时间的设定可以通过超级终端实现;三.功能实现1.总体功能框图2.详细设计:(将所设计的各部分的功能程序框图及相关程序代码进行详细的描述)①.#include"uhal.h"#include"myuart.h"#include"KeyBoard.h"#include"Timer.h"#include"Isr.h"#include"44b.h"#include "Zlg7289.h"#include "def.h"#include "lcd320.h"int Timer3INTCount=0;int hour = 0 ;int minute = 0 ;#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihostingint 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,20000);INTS_OFF();//Disable interrupt in PSRSetISR_Interrupt(INT_TIMER3_OFFSET, Timer3_ISR,0);Open_INT_GLOBAL();Open_INT(BIT_TIMER3);INTS_ON();//Enable interrupt in PSRStart_Timer3();Uart_Printf("\n");//lcd屏*************lcd屏*****************lcd屏**********LCD_Init();LCD_ChangeMode(DspTxtMode);//转换LCD显示模式为文本显示模式//lcd屏*************lcd屏*****************lcd屏**********while(1){//****************对钟************************//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(1000);Delay(1000);Timer3INTCount = Timer3INTCount + 1 ;if(Timer3INTCount>59)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 ;// Timer3INTCount = 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\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_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);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:%d\n",hour,minute,Timer3INTCount);}else ;//闹钟设置*************闹钟设置****************闹钟设置***************// Start_Timer3();}//闹钟判断*************闹钟判断****************闹钟判断***************while( hour == clock_h & minute == clock_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:%d\n",hour,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.h"extern Timer3INTCount , hour , minute ;void Init_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)/dividerrTCFG0&=~(0xff<<8);rTCFG0|=(prescaler1<<8);//All interrupt,select MUX input for TimerNrTCFG1&=~(0x0f<<24|0x0f<<12);rTCFG1|=(div<<12);rTCMPB3=compb3;rTCNTB3=countb3;rTCON|=(0x01<<19);//Auto reload}void Start_Timer3(void){ rTCON|=(0x01<<17);//Manual UpdaterTCON&=~(0x01<<18);//Inverter offrTCON|=(0x01<<16);//Start Timer3rTCON&=~(0x01<<17);//Must clear Manual update bit}void Stop_Timer3(void){rTCON&=~(0x01<<16);//Stop Timer3void Timer3_ISR(void){Timer3INTCount++;if(Timer3INTCount>59) //秒累加到59时清零{Timer3INTCount=0;minute = minute + 1 ;}if(minute > 59) //分钟累加到59时清零{minute = 0 ;hour = hour + 1 ;}if(hour>23) //小时累加到23时清零{hour=0 ;}// LED_Display(Timer3INTCount , minute , hour); // Uart_Printf("\r%d ",Timer3INTCount);}③.#include "44b.h"#include"uhal.h"#include "zlg7289.h"#include "def.h"int 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;}void LED_Display(unsigned int value , unsigned int m , unsigned int h) { unsigned char LED[8];int i ;if(value>9999)return;//无用////////////////秒显示*****************************for(i=0;i<2;i++){LED[i]=value%10; // 分离秒个位value=value/10; // 分离秒十位if(value==0)break;}ZLG7289_ENABLE();Delay(5);WriteSDIO(ZLG7289_CMD_HIDE);WriteSDIO(~(0xff<<(i+1)));Delay(1);for(;i>=0;i--) //八位循环显示{WriteSDIO(ZLG7289_CMD_DATA0|i);WriteSDIO(LED[i]);Delay(1);}////////////////秒显示*****************************// 分钟显示aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafor(i=3;i<5;i++){LED[i]=m%10; // 分离分钟个位m=m/10; // 分离分钟十位if(m==0)break;}ZLG7289_ENABLE();Delay(5);WriteSDIO(ZLG7289_CMD_HIDE);WriteSDIO(~(0xff<<(i+1)));Delay(1);for(;i>=0;i--) //八位循环显示{LED[2] = 10 ;LED[5] = 10 ;WriteSDIO(ZLG7289_CMD_DATA0|i);WriteSDIO(LED[i]);Delay(1);}// 分钟显示aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa// 小时显示aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa LED[7] = 0 ;for(i=6;i<8;i++){LED[i]=h%10; // 分离小时个位h=h/10; // 分离小时十位if(h==0){i=7 ;break;}}ZLG7289_ENABLE();Delay(5);WriteSDIO(ZLG7289_CMD_HIDE);WriteSDIO(~(0xff<<(i+1)));Delay(1);for(;i>=0;i--) //八位循环显示{LED[2] = 10 ; //时钟横杠显示LED[5] = 10 ; //时钟横杠显示WriteSDIO(ZLG7289_CMD_DATA0|i);WriteSDIO(LED[i]);Delay(1);}// 小时显示aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZLG7289_DISABLE();}四.总结(1)任务要求:①把时钟设置中调整原小时1键改成0键,把原调整分钟2键改成.键,把原调整秒3键改成ENTER键②把闹钟设置中调整原小时4键改成num键,把原调整5键改成/键,把原显示闹钟6键改成*键(2)调整后的程序为//****************对钟************************//while(!(rPDATG&ZLG7289_KEY)) //有按键按下时进入while死循环,松开时跳出{key=Zlg7289_ReadKey(); //按键值赋给key 。

相关主题