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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

单片机课程设计my.docx

1、单片机课程设计my湖南科技大学信息与电气工程学院 单片机微机原理课程设计报告课 程: 单片机微机原理及接口技术 题 目: 基于STC15F2K60S的电子万年历 专 业: 通信工程 班 级: 通信一班 姓 名: 孟 焱 学 号: 1204040101 指导教师: 宋 芳 任务书题 目基于STC15F2K60S单片机的电子万年历时间安排2015年6月66月19日(第15、16周)目 的:通过单片机原理与应用这门课的课程设计,学生应能对STC15F2K60S单片机有一个全面的认识,掌握以STC15F2K60S单片机为核心的电子电路的设计方法和应用技术。1.进一步掌握矩阵键盘电路的编程方法。 2.进

2、一步掌握定时器的使用和编程方法。 3.进一步掌握中断处理程序的编程方法。总体方案实现:1、利用STC15F2K60S作为主控器组成一个电子日历和电子钟。2、利用LED分别显示当前时间和日历。3、利用开发板上自带的24个按键作为输入按钮(实际用到13个),实现手动输入时间信息。4、利用开关k1,k2作为两个外部中断触发装置,利用两个中断子程序分别实现被修改位的选择和进入修改模式。5利用扫描法实现对键盘矩阵的扫描,确定被按下的按键。要求:1、利用STC15F2K60S作为主控器组成一个电子日历和电子钟2、利用开发板上提供的矩阵键盘电路,数码显示电路,设计一个电子钟(日历),用矩阵键盘控制电子钟(日

3、历)的模式转换及修改时间。指导教师评语: 评分等级:【 】指导教师签名:一、 引言 单片机因将其主要组成部分集成在一个芯片上而得名,就是把中 央处理器、随机存储器、只读存储器、中断系统、定时器/计数器以及I/O接口电路等部件集成在一个芯片上。基于单片机设计的数字钟精确度较高,因为在程序的执行过程中,任何指令都不影响定时器的正常计数,即便程序很长也不会影响中断的时间。数字钟是采用数字电路实现对日期、时、分、秒,数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表的报时功能。数字钟

4、已成为人们日常生活中的必需品,广泛应用于家庭、车站、码头、剧院、办公室等场所,给人们的生活、学习、工作带来极大的方便。不仅如此,在现代化的进程中,也离不开电子钟的相关功能和原理,比如机械手的控制、家务的自动化、定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。而且是控制的核心部分。因此,研究数字钟及扩大其应用,有着非常现实的意义。二、 设计任务和要求1、利用STC15F2K60S作为主控器组成一个电子日历和电子钟2、利用开发板上提供的矩阵键盘电路,数码显示电路,设计一个电子钟(日历

5、),用矩阵键盘控制电子钟(日历)的模式转换及修改时间。 三、 设计方案1、利用STC15F2K60S作为主控器组成一个电子日历和电子钟。2、利用LED分别显示当前时间和日历。3、利用开发板上自带的24个按键作为输入按钮(实际用到13个),实现手动输入时间信息。4、利用开关k1,k2作为两个外部中断触发装置,利用两个中断子程序分别实现被修改位的选择和进入修改模式。5利用扫描法实现对键盘矩阵的扫描,确定被按下的按键。注:电子钟做成如下两种格式(按B键两种格式可以切换): XX -XX-XX 由左向右分别为: 时、分、秒 XX -XX-XX 由左向右分别为: 年、月、日(1) 矩阵键盘上09键分别对

6、应数字09用于时间的输入(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 0x2

7、0#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,0x3

8、7,0x6e, 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46; /0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1u8 code T_COM=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80; /位码/* IO口定义 */sbit P_HC595_SER = P40; /pin 14 SER data inputsbit P_HC595_RCLK = P54; /pin 12 RCLk store (latch) clocksbit P_HC595_SRCLK = P43; /pin

9、11 SRCLK Shift data clocksbit led7 = p17;/* 本地变量声明 */u8 LED88; /显示缓冲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 KeyHold

10、Cnt; /键按下计时u8 KeyCode; /给用户使用的键码, 116有效u8 cnt50ms;u8 a;u8 b;u8 tem;u8 code T_KeyTable16 = 0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0;/* 本地函数声明 */void IO_KeyScan(void); /50ms callvoid 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;kt;k+) f

11、or(j=0;j10000;j+); if(0=0) for(j=0;j10000;j+); for(j=0;j= 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; LED80 = one / 10; LED81 = one % 10

12、; LED82 = DIS_; LED83 = two / 10; LED84 = two % 10; LED85 = DIS_; LED86 = three / 10; LED87 = 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子程

13、序*/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(

14、); 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

15、= 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

16、= 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 =

17、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; i8; i+) LED8i = DIS_BLACK; /上电消隐 for(i=0; i= 50)

18、/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_

19、1ms = 0; if(+msecond = 500) /1秒到 msecond = 0; RTC(); DisplayRTC(); /* 6、向HC595发送一个字节函数 */void Send_595(u8 dat) u8 i; for(i=0; i8; i+) dat = 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)

20、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

21、_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_KeyTableIO_KeyState 4; if(j != 0) & (T_KeyTableIO_KeyState& 0x0f != 0) KeyCode = (j - 1) * 4 + T_KeyTableIO_KeyState & 0x0f + 16; /

22、计算键码 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) LED80 = tea; LED81 = teb; if(ch = 0) LED82 = DIS_; else LED82 = DIS_BLACK; LED83 = DIS_BLACK; LED84 = DIS_BLACK; if(ch = 0) LED85 = DIS_;

23、 else LED85 = DIS_BLACK; LED86 = DIS_BLACK; LED87 = DIS_BLACK; else if(ch = 1|ch = 4) LED80 = DIS_BLACK; LED81 = DIS_BLACK; if(ch = 1) LED82 = DIS_; else LED82 = DIS_BLACK; LED83 = tea; LED84 = teb; if(ch = 1) LED85 = DIS_; else LED85 = DIS_BLACK; LED86 = DIS_BLACK; LED87 = DIS_BLACK; else LED80 = DIS_BLACK; LED81 = DIS_BLACK; if(ch = 2) LED82 = DIS_; else LED82 = DIS_BLACK; LED83 = DIS_BLACK; LED84 = DIS_BLACK

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

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