嵌入式时钟设计

合集下载

嵌入式系统的设计与应用

嵌入式系统的设计与应用

嵌入式系统的设计与应用随着科技的发展,嵌入式系统已经在各个领域得到了广泛的应用,涉及到的行业非常的广泛,如智能家居、物联网、医疗、工业控制等等。

嵌入式系统是由硬件和软件组成的,它具有占用空间小、能耗低、性能高等优点。

在本文中,将简单探讨嵌入式系统的设计、应用以及未来的发展趋势。

嵌入式系统的设计嵌入式系统的设计分为硬件和软件两部分。

硬件设计中,需要考虑的问题很多,如电源管理、时钟、通信接口、外设等等。

其中,电源管理的设计尤为重要,因为嵌入式系统往往需要小巧轻便、省电节能,而电源管理系统就是为了使系统在工作时能够最大限度地实现功耗管理,从而提高系统的效率和稳定性。

在时钟的设计中,应当考虑到系统的精确度和零部件的通用性等因素,使时钟的设计更加灵活且具有一定的可扩展性。

在通信接口的设计中,要考虑到不同的系统之间的数据互通以及适应性。

在外设选择和集成的设计中,需要考虑到使用范围、系统安全性以及软件的适配等因素。

嵌入式系统的软件部分设计也十分重要,软件的设计和编写要设计合理、规范、可扩展和易于维护等规定。

嵌入式系统软件的开发过程中,会涉及到很多的方面如裸机开发、操作系统、应用程序等等,不同的嵌入式系统开发工具和软件平台都有各自特点和适用范围。

嵌入式系统的应用嵌入式系统的应用可以应用到各个领域。

在智能家居方面,嵌入式系统可以实现对家居环境的自动化管理,如智能家居系统可实现调节室内温度、照明、音响等功能。

在医疗方面,可以设计开发监测身体各项指标的设备。

在工业控制方面,可以设计开发自动化生产设备和制造工具,以提升生产效率和质量。

在交通设备和智能仓储等诸多方面嵌入式系统都有涉足。

未来的发展趋势随着科技的进步和人们对智能化的需求,未来嵌入式系统的发展前景非常广阔。

从今天的观察来看,随着人工智能技术、机器视觉技术、大数据等领域的蓬勃发展,嵌入式系统将会得到更加广泛的应用。

例如智能家居的开放性、可扩展性、可测量性等因素将会更加受到关注。

嵌入式实时时间显示

嵌入式实时时间显示

任务
OSStart();//启动系统
6
} //开始任务 void start_task(void *pdata) { OS_CPU_SR cpu_sr=0;
pdata = pdata; OS_ENTER_CRITICAL();//进入临界区(无法被中断打断) OSTaskCreate(led_task,(void *)0,(OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],LED_TASK_PRIO);// 创 建 LED 任务 OSTaskCreate(time_task,(void *)0,(OS_STK*)&TIME_TASK_STK[TIME_STK_SIZE-1],TIME_TASK_PRIO);// 创建时间任务 OSTaskSuspend(START_TASK_PRIO); //挂起开始任务. OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断) } //指示灯任务 void led_task(void *pdata) { pdata = pdat初始化 系统初始化 创建开始任务
启动系统
开始任务 创建指示灯任务 创建显示任务 挂起开始任务
指示灯任务
显示任务 获取时间、温度
LED 取反 延时进行任务切换
得到日期 显示数据 延时进行任务切换
2、主要程序
//开始任务
#define START_TASK_PRIO 10 //开始任务的优先级设置为最低
RTC 由两个主要部分组成,第一部分(APB1 接口)用来和 APB1 总线相连。此 单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口 由 APB1 总线时钟驱动,用来与 APB1 总线连接。另一部分(RTC 核心)由一组可编 程计数器组成,分成两个主要模块。第一个模块是 RTC 的预分频模块,它可编程 产生 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20 位的可编程 分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位,则在每 个 TR_CLK 周期中 RTC 产生一个中断(秒中断)。第二个模块是一个 32 位的可编程 计数器,可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算, 可以记录 4294967296 秒,约合 136 年左右,作为一般应用,这已经是足够了的。

如何确定嵌入式设计可接受的抖动水平

如何确定嵌入式设计可接受的抖动水平

如何确定嵌入式设计可接受的抖动水平此时钟的高频颤动不被转移到该PLL的输出,因此,不会对SerDes的输出颤动产生任何影响。

这个Tx CMU锁相环的低通滤波器特征确定了所感爱好积分频带的上限转角频率(corner frequency)。

以类似的方式,用于接收器SerDes参考时钟由内部接收器SerDes CMU 锁相环倍乘。

该时钟然后用于基于相位内插器的时钟和数据复原(CDR)电路,其可作为参考时钟颤动的高通滤波器。

因此,这个时钟的低频颤动不会传递到用于CDR的相位对准器输出。

接收器相位内插器的高通滤波器特征确定了感爱好积分频带的下限转角频率。

全部这些效应会界定详细串行标准的SerDes传递函数,以及那些确定感爱好的频带或者Mask,例如用于10G以太网的1.875MHz到20MHz的频带。

