微机实验_期末设计_多功能音乐闹钟_第1页
微机实验_期末设计_多功能音乐闹钟_第2页
微机实验_期末设计_多功能音乐闹钟_第3页
微机实验_期末设计_多功能音乐闹钟_第4页
微机实验_期末设计_多功能音乐闹钟_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、中山大学 微机原理与应用试验学 生 实 验 报 告实 验 名 称 期末设计 多功能音乐闹钟 院 系 信息科学与技术学院 10自动化 学 生 姓 名 学 号 指 导 教 师 实验起止时间 2012年12月12日至2012年12月23日 1、 音乐闹钟已经实现的功能1. 输入模块:键盘输入:按照 ”时:分:秒” 的格式输入现在时间和设定闹钟时间,如果输入的字符不符合通用的时间格式的话,则无法输入。光标会回到原位,要求重新输入。比如:输入”23:57:60”,由于秒数据只有”0059”,则在输入到”6”的时候,光标会回到”2”那里,要求重新输入。同样,非数字的字符也无法输入。2. 正常显示模块:(1

2、).七段数码管:显示现在的时间,可以通过逻辑开关K5来切换秒显示或者分显示。(2).点阵:显示现在的时间,可以通过逻辑开关K3来切换成滚动显示模式或者翻页显示模式,通过逻辑开关K6来切换点阵的颜色(红色或黄色),通过ADC0809从电位器0读入数据来控制点阵滚动显示模式下的滚动速度或者翻页模式下的翻页。(3).七段数码管和点阵是同时工作的。(4).更改设定的闹钟时间:按下键盘的”R”或”r”键(”reset”),即可更改闹钟时间的设定值。在此期间七段数码管和点阵虽然不显示,但更改完成后程序会把更改时所耗的时间自动补给原来的时间,使得在更改前后,可以按照确定的正常时间运行。(5).退出程序:按下

3、键盘的”Q”或”q”键(“quit”),既可以退出程序。除了上述按键之外,本程序在正常运行时候不会对其他按键有响应。3. 闹钟模块:(1).音乐播放:当设定时间到了的时候,会播放歌曲明天会更好。可以通过ADC0809从电位器1读入数据来控制音乐播放速度的快慢。(2).走马灯:当音乐播放的同时,LED灯会以走马灯的形式显示,走马灯随着音乐的节奏而改变。(3).值得一提的是,在闹钟功能运行的时候,七段数码管和点阵还保持正常显示功能不变。音乐播放速度的调节与点阵滚动速度的调节之间是相互独立、互不干扰的。(4).闹钟开关:逻辑开关K7控制闹钟的开关。闹钟功能运行时,关闭闹钟可以使程序重新回到正常显示状

4、态。如果闹钟没有打开,即使是到了设定时间,闹钟功能也不会运行。(5).贪睡功能:为了使得设计更为人性化,故特定通过中断方式设置了一个30s的贪睡功能。当进入闹钟状态的时候,按下单脉冲按键,会使得现在的闹钟状态暂时结束。从按下单脉冲按键时算起,30s之后闹钟状态会重新启动。呵呵(6).屏幕显示:当设定的时间一到,屏幕上就会自动显示”time is up! it is xx : xx : xx now!”,可以显示进入闹钟时刻的时间。二、使用器件和它们的作用可编程并行接口8255(方式0):A口输出七段数码管的段码;C口输出到8个LED灯。可编程定时/计数器8253:计数器0(方式3)和1(方式0

5、)用来实现1s定时;计数器2(方式3)输出一定频率的方波,作为音符输入到扬声器。简单并行接口74LS244和逻辑电平开关:读入各种控制信号,包括1s定时信息。简单并行接口74LS273:2、5端口输出七段数码管位码,6、9端口控制扬声器通断。模/数转换器ADC0809和电位器:IN0读入点阵滚动速度或翻页状态控制信息,IN1读入音乐播放速度控制信息。七段数码管:实时显示现在的时间,可以分、秒切换。点阵:实时显示现在的时间,格式为 ”时:分:秒”。可以切换成滚动显示模式和翻页模式,可以改变颜色。扬声器:闹钟状态时播放音乐。8个LED灯:作为走马灯显示。三、电路连接图(本人用visio画的,还算比

6、较清楚。电路的连接和各部分功能都有说明。)四、设计过程简述期末的设计对我来说,是检测我平时积累的一次很好的机会。在以往的实验中,我都比较重视以子程序的形式来实现各个模块和功能。在这次的作品设计过程中,就用到了一些现成的程序模块,比如:七段数码管、点阵滚动显示子程序、音乐播放子程序等。平时的积累使我不用再在这些地方浪费时间,可以把时间真正用到本次设计的难点上。所以,积累很重要!写程序,还是一步一步来吧,下面是我整个工作的流程图:五、程序流程解析1.主程序流程图:2.输入模块流程图:3.正常显示模块流程图:4.闹钟状态模块流程图:六、程序代码和一些解析、实验现象和一些感想实验 音乐闹钟:1. 输入

