ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:215.38KB ,
资源ID:10879029      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10879029.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于ARM的万年历 精品.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于ARM的万年历 精品.docx

1、基于ARM的万年历 精品嵌入式系统课程设计报告 基于ARM的万年历系统 院 系: 机电学院 学生姓名: 专 业: 应用电子技术教育 班 级: 指导教师: 田丰庆 杜留锋 付广春 陈艳锋 完成时间: 2013年3月29日 摘要现在是一个知识爆炸的新时代,新产品、新技术层出不穷,电子技术的发展更是日新月异。可以毫不夸张的说,电子技术的应用无处不在,电子技术正在不断地改变我们的生活,改变着我们的世界。在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,人们往往忘记了时间,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。因此我们需要一个定时系统来提醒这些忙碌的人,而数字化的钟表给人

2、们带来了极大的方便。电子万年历是一种非常广泛日常计时工作,对现代社会越来越流行。它可以对年、月、日、周、时、分、秒进行计时。由于单片机具有灵活性强、成本低、功耗低、保密性好等特点,所以电子日历时钟一般都以单片机为核心,外加一些外围设备来实现,可以显示年月日时分秒和温度信息,具有可调整日期和时间功能。 近些年,随着科技的发展和社会的进步,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。单片机在多功能数字钟中的应用已是非常普遍的,人们对数字钟的功能及工作顺序都非常熟悉。但是却很少知道它的内部结构以及工作原理

3、。由单片机作为数字钟的核心控制器,可以通过它的时钟信号进行计时实现计时功能,将其时间数据经单片机输出,利用显示器显示出来,通过按键可以进行定时、校时功能。输出设备显示器可以用液晶显示技术和数码管显示技术。目录1 ARM Cortex-M简介 12 电子万年历的发展状况 13 万年历硬件系统设计 13.1 单片机内部主电路如图一所示 13.2 时钟电路如图二所示 24 程序流程图 35 程序运行结果如图五所示 46 研究目的与意义 4参考文献 6附录 7源程序 71 ARM Cortex-M简介ARM Cortex-M系列主要用于微控制器单片机(MCU)领域,是为了那些对功耗和成本非常敏感,同时

4、对性能要求不断增加的嵌入式应用(如微控制器系统、汽车电子与车身控制系统、各种家电、工业控制、医疗器械、玩具和无线网络等)所设计与实现的。随着在各种不同领域应用需求的增加,微处理器市场也在趋于多样化。Cortex-M3是一个32位的单片机核,在传统的单片机领域中,有一些不同于通用32位CPU应用的要求,结合了多种创新性突破技术,使得芯片供应商可以提供超低费用的芯片。M3处理器还集成了许多紧耦合系统外设,合理利用了芯片空间,使系统能满足下一代产品的控制需求。Cortex的优势在于低功耗、低成本、高性能的结合,凭借缩小的内核尺寸、出色的中断延迟、集成的系统部件、灵活的硬件配置、快速的系统调试和简易的

5、软件编程,Cortex-M3处理器将成为广大嵌入式系统(从复杂的片上系统到低端微控制器)的理想解决方案。2 电子万年历的发展状况随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。第三次革命就是单片机数码计时技术的应用(电子万年历),

6、使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步!3 万年历硬件系统设计3.1 单片机内部主电路如图1所示图1 单片机内部主电路3.2 时钟电路如图2所示图2 时钟电路3.3 内部串口电路如图3所示图3 内部串口电路4 程序流程图图4 程序流程图5 程序运行结果如图5所示程序通过宏定义来设置当前时间,对开发板进行初始化后,进行设置和串口初始化,并打开中断,当设置时间到时,程序读取可

