课程设计名称:多功能音乐闹钟.doc_第1页
课程设计名称:多功能音乐闹钟.doc_第2页
课程设计名称:多功能音乐闹钟.doc_第3页
课程设计名称:多功能音乐闹钟.doc_第4页
课程设计名称:多功能音乐闹钟.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计名称:多功能音乐闹钟小组成员:亓帅,潘跃龙,任少卿,沈荣宗一 课程设计目的。1. 巩固对单片机课程的认识,学习数字时钟的多样化显示。2. 通过本次设计加深对单片机课程应用的理解.3. 锻炼自己自学以及独立解决问题的能力。4. 通过此次软硬件结合使用,锻炼实践能力和理论结合实际的能力.5. 锻炼团队分工能力以及协调能力。二 用途与功能.本作品可以显示和设置二十小时制的时分秒显示,可以设置和查看星期,内设七个周闹钟(周日到周六)和一个日闹钟,另外内设八首不同的好听铃声,可以根据个人喜好设置每个闹钟的响铃铃声,同时周闹钟可以设置每周都闹或隔一周闹一次,日闹钟可以设置每天都闹或隔一天闹一次,功

2、能强大且实用,特别适合以星期为生活周期的学生或上班族使用。三 硬件设计思想和电原理图。本次设计以ATmega16单片机实验板为基础设计平台,通过编程实现时钟显示以及闹钟的各种功能,通过外部按键操作实现在七段数码管上的显示.(由于我组实验板的c端口出现故障,临时改用了b端口,请谅解)四硬件单元的使用按键介绍:短按k1键进行时间校准(设置)和星期显示或设置,同时最后一位有闪烁效果,再按k1则依次闪烁要设置的位,直到最高位闪烁时继续再按一次k1键退出设置,要设置的位有闪烁效果,每秒闪两次,进行时间设置时仍会显示时间的时分位,但秒位不显示,原先显示秒位的两个数码管显示星期,0代表星期天,1代表星期一,

3、以此类推.1. 长按k2键进入闹钟设置状态(本作品内设八个闹钟),同时显示闹钟的响铃时间、响铃方式和闹钟编号。这种状态下六个数码管的高四位显示闹钟响铃的时分.最低位显示闹钟编号,0到6为周闹钟对应周日到周六.倒数第二位显示响铃的方式,0为该闹钟关,1为每周(日)都响,2为隔一周(日)响一次且忽略本周(日),3为隔一周(日)响一次且本周(日)响。注意在此闹钟设置状态下不影响时钟走针。2. 闹钟设置状态下,短按k1键则最后一位有闪烁效果,再按k1则依次闪烁要设置的位,直到最高位闪烁时继续再按一次k1键则无位闪烁但不退出闹钟设置状态,要设置的位有闪烁效果,每秒闪两次.3. 在闹钟设置状态下同时无位闪

4、烁时,短按k2键,选择该闹钟的铃声,此时会有相应的铃声响起,本作品共内设8个不同铃声。4. 在任何情况下,有某个位闪烁时短按k2键,进行该位的数字大小的调节。5. 在时钟走时且无位闪烁时,短按k2无效,长按k1等同于短按k1。6. 闹铃响后,按下任意按键铃声停止。7. 闹铃响后,若置之不理,则铃声每隔一分钟响一次.五软件功能及测试。产品所用程序:/*File name ; demo_11_4。cChip type ; ATmega16Program type ; ApplicationClock frequency ; 1。000 000 MHzMemory model ; SmallExte

5、rnal SPAM size ; 0Data stack size ; 256/*File name ; demo_11_4.cChip type ; ATmega16Program type ; ApplicationClock frequency ; 1。000 000 MHzMemory model ; SmallExternal SPAM size ; 0Data stack size ; 256*/include <iom16v。h>include <macros.hconst unsigned char led_710 = 0xC0,0xF9,0xA4,0xB0,

6、0x99,0x92,0x82,0xF8,0x80,0x90;const unsigned char position6 = 0xC1,0xC2,0xC4,0xC8,0xD0,0xE0;const unsigned int t16 = 0,1912,1730,1518,1433,1276,1136,1012,956,865,759,716,638,568,506,470;const unsigned char d16 = 0,52,58,66,70,78,88,99,105,116,132,140,157,176,198,209;const unsigned char Max_note8=84,

7、86,64,88,90,100,78,102;const unsigned char music8102=5,2,4,2,5,2,10,6,10,2,11,2,10,2,9,2,7,2,8,10,8,2,7,2,8,2,12,6,12,2,11,2,10,2,9,2,10,2,10,10,5,2,4,2,5,2,10,6,10,2,11,2,10,2,9,2,7,2,8,2,9,2,10,2,14,2,13,6,10,2,12,2,11,2,10,2,11,2,10,6,9,2,8,14,12,2,12,2,10,2,9,2,10,2,6,4,9,2,10,2,12,2,10,2,9,10,1

