单片机课程设计--基于stc15f2k60s的电子万年历--大学毕业设计论文.doc
《单片机课程设计--基于stc15f2k60s的电子万年历--大学毕业设计论文.doc》由会员分享,可在线阅读,更多相关《单片机课程设计--基于stc15f2k60s的电子万年历--大学毕业设计论文.doc(17页珍藏版)》请在咨信网上搜索。
湖南科技大学 信息与电气工程学院 单片机微机原理课程设计报告 课 程: 单片机微机原理及接口技术 题 目: 基于STC15F2K60S的电子万年历 专 业: 通信工程 班 级: 通信一班 姓 名: 孟 焱 学 号: 1204040101 指导教师: 宋 芳 目 录 任务书 3 一、引言 4 二、设计任务和要求 4 三、设计方案 4 三、程序设计 5 1、 显示时钟函数 6 2、 RTC演示函数 7 3、 外部中断0子程序 7 4、 外部中断1子程序 8 5、 主函数 9 6、 向HC595发送一个字节函数 11 7、 显示扫描函数 11 8、 Timer0 1ms中断函数 11 9、 修改模式下显示函数 12 10、闹钟设定模式函数 13 四、原理图设计 15 1、矩阵键盘模块 15 2、单片机及电源模块 15 3、数码管显示模块 16 4、外部中断0,1脉冲输入模块 16 5、led7模拟蜂鸣器模块 16 五、心得体会 16 任务书 题 目 基于STC15F2K60S单片机的电子万年历 时间安排 2015年6月6——6月19日(第15、16周) 目 的: 通过《单片机原理与应用》这门课的课程设计,学生应能对STC15F2K60S单片机有一个全面的认识,掌握以STC15F2K60S单片机为核心的电子电路的设计方法和应用技术。 1.进一步掌握矩阵键盘电路的编程方法。 2.进一步掌握定时器的使用和编程方法。 3.进一步掌握中断处理程序的编程方法。 总体方案实现: 1、利用STC15F2K60S作为主控器组成一个电子日历和电子钟。 2、利用LED分别显示当前时间和日历。 3、利用开发板上自带的24个按键作为输入按钮(实际用到13个),实现手动输入时间信息。 4、利用开关k1,k2作为两个外部中断触发装置,利用两个中断子程序分别实现被修改位的选择和进入修改模式。 5利用扫描法实现对键盘矩阵的扫描,确定被按下的按键。 要求: 1、利用STC15F2K60S作为主控器组成一个电子日历和电子钟 2、利用开发板上提供的矩阵键盘电路,数码显示电路,设计一个电子钟(日历),用矩阵键盘控制电子钟(日历)的模式转换及修改时间。 指导教师评语: 评分等级:【 】 指导教师签名: 一、 引言 单片机因将其主要组成部分集成在一个芯片上而得名,就是把中 央处理器、随机存储器、只读存储器、中断系统、定时器/计数器以及I/O接口电路等部件集成在一个芯片上。基于单片机设计的数字钟精确度较高,因为在程序的执行过程中,任何指令都不影响定时器的正常计数,即便程序很长也不会影响中断的时间。数字钟是采用数字电路实现对日期、时、分、秒,数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表的报时功能。数字钟已成为人们日常生活中的必需品,广泛应用于家庭、车站、码头、剧院、办公室等场所,给人们的生活、学习、工作带来极大的方便。不仅如此,在现代化的进程中,也离不开电子钟的相关功能和原理,比如机械手的控制、家务的自动化、定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。而且是控制的核心部分。因此,研究数字钟及扩大其应用,有着非常现实的意义。 二、 设计任务和要求 1、利用STC15F2K60S作为主控器组成一个电子日历和电子钟 2、利用开发板上提供的矩阵键盘电路,数码显示电路,设计一个电子钟(日历),用矩阵键盘控制电子钟(日历)的模式转换及修改时间。 三、 设计方案 1、利用STC15F2K60S作为主控器组成一个电子日历和电子钟。 2、利用LED分别显示当前时间和日历。 3、利用开发板上自带的24个按键作为输入按钮(实际用到13个),实现手动输入时间信息。 4、利用开关k1,k2作为两个外部中断触发装置,利用两个中断子程序分别实现被修改位的选择和进入修改模式。 5利用扫描法实现对键盘矩阵的扫描,确定被按下的按键。 注: 电子钟做成如下两种格式(按B键两种格式可以切换): XX -XX-XX 由左向右分别为: 时、分、秒 XX -XX-XX 由左向右分别为: 年、月、日 (1) 矩阵键盘上0~9键分别对应数字0~9用于时间的输入 (2) 矩阵键盘上A键用于两种模式之间转换,两种模式下分别显示年月日和时分秒 (3) 矩阵键盘上B键用于对输入数字进行确认 (4) 矩阵键盘上C键用于进入闹钟时间设定模式 (5) 独立按键k1用于对被修改位的选择 (6) 独立按键k2用于进入日历修改模式 三、 程序设计 #define MAIN_Fosc 22118400L //定义主时钟 #include "STC15Fxxxx.H" /****************************** 用户定义宏 ***********************************/ #define Timer0_Reload (65536UL -(MAIN_Fosc / 1000)) //Timer 0 中断频率, 1000次/秒 #define DIS_DOT 0x20 #define DIS_BLACK 0x10 #define DIS_ 0x11 /************* 本地常量声明 **************/ u8 code t_display[]={ //标准字库 // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71, //black - H J K L N o P U t G Q r M y 0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e, 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1 u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码 /************* IO口定义 **************/ sbit P_HC595_SER = P4^0; //pin 14 SER data input sbit P_HC595_RCLK = P5^4; //pin 12 RCLk store (latch) clock sbit P_HC595_SRCLK = P4^3; //pin 11 SRCLK Shift data clock sbit led7 = p1^7; /************* 本地变量声明 **************/ u8 LED8[8]; //显示缓冲 u8 display_index; //显示位索引 bit B_1ms; //1ms标志 u8 ch; u8 mod; u8 hour,minute,second,day,month,year,one,two,three;//时间变量 u16 msecond; u8 ahour,aminute,aa,ab,ach,atem;//闹钟时间变量 //----键盘相关变量------ u8 IO_KeyState, IO_KeyState1, IO_KeyHoldCnt; //行列键盘变量 u8 KeyHoldCnt; //键按下计时 u8 KeyCode; //给用户使用的键码, 1~16有效 u8 cnt50ms; u8 a; u8 b; u8 tem; u8 code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0}; /************* 本地函数声明 **************/ void IO_KeyScan(void); //50ms call void IO_KeyDelay(void); void play(u8 ch,u8 a,u8 b); void alarm(); //-----延时子程序----- void delay(unsigned int t ) { unsigned int k,j; for(k=0;k<t;k++) { for(j=0;j<10000;j++); if(0==0) { for(j=0;j<10000;j++); for(j=0;j<10000;j++); } } } /****************************************** 1、显示时钟函数 ************************/ void DisplayRTC(void) { if(minute >= 60) { minute = 0; } if(hour >=24) { hour = 0; } if(day >= 30) { day = 0; } if(month >= 12) { month = 0; } if(year >= 99) { year = 0; } if(mod == 0) { one = hour; two = minute; three = second; } else { one = year; two = month; three = day; } LED8[0] = one / 10; LED8[1] = one % 10; LED8[2] = DIS_; LED8[3] = two / 10; LED8[4] = two % 10; LED8[5] = DIS_; LED8[6] = three / 10; LED8[7] = three % 10; } /********************** 2、RTC演示函数 ************************/ void RTC(void) { if(++second >= 60) { second = 0; if(++minute >= 60) { minute = 0; if(++hour >= 24) { hour = 0; if(++day > 30) { day = 0; if(++month > 12) { month = 0; if(++year >= 99) { year = 0; } } } } } } } /***************** 3、外部中断0子程序**************/ void int0() interrupt 0 { ch++; if(ch >=6) { ch = 0; } delay(8); IE0 = 0; } /**************** 4、外部中断1子程序******************/ void int1() interrupt 2 { a = 0; b = 0; KeyCode = 0; while(KeyCode != 28) //输入被修改位的高位,按下B键确认 { if(++cnt50ms >= 50) //50ms扫描一次行列键盘 { cnt50ms = 0; IO_KeyScan(); } if(KeyCode !=28) { a = KeyCode-17; play(ch, a, 0); } } RTC(); DisplayRTC(); KeyCode = 0; delay(8); while(KeyCode != 28) //输入被修改位的低位,按下B键确认 { if(++cnt50ms >= 50) //50ms扫描一次行列键盘 { cnt50ms = 0; IO_KeyScan(); } if(KeyCode !=28) { b = KeyCode-17; play(ch, a, b); } } tem = a*10+b; //被修改后数据寄存在tem变量中 if(ch == 0) //判断被修改的是哪一位,并赋予修改后值 { hour = tem; } else if(ch == 1) { minute = tem; } else if(ch == 2) { second = tem; } else if(ch == 3) { year = tem; } else if(ch == 4) { month = tem; } else if(ch == 5) { day = tem; } else { alarm(); } KeyCode = 0; DisplayRTC(); delay(8); IE1 = 0; } /********************** 5、主函数 ************************/ void main(void) { u8 i,k; ch = 0; IP = 0x03; //将定时器0中断赋予高优先级,使修改模式下能够正常显示修改结果 P0M1 = 0; P0M0 = 0; //设置为准双向口 P1M1 = 0; P1M0 = 0; //设置为准双向口 P2M1 = 0; P2M0 = 0; //设置为准双向口 P3M1 = 0; P3M0 = 0; //设置为准双向口 P4M1 = 0; P4M0 = 0; //设置为准双向口 P5M1 = 0; P5M0 = 0; //设置为准双向口 P6M1 = 0; P6M0 = 0; //设置为准双向口 P7M1 = 0; P7M0 = 0; //设置为准双向口 AUXR = 0x80; //Timer0 set as 1T, 16 bits timer auto-reload, TH0 = (u8)(Timer0_Reload / 256); TL0 = (u8)(Timer0_Reload % 256); ET0 = 1; //Timer0 interrupt enable TR0 = 1; //Tiner0 run EA = 1; //打开总中断 EA = 1; EX0 = 1; IT0 = 1; EX1 = 1; IT1 = 1; display_index = 0; year = 90; month = 01; day = 01; hour = 11; //初始化时间值 minute = 59; second = 59; KeyCode = 0; a = 0; b = 0; mod = 0; // for(i=0; i<8; i++) LED8[i] = DIS_BLACK; //上电消隐 for(i=0; i<8; i++) LED8[i] = i; //显示01234567 k = 0; while(1) { if(++cnt50ms >= 50) //50ms扫描一次行列键盘 { cnt50ms = 0; IO_KeyScan(); } if(KeyCode == 27) //改变显示模式 { if(mod == 0) { mod = 1; } else { mod = 0; } RTC(); DisplayRTC(); delay(8); KeyCode = 0; } if(ahour == hour||aminute == minute) //判断是否到闹钟时间决定是否响铃 { led7 = 0; //使用led7代替蜂鸣器,灯亮表示蜂鸣器响 } else { led7 = 1; } if(KeyCode == 29) { alarm(); KeyCode = 0; } if(B_1ms) //1ms到 { B_1ms = 0; if(++msecond >= 500) //1秒到 { msecond = 0; RTC(); DisplayRTC(); } } } } /**************** 6、向HC595发送一个字节函数 ******************/ void Send_595(u8 dat) { u8 i; for(i=0; i<8; i++) { dat <<= 1; P_HC595_SER = CY; P_HC595_SRCLK = 1; P_HC595_SRCLK = 0; } } /********************** 7、 显示扫描函数 ************************/ void DisplayScan(void) { Send_595(~T_COM[display_index]); //输出位码 Send_595(t_display[LED8[display_index]]); //输出段码 P_HC595_RCLK = 1; P_HC595_RCLK = 0; //锁存输出数据 if(++display_index >= 8) display_index = 0; //8位结束回0 } /********************** 8、 Timer0 1ms中断函数 ************************/ void timer0 (void) interrupt TIMER0_VECTOR { DisplayScan(); //1ms扫描显示一位 B_1ms = 1; //1ms标志 } void IO_KeyDelay(void) { u8 i; i = 60; while(--i) ; } void IO_KeyScan(void) //50ms call { u8 j; j = IO_KeyState1; //保存上一次状态 P0 = 0xf0; //X低,读Y IO_KeyDelay(); IO_KeyState1 = P0 & 0xf0; P0 = 0x0f; //Y低,读X IO_KeyDelay(); IO_KeyState1 |= (P0 & 0x0f); IO_KeyState1 ^= 0xff; //取反 if(j == IO_KeyState1) //连续两次读相等 { j = IO_KeyState; IO_KeyState = IO_KeyState1; if(IO_KeyState != 0) //有键按下 { F0 = 0; if(j == 0) F0 = 1; //第一次按下 else if(j == IO_KeyState) { if(++IO_KeyHoldCnt >= 20) //1秒后重键 { IO_KeyHoldCnt = 18; F0 = 1; } } if(F0) { j = T_KeyTable[IO_KeyState >> 4]; if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0)) KeyCode = (j - 1) * 4 + T_KeyTable[IO_KeyState & 0x0f] + 16; //计算键码 } } else IO_KeyHoldCnt = 0; } P0 = 0xff; } /************* 9、修改模式下显示函数********************/ void play(u8 ch,u8 a,u8 b) { u8 tea,teb; tea = a; teb = b; if(a > 9) { tea = 0; } if(b > 9) { teb = 0; } if(ch == 0||ch == 3) { LED8[0] = tea; LED8[1] = teb; if(ch == 0) { LED8[2] = DIS_; } else { LED8[2] = DIS_BLACK; } LED8[3] = DIS_BLACK; LED8[4] = DIS_BLACK; if(ch == 0) { LED8[5] = DIS_; } else { LED8[5] = DIS_BLACK; } LED8[6] = DIS_BLACK; LED8[7] = DIS_BLACK; } else if(ch == 1||ch == 4) { LED8[0] = DIS_BLACK; LED8[1] = DIS_BLACK; if(ch == 1) { LED8[2] = DIS_; } else { LED8[2] = DIS_BLACK; } LED8[3] = tea; LED8[4] = teb; if(ch == 1) { LED8[5] = DIS_; } else { LED8[5] = DIS_BLACK; } LED8[6] = DIS_BLACK; LED8[7] = DIS_BLACK; } else { LED8[0] = DIS_BLACK; LED8[1] = DIS_BLACK; if(ch == 2) { LED8[2] = DIS_; } else { LED8[2] = DIS_BLACK; } LED8[3] = DIS_BLACK; LED8[4] = DIS_BLACK; if(ch == 2) { LED8[5] = DIS_; } else { LED8[5] = DIS_BLACK; } LED8[6] = tea; LED8[7] = teb; } } /******************** 10、闹钟设定模式函数****************/ void alarm() { for(ach = 0; ach< 2; ach++) { play(ach, 0, 0); while(KeyCode != 28) { if(++cnt50ms >= 50) //50ms扫描一次行列键盘 { cnt50ms = 0; IO_KeyScan(); } if(KeyCode !=28) { aa = KeyCode-17; play(ach, aa, 0); } } RTC(); DisplayRTC(); KeyCode = 0; delay(8); while(KeyCode != 28) { if(++cnt50ms >= 50) //50ms扫描一次行列键盘 { cnt50ms = 0; IO_KeyScan(); } if(KeyCode !=28) { ab = KeyCode-17; play(ach, aa, ab); } } atem = aa*10+ab; if(ach == 0) { ahour = atem; } else if(ach == 1) { aminute = atem; } } } 四、 原理图设计 1、矩阵键盘模块 2、单片机及电源模块 3、数码管显示模块 4、外部中断0,1脉冲输入模块 5、led7模拟蜂鸣器模块 五、 心得体会 通过这次单片机电子日历的课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。 这个设计过程中,我们通过在原有的系统进行了改进,使之增添了年、日等的三个显示功能,使之成为一个更加适用,功能更加完备的属于自己的一个日历系统。设计结果能够符合题意,成功完成了此次实习要求,我们不只在乎这一结果,更加在乎的,是这个过程。这个过程中,我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得合作精神的重要性,学会了与他人合作。收获颇多,达到了实验的目的。- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 基于 stc15f2k60s 电子 万年历 大学 毕业设计 论文
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【天****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【天****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【天****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【天****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文