7、功能:不规范的数据无法输入。2. 时钟功能:七段数码管上分、秒显示切换; 点阵同时显示 "时:分:秒"数据,滚动或翻页显示、改变颜色、滚动速度控制; 可以重新设定闹钟时间,在此期间时间依然计算。3. 闹钟功能: 时钟功能始终保持不变; 闹钟时间到,播放音乐、显示走马灯、在屏幕上显示设定的闹钟时间; 音乐播放速度控制,与时钟功能互不干扰; 闹钟开关和30s贪睡功能。实验代码和理解 io8253_0 equ 280h ;理解:8253地址。 io8253_1 equ 281h io8253_2 equ 282h io8253_mode equ 283h io8255_a equ

8、 288h ;理解:8255地址。 io8255_c equ 28ah io8255_mode equ 28bh ls244 equ 290h ;理解:74ls244地址。 ls273 equ 298h ;理解:74ls273地址。 adc0809_0 equ 2a0h ;理解:ADC0809地址。 adc0809_1 equ 2a1h proth equ 2a8h ;理解:行片选地址。 protlr equ 2b0h ;理解:红色列片选地址。 protly equ 2b8h ;理解:黄色列片选地址。 data segment now_hour dw 0 ;现在的时分秒数据。 now_minu

9、te dw 0 now_second dw 0 now_hour_BCD dw 0 ;现在的时分秒数据对应的BCD码。 now_minute_BCD dw 0 now_second_BCD dw 0 alarm_hour dw 0 ;闹钟的时分秒数据。 alarm_minute dw 0 alarm_second dw 0 temporary_input_data dw 0 ;暂存输入数据。 temporary_input_data_BCD dw 0 input_flags_1 db 0 ;输入标志位。 input_flags_2 db 0 ;输入标志位。 if_time_up db 0 ;闹

10、钟时间是否到判断标志位。 if_reinput_alarm_time db 0 ;记录是否重新输入闹钟时间。 hundred db 0 ;记录并存放系统时间数据,作为差值之用。 ten db 0 unit db 0 carry db 0 ;记录进位。 if_time_already_updata db 0alarm_time_input_message1 db '<set the time now according to ',22h,'hour:minute:second',22h,'> ',' : : ',8 du

11、p(08h),'$' ;输入设置现在时间的信息。alarm_time_input_message2 db '<set the alarm time according to ',22h,'hour:minute:second',22h,'> ',' : : ',8 dup(08h),'$' ;输入设置闹钟时间的信息。alarm_time_input_message3 db 0dh,08h,0dh,'$' ;这个数据有点小技巧,分别为回车,退格,再回车,这样就使得重新输入时

12、光标会回到句首,避免了输入不规范时输入信息太多。 alarm_time_show_message4_1 db 'time is up! it is ','$' alarm_time_show_message4_2 db ' now!',0ah,0dh,'$' clock_open_or_close db 0 ;理解:判断闹钟的开关状态。 which_time_dot_matrix_show dw 0 ;理解:记录点阵显示8列的次数,此数据用来使得点阵滚动速度和音乐播放速度互不干扰。 digital_tude_or_dot_matr

13、ix db 0 ;理解:判断是显示七段数码管还是显示点阵。 dot_matrix_roll_or_page db 0 ;理解:判断点阵是滚动显示还是翻页显示。 minute_or_second dw 0 ;理解:使七段数码管显示分和秒切换的存储单元。 led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;七段数码管段码 bz dw 0 ;位码red_or_yellow dw 0 ;理解:使红灯和黄灯切换的存储单元,用于存放红色列片选地址或黄色列片选地址。static_display_time dw 0bh ;理解:静态显示次数,即每8列显示次数。这个数