芯片厂商的规格指标并不全都除了许多不同的颤动类型和细微差别,芯片创造商如何为他们的器件确定所需的时钟颤动也有无数的不确定性。

SerDes芯片厂商为他们的元件确定所需的参考时钟颤动,但是物理层、FPGA和处理器等器件规格指标则不一定与行业串行接口标准的办法学和测量详情等保持全都。

例如,大部分网络通信标准(如千兆以太网,10千兆以太网等)指定峰-峰(P2P)值总颤动作为一个单位间隔(UI)的百分比,其中一个UI在给定串行标准中相当于时光域1比特间隔。

但是峰-峰值总颤动UI事实上是一个SerDes眼图关闭(eye closure)规格指标,以符合可接受的比特误码率(BER),按照工业串行标准其通常是10-12。

这些标准并没有界定总颤动UI预算有多少被分配给互连、光学、串行解串器,或驱动SerDes的参考时钟。

其结果是,电路板设计人员只能听命于芯片供给商以及在他们的数据表中规定的参考时钟颤动。

通常,这些规格指标都过于保守,把大多数颤动预算赋予了集成的SerDes,第1页共2页。

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

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

嵌进式系统开垦之阳早格格创做课程安排博周报告课程安排(报告)Ⅰ、课程安排题目:具备日历功能的电子时钟题目:具备日历功能的电子时钟系别及博业:估计机工程系估计机应用技能班级: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目录前止连年去,随着估计机技能及集成电路技能的死长,嵌进式技能日渐遍及,正在通讯、搜集、工控、调理、电子等范围收挥着越去越要害的效率.嵌进式系统无疑成为目前最热门最有死长前途的IT应用范围之一.真常常钟(RTC)器件是一种能提供日历/时钟、数据保存等功能的博用集成电路,时常使用做百般估计机系统的时钟旗号源战参数树坐保存电路.RTC具备计时准确、耗电矮战体积小等特性,特地适用于正在百般嵌进式系统忠记录事变爆收的时间战相关疑息,更加是正在通疑工程、电力自动化、工业统造等自动化程度较下范围的无人负担环境.随着集成电路技能的没有竭死长,RTC器件的新品也没有竭推出.那些新品没有但是具备准确的RTC,另有大容量的保存器、温度传感器战A/D数据支集通讲等,已成为集RTC、数据支集战保存于一体的概括功能器件,特地适用于以微统造器为核心的嵌进式系统.关键字:嵌进式系统、真常常钟RTC第一章系统安排第一节课题目标及总体筹备随着嵌进式技能的死长,咱们身边充斥着百般百般的嵌进式电子产品.真常常钟(RTC)便是一种正在新颖电子设备中应用非常一致,不妨助闲人们真时、准确的掌握时间的器件,如脚机、PDA及一些智能仪容皆提供了时钟隐现.咱们原次课题的目标便是要鉴于SAMSUNG S3C2410AL-20芯片安排出一个真常常钟,编写C谈话不妨通过μVision4战超等末端硬件调试,而后通过ULINK2仿真器下载至真验箱内举止瞅察.正在考查箱中的LED隐现灯上隐现出时间战日历.其余,咱们将要真止的系统分为三个模块真止,每个模块间相对于独力而又相互通联.第二节名目安排模块形貌及过程图1.模块形貌:尔先举止了所有系统的筹备,将所有系统分为二大模块:第一,主函数模块;第二,功能真止模块(举止时间战闹钟的设定,以及其余一些隐现功能);第三,闹钟功能真止模块.2.总体安排过程图:3、功能安排过程图4、闹钟功能步调过程图一、主函数模块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;elseg_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);//延时1sdisplay_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;//按键值置0while(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 enablerBCDYEAR = 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);//延时5srGPBDAT |= 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_nM onth,g_nDate,g_nYear);}keyboard_init();//交受键盘的输进,而且将值搁正在ucCharg_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();//交受键盘的输进,而且将值搁正在ucCharg_nKeyPress=0;iic_read_keybd(0x70, 0x1, &ucChar);ucChar=key_set(ucChar);if(ucChar==0xff){//按下FUN键ucChar=0;//给按键值置0uart_printf("\n闹钟已停止.\n");return;}}iic_init_8led();for(i=0;i<8;i++){iic_write_8led(0x70,0x10+i,0x00);//8个LED灯齐灭}display_Time();//调用系统时间隐现jiao();//调用收声函数}2、闹钟树坐函数void alam(void){int i,u;ucChar=0;for(u=0;u<8;u++){iic_write_8led(0x70,0x10+u,0x00);//8个LED灯齐灭}i=0;while(1){iic_init_8led();while(g_nKeyPress--){keyboard_init();g_nKeyPress = 0;//交受键盘的输进,而且将值搁正在ucCharwhile(g_nKeyPress == 0);iic_read_keybd(0x70, 0x1, &ucChar);if(i==6){//推断时间输进是可完成。

基于51单片机的电子时钟设计

基于51单片机的电子时钟设计

基于51单片机的电子时钟设计51单片机是一种广泛应用于嵌入式系统的微控制器,由于其性能稳定、易于编程和成本相对较低的特点,被广泛应用于各种电子设备中。