8、2,2,12,2,10,2,9,2,10,2,5,4,9,2,10,2,12,2,9,2,8,10,8,2,9,2,10,2,12,2,13,2,12,2,10,2,12,2,10,2,10,2,9,2,9,10,8,2,9,2,8,2,9,4,8,2,9,4,10,4,12,2,10,10,2,4,2,4,3,4,3,6,2,2,3,4,5,2,6,4,5,6,1,4,2,4,3,4,6,4,5,4,3,2,5,14,5,2,6,2,8,8,6,4,5,4,3,4,5,2,3,6,1,2,2,2,3,6,1,2,1,4,3,4,2,2,2,4,3,4,5,4,8,12,8,4,7,8,6,4

9、,5,4,6,4,8,4,3,4,2,4,1,8,1,4,1,4,1,4,8,8,6,4,5,4,3,4,2,4,1,4,2,24,3,4,5,4,8,12,8,4,7,8,6,4,5,4,6,4,8,4,3,4,2,4,1,8,1,4,1,4,1,4,8,8,6,4,5,4,3,4,2,4,1,4,1,24,8,4,7,4,8,12,9,4,10,4,9,4,8,4,7,4,8,12,8,4,8,4,5,4,5,4,1,4,6,12,6,4,5,4,1,4,1,4,3,4,2,12,4,4,4,4,5,4,8,4,7,4,8,12,9,4,10,4,9,4,8,4,7,4,8,12,8,4,

10、8,4,5,4,5,4,1,4,6,12,6,4,5,4,5,4,8,4,7,4,8,24,5,4,12,4,11,4,10,8,10,4,11,2,10,10,10,4,11,4,10,4,11,4,10,4,9,2,8,6,8,4,10,4,12,4,13,8,13,4,13,2,12,6,9,4,9,4,11,2,10,22,8,4,10,4,12,4,13,8,13,4,13,2,12,2,12,4,9,4,9,4,11,4,10,4,11,4,10,4,9,2,8,10,9,4,10,4,6,8,6,4,8,4,8,4,7,4,7,8,8,24,12,4,12,4,11,4,10,4

11、,9,12,9,4,9,4,10,4,11,4,10,12,8,4,8,8,9,8,10,8,9,8,8,8,7,4,6,4,5,12,12,4,12,4,11,4,10,4,9,8,9,4,9,4,10,4,11,4,10,12,8,4,8,8,9,4,10,4,11,8,10,8,9,8,8,4,7,4,8,24,5,2,8,2,8,2,8,3,9,1,10,2,8,4,6,2,8,2,8,2,8,3,8,1,6,2,5,4,5,2,8,2,8,2,8,3,9,1,10,2,8,4,8,2,9,2,9,2,9,1,8,1,9,1,10,1,9,6,5,2,8,2,8,2,8,3,9,1,1

12、0,2,8,4,8,2,6,2,8,2,8,2,9,2,8,6,5,2,8,2,8,2,8,4,12,2,11,2,10,2,8,2,8,8;unsigned char note_n;unsigned int int_n;int play_on;int clock_style=0,lazy_style=0,ci=0,cci;unsigned char week_clock8=0,1,2,3,4,5,6,7,time3,time_clock83 = 10,0,7,11,5,7,12,10,7,13,15,7,14,20,7,15,25,7,16,30,7,17,35,7;unsigned cha