14、据很重要,将决定数据滚动的快慢。 music_open_or_close db 0 ;理解:使喇叭开关切换的存储单元。 dot_matrix_static_display db 0 ;理解:这个数据为点阵显示8列的起始偏移地址。dot_matrix_number db 0ffh,081h,0ffh,00h,041h,0ffh,001h,00h,09fh,091h,0f1h,00h,091h,091h,0ffh,00h,0f0h,010h,0ffh,00h,0f1h,091h,09fh,00h,0ffh,091h,09fh,00h,080h,080h,0ffh,00h,0ffh,091h,0ff

15、h,00h,0f1h,091h,0ffh ;点阵显示的时分秒数据对应的数码 dot_matrix_number_show_time db 35, 7 dup(00h) db 3 dup(0ffh),00h,3 dup(0ffh), 00h,24h,00h, 3 dup(0ffh),00h,3 dup(0ffh), 00h,24h,00h, 3 dup(0ffh),00h,3 dup(0ffh) db 7 dup(00h) ;点阵显示的数据存放区。 music_delay_time_control dw 0 ;理解:这个数据很重要,将决定音乐播放速度的快慢。 music_table dw 262

16、, 294, 330, 349, 392, 440, 494 ,0ffffh,0ffffh,0ffffh;最低音 dw 523, 587, 659, 698, 784, 880, 988 ,0ffffh,0ffffh,0ffffh;较低音 dw 1047,1175,1329,1397,1568,1760,1976 ,0ffffh,0ffffh,0ffffh;较高音 dw 2093,2349,2637,2794,3136,3520,3951 ,0ffffh,0ffffh,0ffffh;最高音tomorrow_will_be_better db 13,14,15,15,15,15,15,16,15

17、,14,14,10,13,14,15,15,13,12,11,12,12,10,13,12,11,11,11,11,21,21,17,17,21,17,16,15,10,16,15,14,14,15,16,15,15,10 ;轻轻敲醒沉睡的心灵,慢慢张开你的眼睛,看看忙碌的世界是否依然,孤独的转个不停。 db 21,21,16,15,15,16,15,15,10,16,16,15,11,12,13,10,12,11,11,11,13,13,13,12,12,12,10,12,22,22,17,16,15,10 ;春风不解风情,吹动少年的心,让昨日脸上的泪痕,随记忆风干了。 db 10,13,1

18、4,15,15,15,15,15,16,15,14,14,10,13,14,15,15,13,12,11,12,12,10,13,12,11,11,11,11,21,21,17,17,21,17,16,15,10,16,15,14,14,15,16,15,15,10 db 21,21,16,15,15,16,15,15,10,16,16,15,11,12,13,10,12,11,11,11,13,13,13,12,12,12,10,16,15,13,12,05,13,12,11,10;。第二段,与上面的音符基本一样。 db 16,16,16,17,21,17,16,17,17,21,22,17

19、,10,21,17,16,15,15,15,11,12,13,10,13,17,17,13,13,22,22,21,17,16,16,10 ;唱出你的热情伸出你的双手,然我拥抱着你的梦,让我拥有你真心的面孔。 db 16,16,16,17,21,17,16,17,17,21,22,17,17,23,22,21,21,21,10,17,16,16,16,16,15,15,12,13,11,10 ,0ffh;让我们的笑容,充满着青春的骄傲,让我们期待明天会更好。music_time db 05,05,08,08,05,08,05,01,05,01,08,08,05,05,08,08,05,05,0

20、8,01,08,08,05,05,05,08,05,05,01,08,05,01,05,05,05,08,08,05,05,08,05,05,01,05,08,08 ;音乐每个音符对应的节拍。 db 05,08,05,05,01,05,01,08,08,08,08,05,08,05,08,08,08,08, 05,05,08,05,01,05,01,08,08,05,08,08,05,08,08,08 db 08,05,05,08,08,05,08,05,01,05,01,08,08,05,05,08,08,05, 05,08,01,08,08,05,05,05,08,05,05,01,08,

21、05,01,05,05,05,08,08,05,05,08,05,05,01,05,08,08 db 05,08,05,05,01,05,01,08,08,08,08,05,08,05,08,08,08,08, 05,05,08,05,01,05,01,08,08,05,08,05,05,05,01,05,08,08 db 05,05,05,05,01,05,05,05,08,05,08,08,08,05,05,05,01,05, 05,05,05,08,08,08,08,05,08,05,08,08,05,01,05,08,08 db 05,05,05,05,01,08,05,05,08,0