在现代社会,电子时钟已经成为人们日常生活中不可或缺的工具。

随着科技的不断发展,电子时钟在功能和外观上都得到了极大的提升,如今的电子时钟不仅可以显示时间,还能设置闹钟、定时、显示温湿度等功能。

本文通过对51单片机的应用和实践,设计了一款功能丰富的电子时钟,旨在探讨如何利用51单片机实现电子时钟的设计与制作过程。

首先,我们将介绍51单片机的基本原理和特点。

51单片机是一种8位微控制器,由Intel公司于1980年推出,至今已有数十年的历史。

它采用哈佛结构,具有较高的工作速度和稳定性,适合用于各种嵌入式系统。

51单片机的指令系统简单,易于学习和掌握,因此被广泛用于各种嵌入式应用中。

除此之外,51单片机的外围设备丰富,可以通过外部扩展模块实现各种功能,如串口通信、定时器、数模转换等,这也为我们设计电子时钟提供了便利。

其次,我们将详细介绍基于51单片机的电子时钟的设计和实现过程。

电子时钟主要由时钟模块、显示模块、闹钟模块等部分组成,通过合理的接线和程序设计实现各种功能。

首先,我们设计时钟模块,通过外部晶振产生时钟信号,并利用51单片机的定时器模块实现时间的精确计算和显示。

同时,我们还设计了显示模块,采用数码管或液晶屏显示时间和日期信息,通过数字或字符的组合,使信息直观清晰。

此外,闹钟模块也是电子时钟的重要功能之一,我们可以设置闹钟时间,并在设定时间触发闹钟功能,提醒用户。

通过合理的程序设计,我们可以实现电子时钟的各种功能,并提升用户体验。

最后,我们将讨论基于51单片机的电子时钟在实际生活中的应用前景和发展趋势。

随着智能家居的快速发展,电子时钟作为家庭必备的电子设备,其功能和外观需求也在不断提升。

未来,基于51单片机的电子时钟将会更加智能化,可以与手机、电视等智能设备联动,实现更多个性化的功能。

嵌入式系统设计中的时序逻辑优化技术

嵌入式系统设计中的时序逻辑优化技术

嵌入式系统设计中的时序逻辑优化技术嵌入式系统是指将软件和硬件融合在一起,以满足特定应用需求的系统。

其具有体积小、功耗低、性能稳定等特点,被广泛应用于智能家居、工业自动化、医疗设备等领域。

时序逻辑优化技术是嵌入式系统设计中的重要部分,它能够对时序路径进行优化,提高系统的工作速度和稳定性。

一、时序逻辑优化技术的需求一个典型的嵌入式系统中通常会涉及到时序逻辑的设计,如时钟、状态转移、通信等等。

在时序逻辑的设计和优化过程中,需要考虑以下几个方面的需求。

1. 时序要求时序要求是指时序电路中所涉及的信号的时间关系要求。

为使电路能够正常工作,每个端点的数据必须在一个确定的时间内准确到达。

如果这个时间太短,那么电路会出现时序失效,从而影响系统性能,甚至会导致电路故障。

因此,在时序电路的设计中,需要仔细考虑时序要求。

2. 频率要求频率要求是指电路的时钟频率要求,这与时序要求密切相关。

在时序电路的设计和优化中,需要对电路的时钟频率进行定量分析,以确定电路的工作频率和稳定性。

3. 电路复杂度随着电路的不断增加,电路的复杂度也在不断增加。

在复杂电路中,时序逻辑的设计和优化变得更加困难,因此需要使用更加先进的时序逻辑优化技术。

二、时序逻辑优化技术的作用时序逻辑优化技术,可以对时序路径进行优化,从而提高系统的性能和稳定性。

具体来说,时序逻辑优化技术可以发挥以下作用:1. 降低系统延迟在时序电路中,如果电路延迟较大,则数据的传输速度会受到影响。

通过时序逻辑优化技术,可以对电路中的延迟路径进行优化,从而降低系统的延迟,提高系统的传输速率。

2. 提高系统的工作速度在嵌入式系统中,速度是非常重要的,决定了系统的工作效率和响应能力。

通过时序逻辑优化技术,可以降低系统的延迟,从而提高系统的工作速度。

3. 降低功耗时序电路的功耗主要与时钟频率和电路延迟有关。

通过时序逻辑优化技术,可以优化电路的时钟频率,并通过简化时序逻辑路径来降低电路延迟,从而达到降低功耗的目的。

基于单片机定时闹钟的设计

基于单片机定时闹钟的设计随着科技的快速发展,嵌入式系统已经深入到我们生活的各个角落。

其中,单片机以其高效性、灵活性和低成本性,广泛应用于各种设备的设计中。

本文将探讨如何基于单片机设计一个定时闹钟。

一、硬件需求1、单片机:选择一个适合你项目的单片机。

比如Arduino UNO,它具有丰富的IO口和易于使用的开发环境。

2、显示模块:为了能直观地展示时间,你需要一个LCD显示屏。

可以选择常见的16x2字符型LCD显示屏。