7、编程计数器的值以或许信息,通过串口发送数据显示时钟。图5 程序运行结果6 研究目的与意义二十一世纪是数字化技术高速发展时代,而单片机在数字化高速发展的时代扮演者极为重要的角色。电子万年历的开发与研究在信息化时代的今天亦是当务之急,因为它应用在学校、机关、企业、部队等单位礼堂、训练场地、教学室、公共场地等场合,可以说遍及人们生活的每一个角落。所以说电子万年历的开发是国家之所需,社会之所需,人民之所需。由于社会对信息交换不断提高的要求及高新技术的逐步发展,促进电子万年历发展并且投入市场得到广泛应用。 参考文献1、李佳. ARM系列处理器应用技术完全手册M. 人民邮电出版社,2006.2、彭刚,秦志

8、强.基于ARM Cortes-M3的STM32系列嵌入式微控制器应用实践M.北京:电子工业出版社.2011.1 3、李佳. ARM系列处理器应用技术完全手册M. 人民邮电出版社,2006.4、赖于树. ARM微处理器与应用开发M. 电子工业出版社,2007.张绮文,谢建雄,谢劲心.ARM嵌入式常用模块与中和系统设计实例精讲M. 电子工业出版社, 2007.5、张绮文,谢建雄,谢劲心.ARM嵌入式常用模块与中和系统设计实例精讲M. 电子工业出版社, 2007.6、刘岚 尹勇 李京蔚.基于ARM的嵌入式系统开发M.电子工业出版社,2008.附录源程序:#include stm32f10x.h#in

9、clude stdio.h #include calendar.h#include date.h_IO uint32_t TimeDisplay = 0;void RCC_Configuration(void);void NVIC_Configuration(void);void GPIO_Configuration(void);void USART_Configuration(void);int fputc(int ch, FILE *f);void RTC_Configuration(void);void Time_Regulate(struct rtc_time *tm);void Ti

10、me_Adjust(void);void Time_Display(uint32_t TimeVar);void Time_Show(void);u8 USART_Scanf(u32 value);#define RTCClockSource_LSE u8 const *WEEK_STR = 日, 一, 二, 三, 四, 五, 六;u8 const *zodiac_sign = 猪, 鼠, 牛, 虎, 兔, 龙, 蛇, 马, 羊, 猴, 鸡, 狗;struct rtc_time systmtime;int main() RCC_Configuration(); NVIC_Configurati

11、on(); GPIO_Configuration(); USART_Configuration(); if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) printf(rnn RTC not yet configured.); RTC_Configuration(); printf(rn RTC configured.); Time_Adjust(); BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); else if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) print

12、f(rnn Power On Reset occurred.); else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) printf(rnn External Reset occurred.); printf(rn No need to configure RTC.); RTC_WaitForSynchro(); RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); #ifdef RTCClockOutput_Enable RCC_APB1PeriphClockCmd(RCC_AP

13、B1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); BKP_TamperPinCmd(DISABLE); BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock); #endif RCC_ClearFlag(); Time_Show();void RCC_Configuration() SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENA

14、BLE);void NVIC_Configuration() NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQC

15、hannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);void GPIO_Configuration() GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_In

16、itStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);void USART_Configuration() USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; U

17、SART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_C

18、md(USART1, ENABLE);int fputc(int ch, FILE *f) USART_SendData(USART1, (unsigned char) ch); while (!(USART1-SR & USART_FLAG_TXE); return (ch);void RTC_Configuration() RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); BKP_DeInit(); #ifdef RTCClockSour

19、ce_LSI RCC_LSICmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)=RESET) RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); #elif defined RTCClockSource_LSE RCC_LSEConfig(RCC_LSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)=RESET) RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); #endif RCC_RTCCLKCmd(ENABLE); #ifdef

20、RTCClockOutput_Enable BKP_TamperPinCmd(DISABLE); BKP_RTCCalibrationClockOutputCmd(ENABLE); #endif RTC_WaitForSynchro(); RTC_WaitForLastTask(); RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); #ifdef RTCClockSource_LSI RTC_SetPrescaler(31999); #elif defined RTCClockSource_LSE RTC_SetPrescaler