22、5,08,05,05,05,01,05,05,08, 08,05,08,08,05,08,08,08,05,08,08,12 count db ? ;理解:这个数据用来记录播放到第几个音乐音符。 figure_lamp db 1+160, 0fch,0f9h,0f3h,0e7h,0cfh,09fh,03fh,07fh,0ffh,000h,0ffh,000h,0ffh,000h,0ffh,000h ;花样灯。 db 0e7h,0dbh,0bdh,07eh,0bdh,0dbh,0e7h,0ffh,0e7h,0c3h,081h,000h,081h,0c3h,0e7h,0ffh db 0aah,055

23、h,018h,0ffh,0f0h,00fh,000h,0ffh,0f8h,0f1h,0e3h,0c7h,08fh,01fh,03fh,07fh db 07fh,03fh,01fh,08fh,0c7h,0e3h,0f1h,0f8h,0ffh,000h,000h,0ffh,0ffh,00fh,0f0h,0ffh db 0feh,0fdh,0fbh,0f7h,0efh,0dfh,0bfh,07fh,0ffh,000h,0ffh,000h,0ffh,000h,0ffh,000h db 0ffh,000h,0ffh,000h,0ffh,000h,0ffh,000h,07fh,0bfh,0dfh,0efh

24、,0f7h,0fbh,0fdh,0feh db 0feh,0fch,0f8h,0f0h,0e0h,0c0h,080h,000h,0ffh,000h,0ffh,000h,0ffh,000h,0ffh,000h db 07eh,0deh,0f6h,0fch,0bch,0ech,0f8h,078h,0d8h,0f0h,0b0h,0e0h,060h,0c0h,080h,000h db 040h,010h,004h,001h,081h,021h,009h,003h,043h,013h,007h,087h,027h,00fh,04fh,01fh db 09fh,03fh,07fh,0ffh,0bfh,0e

25、fh,0fbh,0feh,07eh,0deh,0f6h,0fch,0bch,0ech,0f8h,078h figure_count db ? ;理解:这个数据用来记录点亮了第几个状态的走马灯。 data endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,ax mov dx,io8255_mode mov al,80h out dx,al;=;=;= 输入模块 =;=;=;input_module:input_now_time: call input_now_hour_minute_second ;输入现在时间数据。

26、 call output_enter ;回车换行。input_alarm_time: call input_alarm_hour_minute_second ;输入设定闹钟时间数据。 call output_enter ;回车换行。 mov if_time_up,00h ;这个if_time_up数据在正常显示状态里起到判断是否应该进入到闹钟模式的作用。 mov ax,now_hour ;之所以这里做判断,是为了相应输入现在时间数据和输入设定闹钟时间数据相同的情况。 cmp alarm_hour,ax jnz jmp_display_module mov if_time_up,01h ;若no

27、w和alarm时数据相同则if_time_up=01h。 mov ax,now_minute cmp alarm_minute,ax jnz jmp_display_module mov if_time_up,02h ;若now和alarm分数据相同则if_time_up=01h。 mov ax,now_second cmp alarm_second,ax jnz jmp_display_module mov if_time_up,03h ;若now和alarm秒数据相同则if_time_up=01h。 cmp if_reinput_alarm_time,02h ;这个判断是判断重新设定闹钟时

28、间时,是否对这段时间差进行补偿。jz jmp_re_display_module ;如果已经补偿了,则重新进入正常显示状态模块;否则,则利用读取系统时间给予补偿。jmp_display_module: jmp display_module jmp_re_display_module: call adjust_now_time_accroding_to_system_time jmp re_display_module;=;= 实现输入与存储功能的子程序 =;=;* 读进设置时分秒数据子程序(输入传递参数为input_count,输出传递参数为temporary_input_data、tempo

29、rary_input_data_BCD) *;input_hour_minute_second_unit proc near jmp inputinput_error: mov dx,offset alarm_time_input_message3 ;显示提示信息 mov ah,09h int 21h cmp input_flags_1,01h jnz input_alarm_time jmp input_now_timeinput: mov ah,01h ;理解:输入十位数字,不是"10到59"会退出程序。 int 21h ;判断个位并存储其16进制数 cmp input

30、_flags_2,01h jz input_judge_0_2input_judge_0_5: cmp al,'0' jl input_error cmp al,'5' jg input_error jmp input_next_1input_judge_0_2: cmp al,'0' jl input_error cmp al,'2' jg input_error input_next_1: sub al,30h ;将所得字符的ASCII码减30H cmp input_flags_2,01h jnz input_next_3 c