3、按键模块:用于设定时间和闹钟功能。

一般可以选择4个按键,分别代表功能设置、小时加、小时减和分钟加。

4、蜂鸣器:当到达设定时间时,蜂鸣器会发出声音提醒。

二、软件需求1、开发环境:你需要一个适用于你单片机的开发环境,例如Arduino IDE。

2、编程语言:一般使用C或C++进行编程。

3、程序设计:你需要编写一个程序来控制单片机,让其根据设定时间准时唤醒。

程序应包括初始化和设定时间的功能,以及到达设定时间后的闹钟提醒功能。

三、设计流程1、硬件连接:将单片机、显示模块、按键模块和蜂鸣器按照要求连接起来。

2、初始化:在程序中初始化所有的硬件设备。

3、时间设定:通过按键模块设定时间。

你需要编写一个函数来处理按键输入,并在LCD显示屏上显示当前时间。

4、闹钟提醒:在程序中加入一个计时器,当到达设定时间时,程序会唤醒并触发蜂鸣器发出声音。

5、循环检测:在主循环中不断检测时间是否到达设定时间,如果到达则触发闹钟提醒,然后继续检测。

四、注意事项1、时钟源:你需要一个稳定的时钟源来保证闹钟的准确性。

可以考虑使用网络时钟或者GPS模块。

2、功耗优化:如果你的设备需要长时间运行,那么需要考虑到功耗的问题,比如使用低功耗的单片机或者在不需要闹钟提醒的时候关闭蜂鸣器等。

3、人机交互:考虑增加更多的功能以满足用户的需求,如设置多个闹钟、调整闹钟的音量等。

4、安全性:保证设备的电源稳定,避免在突然断电的情况下数据丢失或设备损坏。

嵌入式数字时钟实验总结

嵌入式数字时钟实验总结本次实验是关于嵌入式数字时钟的设计与实现。

我们通过使用单片机和数码管,成功构建了一个功能完善的数字时钟。

在实验过程中,我们学习了嵌入式系统的基本原理和设计技巧,同时也加深了对数字电路和计时器的理解。

首先,我们明确了实验的目标和需求。

作为一款嵌入式数字时钟,它应该具备显示时间、日期的功能,同时还可以提供闹钟功能和计时功能。

基于这些需求,我们进行了系统的设计和功能模块的划分。

其次,我们选用了适合该项目的硬件平台和软件开发工具。

我们选择了一款功能强大且易于使用的单片机作为主控芯片,以满足系统的高效运行和稳定性要求。

同时,我们使用了一种高亮度的数码管,以保证时间和日期的清晰显示。

然后,我们通过系统设计和模块划分来完成软件的开发。

我们根据系统需求,将整个项目划分为多个模块,如时钟模块、日期模块、闹钟模块和计时模块等。

每个模块都有相应的功能和逻辑,通过合理的调用和交互,实现了整个系统的协调运行。

在实验过程中,我们遇到了一些问题并找到了解决办法。

例如,由于数码管的显示限制,我们需要通过七段数码管的编码方式来进行显示。

我们通过查阅资料和试验,成功实现了数码管的显示功能。

另外,由于闹钟和计时功能需要精确的时间控制,我们使用了定时器和中断的方法来实现,确保了系统的准确性和稳定性。

最后,我们对实验结果进行了测试和调试。

通过测试,我们发现嵌入式数字时钟能够正常显示时间和日期,并且闹钟和计时功能也运行良好。

我们还对系统进行了性能和稳定性测试,发现系统响应快速、界面友好,并且稳定运行。

通过本次实验,我们不仅学到了嵌入式系统的设计和开发技能,还获得了对数字电路和计时器的深入理解。

同时,我们也意识到了实际工程项目中的挑战和困难,锻炼了解决问题的能力。

我们相信这次实验经历对我们今后的学习和工作都具有重要意义。

基于ARM的嵌入式手机实时时钟设计


间滴答中断和时 间中断 的计数值 。T I C K I N T 可 以为手机系统 提供 时钟 。 R T C 时 钟 单元 能像钟 表 和 日历一样 保存 并 自动计 算时 间,还具有定 时报警和产 生节拍的功能 。S 3 C 4 4 B O X实 时时钟 由开发板上 的后备 电池供 电,可以在系统 电源关 闭的情况下 运行。用该芯片开发设计 的时钟作为手机时钟 ,可 以避免手 机换 电池的 时候要重 设时间 日期。R T C产生节拍功能可 以设 计成秒表 ,定时报警可 以作为手机 的闹钟使用 。R T C 发送 8 位B C D码数据到 C P U ,传送的数据包括秒 、分、小 时、星期 、
李艳红 田莎莎
设计
( 中南民族 大学计算机科 学学院 ,湖北 武汉 4 3 0 0 7 4 )
【 摘 要 】基 于 S 3 C 4 4 B O x AI 7芯 片设计 开发 了一个在手机 中广泛应 用的多功能 实时时钟 ,并给 出了电路及代码 的详 细
设计过程 。S 3 C 4 4 B 0 xA I 7是三星公 司生产的 处理 器,该处理器 内部 集成 了一个 实时时钟 ( R T C),设计的 时钟计 时准确 、功
A RM . . ba s e d Em be dde d Re a 1 . . t i me Cl o c k De s i g n
Ab s t r a c t : Ba s e d o n S 3 C4 4 BO XA R M7 c h i p d e s i g n . t h i s p a p e r d e v e l o p e d a mu l t i —f u n c t i o n a l r e a l —t i me c l o c k wh i c h c a n b e wi d e l y u s e d