13、r dis_buff6;unsigned char time_counter,key_stime_counter;unsigned char clock_state = 6,return_time;int point_on=0,set_on=0,time_1s_ok=0,key_stime_ok=0;int week;void display(void)static unsigned char posit = 0;PORTB = 0xFF;PORTA = led_7dis_buffposit;if(set_on (posit = clock_state)) PORTA = 0xFF;if(po

14、int_on && (posit = 2 | posit = 4)) PORTA &= 0x7F;PORTB = positionposit;if(+posit >= 6) posit = 0;/Timer 0 比较匹配中断服务,2ms定时pragma interrupt_handler timer0_comp_isr:iv_TIMER0_COMPvoid timer0_comp_isr(void)display();if (+key_stime_counter >= 5)key_stime_counter = 0;key_stime_ok = 1;if(!

15、(+time_counter % 25) set_on = !set_on;if(time_counter = 100)time_counter = 0;time_1s_ok = 1;/T/C1 比较匹配A中断服务#pragma interrupt_handler timer1_compa_isr:iv_TIMER1_COMPAvoid timer1_compa_isr(void)if(!play_on)note_n = 0;int_n = 1;play_on = 1;elseif(int_n = 0)TCCR1B = 0x08;if (note_n Max_notecci)OCR1A = t

16、musicccinote_n;int_n = dmusicccinote_n;note_n+;int_n = int_n musicccinote_n;note_n+;TCCR1B = 0x09;elseplay_on = 0;void time_to_disbuffer(unsigned char *time) /时钟时间送显示缓冲区函数unsigned char i,j=0;for(i=0;i<=2;i+)dis_buffj+ = timei % 10;dis_buffj+ = timei / 10;void ctime_to_disbuffer(unsigned int ci) /

17、闹钟时间送显示缓冲区函数unsigned char i,j=0;for(i=0;i=2;i+)dis_buffj+ = time_clockcii % 10;dis_buffj+ = time_clockcii / 10;void wtime_to_disbuffer(unsigned int week) /星期送显示缓冲区函数unsigned char j=0;dis_buffj+ = week 10;dis_buffj+ = week / 10;#define key_input PINB#define key_mask 0b11000000define key_no 0#define k

18、ey_k1 1#define key_k2 2define key_state_0 0define key_state_1 1define key_state_2 2unsigned char read_key(void)static unsigned char key_state = 0,key_old;unsigned char key_press,key_return = key_no;static int press_time=0;key_press = key_input key_mask; /读按键I/O电平switch(key_state)case key_state_0: /按

19、键初始态if(key_press != key_mask) key_old = key_press; /记录原电平key_state = key_state_1; /键被按下,状态转换到键确认态break;case key_state_1: /按键确认态if(key_press = key_old) /与原电平比较(消抖处理)if(key_press = 0b01000000) key_return = key_k1;else if(key_press = 0b10000000) key_return = key_k2;key_state = key_state_2; /状态转换到键释放态 T

20、CCR1B = 0x08; /响铃关note_n = 0;lazy_style=0; /懒人响铃关elsekey_state = key_state_0; /按键已抬起,转换到按键初始态break;case key_state_2:if(key_press = key_mask) press_time=0; key_state = key_state_0; /按键已释放,转换到按键初始态 else if((key_press=0b10000000)&(+press_time>=100) press_time=0; if(+clock_style1) clock_style=0;

21、break;return key_return;void main(void)unsigned char key_temp,i;DDRA = 0xFF; /LED段码输出PORTB = 0x00;DDRB = 0x3F; /LED位控输出DDRD = 0x20; /PD5音乐播放输出/T/C0初始化OCR0 = 0xF9; /OCR0 = 0xF9(249),(249+1)/(125kHz) = 2msTCCR0 = 0x0A; /内部时钟,8分频(1MHz/8 = 125 kHz),CTC模式/T/C1初始化TCCR1A = 0x40;TCCR1B = 0x08;TIMSK = 0x12;

22、/使能T/C1比较匹配A中断,使能T/C0比较匹配中断time2 = 6; time1 =58; time0 = 55; week=0; /设时间初始值为23:58:55 星期天 SEI(); /使能全局中断while(1)if(time_1s_ok) /1s到 time_1s_ok = 0;point_on = !point_on; /秒闪烁标志if(+time0 = 60) /秒加1,以下为时间调整 time0 = 0; if(lazy_style) TCCR1B = 0x09; /1min到 懒人模式响铃if(+time1 >= 60)time1 = 0;if(+time2 = 2

23、4) time2 = 0; if(+week=7) week=0; if(time2=time_clockweek2)&&(time1=time_clockweek1)&(time_clockweek0!=week)) if((time_clockweek0)=(10+week) ci=week_clockweek;TCCR1B = 0x09;lazy_style=1; else if((time_clockweek0+=10)(30+week)) time_clockweek0=20+week; cci=week_clockweek;TCCR1B = 0x09;laz

24、y_style=1; /周闹钟时间到响铃 同时懒人模式启动 if((time2=time_clock72)(time1=time_clock71)(time_clock70!=7)) if((time_clock70)=(17)) cci=week_clockweek;TCCR1B = 0x09;lazy_style=1; else if((time_clock70+=10)>(37)) time_clock70=27; cci=week_clock7;TCCR1B = 0x09;lazy_style=1; /日闹钟时间到响铃 同时懒人模式启动 if(+return_time >=

25、20) & ((clock_state != 6)|(clock_style=1)) clock_state = 6;clock_style=0;if(clock_style = 1) ctime_to_disbuffer(ci);else if(clock_state!=0)time_to_disbuffer(time);if(key_stime_ok) /10ms到,键处理key_stime_ok = 0;key_temp = read_key(); /调用按键接口程序if(clock_style) /判断是否处于闹钟设置状态if(key_temp) /确认有键按下 return_

26、time = 0; if(key_temp = key_k1) if(+clock_state = 7) clock_state = 0; if(clock_state = 0) ctime_to_disbuffer(ci);if(clock_state = 6)ctime_to_disbuffer(ci); if((clock_state = 0) & (key_temp = key_k2) if(+ci=8) ci=0; ctime_to_disbuffer(ci); if((clock_state = 1) & (key_temp = key_k2) if(time_cl

27、ockci0+=10)>(30+ci) time_clockci0=ci; ctime_to_disbuffer(ci); if((clock_state=6) && (key_temp = key_k2) if(+week_clockci)>=8) week_clockci=0; cci=week_clockci;TCCR1B = 0x09;lazy_style=1; if(clock_state<6) && (clock_state>1) & (key_temp = key_k2)) /K2键按下 if(clock_state 2) time_clockciclock_state / 2 += 10; else if(time_clockciclock_state / 2 10) = 9) time_clockciclock_state / 2 -= 9;else time_clockciclock_state / 2 += 1; if(time_clockci0 = 60) time_clockci0 -= 60; /以下为设置时间调整if(time_clockci1 >= 60)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论