31、mp al,02h jz input_next_3input_next_4: mov input_flags_2,02hinput_next_3: and ah,00h mov temporary_input_data,ax mov ax,10 mul temporary_input_data mov temporary_input_data,ax mov ah,01h ;理解:输入个位数字,不是"10到59"会退出程序。 int 21h ;判断十位并存储其16进制数 cmp input_flags_2,01h jz input_judge_0_4input_judge_0

32、_9: cmp al,'0' jl input_error cmp al,'9' jg input_error jmp input_next_2input_judge_0_4: cmp al,'0' jl input_error cmp al,'3' jg input_error input_next_2: sub al,30h ;将所得字符的ASCII码减30H add temporary_input_data,ax sub temporary_input_data,0100h jmp input_exit input_exit

33、: mov ax,temporary_input_data aam mov temporary_input_data_BCD,axretinput_hour_minute_second_unit endp;*;=;* 读进设置现在时分秒数据子程序(无输入传递参数,输出传递参数为now等) *;input_now_hour_minute_second proc near mov dx,offset alarm_time_input_message1 ;显示提示信息 mov ah,09h int 21h mov input_flags_1,01h ;输入现在时间。 mov input_flags_

34、2,01h call input_hour_minute_second_unit mov ax,temporary_input_data mov now_hour,ax mov ax,temporary_input_data_BCD mov now_hour_BCD,ax mov bx,08;点阵时输入。 call dot_matrix_time_data_update mov al,':' call output_a_ASCII mov input_flags_2,02h call input_hour_minute_second_unit mov ax,temporary_

35、input_data mov now_minute,ax mov ax,temporary_input_data_BCD mov now_minute_BCD,ax mov bx,18;点阵分输入。 call dot_matrix_time_data_update mov al,':' call output_a_ASCII call input_hour_minute_second_unit mov ax,temporary_input_data mov now_second,ax mov ax,temporary_input_data_BCD mov now_second_

36、BCD,ax mov bx,28;点阵秒输入。 call dot_matrix_time_data_update mov if_reinput_alarm_time,02hretinput_now_hour_minute_second endp;*;=;* 读进设置闹钟时分秒数据子程序(无输入传递参数,输出传递参数为alarm等) *;input_alarm_hour_minute_second proc near mov dx,offset alarm_time_input_message2 ;显示提示信息 mov ah,09h int 21h mov input_flags_1,02h ;

37、输入闹钟时间。 mov input_flags_2,01h call input_hour_minute_second_unit mov ax,temporary_input_data mov alarm_hour,ax mov al,':' call output_a_ASCII mov input_flags_2,02h call input_hour_minute_second_unit mov ax,temporary_input_data mov alarm_minute,ax mov al,':' call output_a_ASCII call i

38、nput_hour_minute_second_unit mov ax,temporary_input_data mov alarm_second,axretinput_alarm_hour_minute_second endp;*;=;* 输出一个ASCII码的子程序(输入传递参数为al,无输出传递参数) *; mov dl,al ;输出一个ASCII码。 mov ah,02h int 21hretoutput_a_ASCII endp;*;=;* 输出回车换行的子程序(输入传递参数为al,无输出传递参数) *;output_enter proc near mov al,0ah call o

39、utput_a_ASCII mov al,0dh call output_a_ASCIIretoutput_enter endp;*;=;* 根据系统时间调整现在时间(输入传递参数为hundred、ten、unit,输出传递参数为now_time等) *;adjust_now_time_accroding_to_system_time proc near push ax push cx push dx mov ah,2ch int 21h mov carry,00hre_compare_unit: cmp dh,unit jg no_unit_adjust add dh,60 add carr

40、y,01h jmp re_compare_unitno_unit_adjust: sub dh,unit ;得到调整后的秒差值。 sub cl,carry mov carry,00hre_compare_ten: cmp cl,ten jg no_ten_adjust add cl,60 add carry,01h jmp re_compare_tenno_ten_adjust: sub cl,ten ;得到调整后的分差值。 sub ch,carry mov carry,00hre_compare_hundred: cmp ch,hundred jg no_hundred_adjust add

41、 ch,24 add carry,01h jmp re_compare_hundredno_hundred_adjust: sub ch,hundred;得到调整后的时差值。 mov ah,00h mov carry,00h mov al,dh add now_second,axre_compare_now_second: cmp now_second,60 jl no_now_second_adjust sub now_second,60 add carry,01h jmp re_compare_now_secondno_now_second_adjust: ;完成秒数据的重置。 mov al,carry s

温馨提示

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

评论

0/150

提交评论