嵌入式闹钟课程设计报告

嵌入式闹钟课程设计报告一、课程目标知识目标:1. 理解嵌入式闹钟的基本原理,掌握其核心组件的功能与作用。

2. 学会使用编程语言(如C语言)编写嵌入式闹钟程序,实现对时间的显示、设置和闹钟提醒功能。

3. 了解嵌入式系统的基本概念,掌握常见的输入输出接口及其应用。

技能目标:1. 能够运用所学知识设计和制作一个具有实际功能的嵌入式闹钟。

2. 培养学生的动手操作能力,学会使用相关工具和仪器进行硬件焊接、调试和程序下载。

3. 提高学生的团队协作能力,学会在项目过程中进行有效沟通和分工合作。

情感态度价值观目标:1. 培养学生对嵌入式系统的兴趣,激发学生学习编程和电子技术的热情。

2. 培养学生的创新精神和实践能力,鼓励学生勇于尝试、不断探索。

3. 增强学生的自信心和责任感,使学生在面对挑战时保持积极的态度。

课程性质:本课程为实践性较强的课程,结合理论知识与实际操作,培养学生的动手能力和创新能力。

学生特点:初中生,具备一定的电子和编程基础,对新鲜事物充满好奇心,喜欢动手实践。

教学要求:注重理论与实践相结合,强调学生的主动参与和动手实践,关注个体差异,提高学生的综合素质。

通过本课程的学习,使学生能够掌握嵌入式闹钟的制作方法,培养其创新意识和团队协作能力。

教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. 嵌入式系统基本概念:介绍嵌入式系统的定义、组成及应用领域,使学生了解嵌入式系统的基本知识。

- 教材章节:第1章 嵌入式系统概述2. 嵌入式闹钟硬件设计:讲解闹钟所需的主要硬件组件,如微控制器、时钟芯片、显示屏、按键等,并介绍硬件电路的搭建方法。

- 教材章节:第2章 嵌入式系统硬件设计3. 嵌入式编程基础:教授C语言编程基础,包括变量、数据类型、运算符、控制语句等,为编写嵌入式闹钟程序打下基础。

- 教材章节:第3章 嵌入式编程基础4. 时间显示与设置:讲解时间的表示方法、时间设置与显示的实现,使学生掌握闹钟时间调整与显示功能的设计。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

嵌入式系统课程设计报告多功能实时时钟姓名:冯子勇卫晓欣翁海权曾康玲班级:07电子信息工程1、2班学号:200730580107200730580225200730580125200730580132指导老师:殷建军、俞龙、陈楚、李震、孙道宗日期:2010.12.20~2010.12.31成员基本情况和分工姓名学号分工情况冯子勇(组长)200730580107 程序编写、成员分工卫晓欣200730580225 资料收集与程序编写翁海权200730580125 资料收集曾康玲200730580132 程序调试摘要本文说明为多功能时钟设计方案,基于S3C2410结合RTC模块,IIC(控制小键盘和数码管等)来做具备定期功能的实时时钟。

实时时钟(RTC)单元在系统电源关闭的情况下可以在备用电池下工作。

RTC 可以使用STRB/LDRB ARM操作传输二进制码十进制数的8 位数据给CPU。

数据包括秒、分钟、小时、日期、天、月、年的时间信息。

RTC 单元可以在32.768KHz 的外部晶振下工作,可以可以执行报警功能。

关键词:多功能时钟;S3C2410;RTC;IIC目录1 实验题目分析 (5)1.1 问题分析 (5)1.2 功能分析 (5)1.3 开发平台及工具介绍 (5)2 实验概要设计 (5)2.1 实验基本原理 (5)2.2 实验电路图 (8)2.3 实验主要步骤 (9)3 实验详细过程 (9)3.1 具体实验过程和内容 (9)3.2 程序流程图 (10)3.3 实验和程序问题分析 (11)4 实验输出界面 (11)5 总结 (13)6 参考文献 (14)7 附录:主要程序代码 (15)1、实验题目分析1.1 问题描述结合实时时钟,IIC(控制小键盘和数码管等)来做具备定期功能的实时时钟。

1.2功能分析至少完成以下功能:(1)能显示每秒的时刻(2)按下功能键能切换显示日期(3)能设置定时闹钟,定时到产生某种输出(4)可以扩展考虑加入外部中断,如停止闹钟功能等。

1.3 开发平台及工具介绍实验器材:CITK2410开发板,JTAG连接线,调试器,并口数据线,串口数据线开发软件:ADS1.2集成开发环境2、实验概要设计2.1 实验基本原理IIC总线:IIC总线的器件分为主器件和从器件。