21、(32767); #endif RTC_WaitForLastTask(); void Time_Regulate(struct rtc_time *tm) u32 Tmp_YY = 0xFF, Tmp_MM = 0xFF, Tmp_DD = 0xFF, Tmp_HH = 0xFF, Tmp_MI = 0xFF, Tmp_SS = 0xFF; printf(rn=Time Settings=); printf(rn 请输入年份(Please Set Years): 20); while (Tmp_YY = 0xFF) Tmp_YY = USART_Scanf(99); printf(nr 年份

22、被设置为: 20%0.2dnr, Tmp_YY); tm-tm_year = Tmp_YY+2000; Tmp_MM = 0xFF; printf(rn 请输入月份(Please Set Months): ); while (Tmp_MM = 0xFF) Tmp_MM = USART_Scanf(12); printf(nr 月份被设置为: %dnr, Tmp_MM); tm-tm_mon= Tmp_MM; Tmp_DD = 0xFF; printf(rn 请输入日期(Please Set Dates): ); while (Tmp_DD = 0xFF) Tmp_DD = USART_Scan

23、f(31); printf(nr 日期被设置为: %dnr, Tmp_DD); tm-tm_mday= Tmp_DD; Tmp_HH = 0xFF; printf(rn 请输入时钟(Please Set Hours): ); while (Tmp_HH = 0xFF) Tmp_HH = USART_Scanf(23); printf(nr 时钟被设置为: %dnr, Tmp_HH ); tm-tm_hour= Tmp_HH; Tmp_MI = 0xFF; printf(rn 请输入分钟(Please Set Minutes): ); while (Tmp_MI = 0xFF) Tmp_MI =

24、 USART_Scanf(59); printf(nr 分钟被设置为: %dnr, Tmp_MI); tm-tm_min= Tmp_MI; Tmp_SS = 0xFF; printf(rn 请输入秒钟(Please Set Seconds): ); while (Tmp_SS = 0xFF) Tmp_SS = USART_Scanf(59); printf(nr 秒钟被设置为: %dnr, Tmp_SS); tm-tm_sec= Tmp_SS;void Time_Adjust() RTC_WaitForLastTask(); Time_Regulate(&systmtime); Gregori

25、anDay(&systmtime); RTC_SetCounter(mktimev(&systmtime); RTC_WaitForLastTask();void Time_Display(uint32_t TimeVar) static uint32_t FirstDisplay = 1; u8 str15; to_tm(TimeVar, &systmtime); if(!systmtime.tm_hour & !systmtime.tm_min & !systmtime.tm_sec) | (FirstDisplay) GetChinaCalendar(u16)systmtime.tm_y

26、ear, (u8)systmtime.tm_mon, (u8)systmtime.tm_mday, str); printf(nrnr 今天农历:%0.2d%0.2d,%0.2d,%0.2d, str0, str1, str2, str3); GetChinaCalendarStr(u16)systmtime.tm_year,(u8)systmtime.tm_mon,(u8)systmtime.tm_mday,str); printf( %s, str); printf(r 当前时间为: %d年(%s年) %d月 %d日 (星期%s) %0.2d:%0.2d:%0.2d, systmtime.

27、tm_year, zodiac_sign(systmtime.tm_year-3)%12, systmtime.tm_mon, systmtime.tm_mday, WEEK_STRsystmtime.tm_wday, systmtime.tm_hour, systmtime.tm_min, systmtime.tm_sec);void Time_Show() printf(nr); while (1) if (TimeDisplay = 1) Time_Display(RTC_GetCounter(); TimeDisplay = 0; u8 USART_Scanf(u32 value) u

28、32 index = 0; u32 tmp2 = 0, 0; while (index 2) while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) = RESET) tmpindex+ = (USART_ReceiveData(USART1); if (tmpindex - 1 0x39) if(index = 2) & (tmpindex - 1 = r) tmp1 = tmp0; tmp0 = 0x30; else printf(nrPlease enter valid number between 0 and 9 -: ); index-; index = (tmp1 - 0x30) + (tmp0 - 0x30) * 10); if (index value) printf(nrPlease enter valid number between 0 and %d, value); return 0xFF; return index;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1