主器件的功能是启动在总线上传送数据,并产生时钟脉冲,以允许与被寻址的器件进行数据传送。

SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL 线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。

图1 起始和停止信号图I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

图2 数据传送时序图IIC总线(IICSDA、IICSCL)经过VDD33的上拉后,进入ZLG7290数码管:实验使用的数码管是广州周立公司单片机发展有限公司自行设计的一款数码管显示驱动及键盘扫描管理芯片。

下面是介绍该数码管的特点还有电路图(图3):1 IIC串行接口提供键盘中断信号方便与处理器接口2 可驱动8 位共阴数码管或64只独立LED 和64个按键3 可控扫描位数可控任一数码管闪烁4 提供数据译码和循环移位段寻址等控制5 8个功能键可检测任一键的连击次数6 无需外接元件即直接驱LED可扩展驱动电流和驱动电压7 提供工业级器件多种封装形式PDIP24 SO24采用24引脚封装引脚图如图所示其引脚功能分述如下:图3 ZLG7290引脚图图4 IIC LED控制器连接电路实时时钟(Real Time Clock):S3C2410提供了一个实时时钟,该时钟使用独立的一路1.8V供电,保证主电源切断时能正常维持RTC工作。

S3C2410的RTC 支持两个中断:Time Tick(固定在一个频率内发出的时钟中断)和Alarm中断(在某个时刻产生闹铃中断)。

利用这两个中断可以设置每一秒中断一次显示变化时间,用Alarm中断实现闹钟功能。

以下为S3C2410内部RTC模块结构图:图5 S3C2410内部RTC模块结构特点:1.BCD数:秒、分钟、小时、日期、日、月、年;2.闰年生成器;3.报警功能:报警中断或从掉电模式中唤醒;4.已经解决2000年问题;5.独立电源引脚(RTCVDD);6.支持对于实时内核时间节拍的毫秒节拍时间中断。

2.2 实验电路图ZLG7290功能电路图:图6 ZLG7290功能电路图IIC总线接口电路图:图7 IIC总线接口电路图图8所示的RTC单元在32.768KHz 频率下振荡的电路图8 TC单元在32.768KHz 频率下振荡的电路2.3 实验主要步骤1.初始化配置(各种寄存器)。

2.编写各种相关的中断程序。

3.主函数调用这几个中断程序。

4.编译程序。

5.使用仿真器调试。

3、实验详细过程3.1 具体实验过程和内容(1)实现实时时钟功能设置rRTCCON、rTICNT、rRTCALM寄存器;ICNT[6:0]=127;可以设置rTICNT=(1<<7)|(127)实现每秒中断一次;以设置闹铃寄存器,例如每秒的第几秒中断一次,实现定时闹钟的功能;设置初始化当前时间;里还包括编写Time Tick 中断和Alarm中断的中断服务程序。

(2)初始化IIC总线,写一个IIC的操作库。

包括发送和接受功能。

编写可以向ZLG7290发出指令的函数。

(3)编写键盘中断处理程序通过键盘中断,实现数码管显示日期和时间的切换,还有停止。

(4)使用ADS1.2集成开发环境编译调试程序(5)使用仿真器调试。

3.2 程序流程图图9图10程序入口点 2410初始化 显示日期延时 显示时间 停止闹钟 主函数切换YN初始化Time tick 中断Alarm 中断键盘 中断闹钟数码管显示 时间或日期输出当前时间3.3 实验和程序问题分析这次试验实际上是融合了三个实验的要求,要实验实时时钟的功能,包括显示当前时间,还有设置闹钟,主要使用到2410的RTC的两个中断:Time Tick 和Alarm中断。

而要实现在数码管上显示当前时间,并且按键盘时实现时间与日期的切换,需要用到数码管和IIC总线的知识。

而实现的难处在于如何把几个内容融合并且实现所需的功能,这也是实验要求做的。

4、实验输出界面选取主要界面的截图。

图11 键盘功能图12 显示日期图13 示时间五、设计心得体会在老师的帮助下,在组员的协力合作下,我们组最终实现了本次课程设计。

通过总结,我们得到了以下的收获:一:经过一个学期的学习,我们对于嵌入式系统的编程有了一定的理解,但是编程的规范性,程序的仿真,硬件电路的调试等步骤,确实我们还不是很熟悉的,我们需要一个良好的平台,来熟悉和加强这些方面的内容。

而通过本次课程设计,我们小组成员在老师的指引和帮助下,认认真真的了解了嵌入式开发板的原理框图,硬件电路图并深入了解了嵌入式编程的相关知识点,在进行设计的过程中,通过结合相关软硬件,我们也了解到了ARM嵌入式系统的硬件开发方法、系统启动程序和外设驱动程序的开发,也掌握了焕发环境的调试技术。

二:通过本次设计,我们再一次体会到了科学的严谨性以及作为一名学者所应该具有的治学态度。

软件的编程,除了是对思路的一种考验之外,也是对一个人性情的一个考验,在编程过程中,一个字母,甚至只是一个逗点的错误,都有可能导致整个程序的无法运行,在我们编程的过程中就遇到过很多次这样的情况,只能沿着程序一步步地检查解决问题。

经过这次设计之后呢,我们明显感觉自己的逻辑思维能力有了很大的提高。

总之,经过本次设计,我们受益匪浅!六、讨论及进一步研究建议本次设计总体上来说给我们带来了很大的收获,但是,我们觉得其中还有一些可以通过改进,能够是课程设计的目的更好地体现出来,具体表现在:一:课程设计安排的时间如果能适当调整会更有教育效果。

每次的课程设计,总是会有很多人因为考试与课程设计时间上的冲突而烦躁,有些人甚至为了能够更好地迎接考试而放下课程设计的工作,选择了抄同学的程序或者用别人的作品桃代李僵,所以我觉得如果将课程设计的时间改在下学期的开始的话,这种现象会少很多。

二:评分项中“作品提交时间”这一项的存在是不合理的,特别是关于纯软件方面的设计。

虽然我们承认“快意味着熟练”,但是我们见到更多的是有些同学追求速度了抄袭,也有些人因此就背上了包袱,怕设计的时间太长影响了分数故而不加深入研究而匆匆提交设计。

总的来说,这一项分值的设置是弊大于利。

以上是我个人的一点建议,提得不合理的地方,请老师见谅。

6、参考文献[1]《ARM9嵌入式系统设计-基于S3C2410与Linux》[2]《基于S3C2410的嵌入式系统实验指导书》附录:主要程序代码://Main.c#include <stdlib.h>#include <string.h>#include "def.h"#include "option.h"#include "2410addr.h"#include "2410lib.h"#include "2410slib.h"#include "mmu.h"#include "2410rtc.h"#include "2410IIC.h"#include "2410keypad.h"void Isr_Init(void);void HaltUndef(void);void HaltSwi(void);void HaltPabort(void);void HaltDabort(void);U8 KeyDown;U8 SetTime;U8 KeyReal;U8 SetAlarm;U8 AlmFlash = 0;U8 Flash_key11;int k;void Led_Display(int data){// rGPFDAT = (rGPFDAT & 0xf) | !((data & 0xf)<<4);rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4); }void Main(void){MMU_Init();ChangeClockDivider(1,1); // 1:2:4ChangeMPllValue(0xa1,0x3,0x1); // FCLK=202.8MHz Port_Init();Isr_Init();Uart_Init(0,115200);Uart_Select(0);Led_Display(0x00);LED8_init();KeyPadInit();led_set_time();Rtc_Alarm_Init();Uart_Printf("\nWelcom to Uart Test!\n");Uart_Printf("Baud rate=115200, no flow control\n");while(1){//Display_Rtc();LED8_Test(AlmFlash);if(Flash_key11==1){Led_Display(0x0f); //LED Onfor (k=0; k<0xffff; k++); //DelayLed_Display(0x00); //LED Off for (k=0; k<0xffff; k++);} //Delaywhile(KeyDown == 1){KeyDown = 0;//有按键按下,即关闭AlmFlashAlmFlash = 0;//按下"."键显示日期if(KeyReal == DOT){date_time_turn = DATE_TURN;}//按下"NumLock"设置时间if(SetTime == 1){GetTimeChange();SetTime = 0;}//按下"/"设置闹钟if(SetAlarm == 1){SetAlarm = 0;GetAlarmChange();SetAlarm = 0;}}}}//============================================================ =======void Isr_Init(void){pISR_UNDEF = (unsigned)HaltUndef;pISR_SWI = (unsigned)HaltSwi;pISR_PABORT = (unsigned)HaltPabort;pISR_DABORT = (unsigned)HaltDabort;rINTMOD = 0x0; //All=IRQ moderINTMSK = BIT_ALLMSK; //All interrupt is masked.rINTSUBMSK = BIT_SUB_ALLMSK; //All sub-interrupt is masked. <- April 01, 2002 SOP}//============================================================ =======void HaltUndef(void){Uart_Printf("Undefined instruction exception.\n");while(1);}//============================================================ =======void HaltSwi(void){Uart_Printf("SWI exception.\n");while(1);}//============================================================ =======void HaltPabort(void){Uart_Printf("Pabort exception.\n");while(1);}//============================================================ =======void HaltDabort(void){Uart_Printf("Dabort exception.\n");while(1);}//2410keypad.C#include "def.h"#include "option.h"#include "2410addr.h"#include "2410lib.h"#include "2410slib.h"#include "2410keypad.h"void __irq KeyPad_Int(void); //also Eint1 intint KeyPadInit(void);#define ONEBIT 0x1#define KEYPADCSDIS (rGPBDAT |=(ONEBIT << 6))#define KEYPADCSEN (rGPBDAT &=~(ONEBIT << 6))#define KEYPADDIRMO (rGPBDAT &=~(ONEBIT << 0)) #define KEYPADDIRMI (rGPBDAT |=(ONEBIT << 0))void Delay30us(void){unsigned int i;for (i=0;i<0x4ff;i++);}void Delay60us(void){unsigned int i;for (i=0;i<0x9ff;i++);}int putcToKBCTL(U8 c){U32 i;// UINT rxbuf[10];// UINT x;KEYPADCSEN;KEYPADDIRMO;Delay60us();while((rSPSTA1 & ONEBIT)==0); // wait while busyrSPTDAT1 = c; // write left justified datawhile((rSPSTA1 & ONEBIT)==0); // wait while busyKEYPADCSDIS;i = rSPRDAT1;return(i);}U8 readKBValue(void){unsigned char i;KEYPADCSEN;KEYPADDIRMO;Delay60us();while((rSPSTA1 & ONEBIT)==0); // wait while busyrSPTDAT1 = 0x15; // write read key value commandwhile((rSPSTA1 & ONEBIT)==0); // wait while busyDelay30us();//delay 30usKEYPADDIRMI;rSPTDAT1 = 0xff; // write read key value commandwhile((rSPSTA1 & ONEBIT)==0); // wait while busyi = rSPRDAT1;KEYPADCSDIS;KEYPADDIRMO;return(i);}int KeyPadInit(){int t;char dummy = (char)0xff;// Setup IO port for SPI interface & Keyboard// Setup EINT1 (KBDINT)rGPFCON &= ~(0x3 << 2); // Clear GPF1rGPFCON |= (0x2 << 2); // Set GPF1 to EINT1 for Keyboard interrupt rEXTINT0 &= ~(0x7 << 4); // Clear EINT1rEXTINT0 |= (0x2 << 4); // fallig edge triggered for EINT1// setup SPI interface// GPG5 : SPIMISO (KBDSPIMISO)// GPG6 : SPIMOSI (KBDSPIMOSI)// GPG7 : SPICLK (KBDSPICLK)rGPGCON &= ~((0x3 << 10) | (0x3 << 12) | (0x3 << 14)); // Clear GPG5,6,7 rGPGCON |= ((0x3 << 10) | (0x3 << 12) | (0x3 << 14));// setup _SS signal(nSS_KBD)rGPBCON &= ~(0x3 << 12); // Clear GPB6rGPBCON |= (ONEBIT << 12); // Set Port GPB6 to output for nSS signalKEYPADCSDIS; // Set /SS high// setup Dir signal (KEYBOARD) CPU->7289rGPBCON &= ~(0x3 << 0); // Clear GPB0rGPBCON |= (ONEBIT << 0); // Set Port GPB0 to output for _PWR_OK signal// rGPDDAT &=~(ONEBIT << 0); // set _PWR_OK to 0KEYPADDIRMO;// Setup SPI registers// Interrupt mode, prescaler enable, master mode, active high clock, format B, normal mode// rSPCON1 = (ONEBIT<<5)|(ONEBIT<<4)|(ONEBIT<<3)|(0x0<<2)|(ONEBIT<<1);// Poll mode, prescaler enable, master mode, active high clock, format A, normal moderSPCON1 = (0<<5)|(ONEBIT<<4)|(ONEBIT<<3)|(0x0<<2)|(0<<1);// Developer MUST change the value of prescaler properly whenever value of PCLK is changed.rSPPRE1 = 255; // 99.121K = 203M/4/2/(255+1) PCLK=50.75Mhz FCLK=203Mhz SPICLK=99.121KhzputcToKBCTL(0xa4); //send init commandrSRCPND = BIT_EINT1; //to clear the previous pending statesrINTPND = BIT_EINT1;//Define the keypad int entrypISR_EINT1 = (unsigned)KeyPad_Int;rINTMSK=~(BIT_EINT1); //enable Eintreturn(TRUE);}U8 KeyChange(U8 KeyValue){U8 KeyReturn = 255;switch(KeyValue){case 32://NumLock{KeyReturn = NUMLOCK;break;}case 33:// 7{KeyReturn = KEY7;break;}case 34:// 4{KeyReturn = KEY4;break;}case 35:// 1{KeyReturn = KEY1;break;}case 40:// /{KeyReturn = RIGHT_SLASH;break;//date_time_turn = DATE_TURN; }case 41:// 8{KeyReturn = KEY8;break;}case 42:// 5{KeyReturn = KEY5;break;}case 43:// 2{KeyReturn = KEY2;break;}case 44:// 0{KeyReturn = KEY0;break;}case 48:// *{KeyReturn = STAR;break;}case 49:// 9{KeyReturn = KEY9;break;}case 50:// 6{KeyReturn = KEY6;break;}case 51:// 3{KeyReturn = KEY3;break;}case 52:// .{KeyReturn = DOT;break;}case 55:// -{KeyReturn = MINUS;break;}case 57:// +,未使用{KeyReturn = PLUS;break;}case 59:// Enter{KeyReturn = ENTER;break;}default:KeyReturn = 255;}return KeyReturn;}void __irq KeyPad_Int(void){U8 ui8ScanCode;KeyDown = 1;ui8ScanCode=readKBValue();KeyReal = KeyChange(ui8ScanCode);if(KeyReal == NUMLOCK)//设置当前的时间{SetTime = 1;}if(KeyReal == RIGHT_SLASH)//设置闹钟的时间{SetAlarm = 1;}ClearPending(BIT_EINT1);}21。

相关文档
最新文档