一首歌曲.docx
- 文档编号:11775425
- 上传时间:2023-04-01
- 格式:DOCX
- 页数:21
- 大小:144.82KB
一首歌曲.docx
《一首歌曲.docx》由会员分享,可在线阅读,更多相关《一首歌曲.docx(21页珍藏版)》请在冰豆网上搜索。
一首歌曲
一、设计目的:
(题目四号宋体字)
通过一个以8位单片机为核心的模拟量数字表的硬件调试过程,掌握具有A/D、七段LED显示、RS-485通信、Watchdog等接口电路的单片机应用系统的设计思想和方法。
学习应用系统软件的模块化设计方法,通过源程序的编辑、汇编或编译、链接、仿真调试,完成给定的任务。
通过上述过程提高学生工程实践能力和素质。
二、设计任务:
要求明确设计任务内容及任务分工等;(内容小四号宋体字)
★基本任务:
完成蜂鸣器、键盘、七段LED显示器的自检程序设计。
(1)蜂鸣器自检
要求:
利用程序实现两种以上声音。
(2)键盘自检
要求:
确定键盘正确。
(3)七段LED显示器自检
要求:
确定LED显示器每一段均正确。
框图(包括自检和任务的框图):
1、硬件编程框图及相关说明
2、主程序框图、子程序框图及相关说明
三、程序清单:
要求有明确的程序注解、程序清单可分两栏打印
(1)蜂鸣器自检程序
BEEP:
setbp2.3;关喇叭
acalldelay1;调用延时1
clrp2.3;开喇叭
acallDELAY2;调用延时2
setbp2.3;关喇叭
acallDELAY2;调用延时2
clrp2.3;开喇叭
acallDELAY3;调用延时3
setbp2.3;关喇叭
acallDELAY3;调用延时3
sjmpBEEP;跳到beep
RET
DELAY1:
;延时子程序
MOVR1,#0FFH
CX0:
MOVR2,#0FFH
CX:
DJNZR2,CX
DJNZR1,CX0
RET
DELAY2:
延时子程序
MOVR1,#0FAH
CX1:
MOVR2,#0FAH
CX2:
DJNZR2,CX2
DJNZR1,CX1
RET
DELAY3:
延时子程序
MOVR1,#0FAH
CX3:
MOVR2,#0FAH
CX4:
DJNZR2,CX4
DJNZR1,CX3
RET
(2)键盘自检程序
BEEP:
MOVR1,#4H;设置移位次数
LCALLSEL8;打开三态门
MOVP1,#0FFH;将P1口设置成I/O
MOVA,P1;采样
LCALLSEL7;关闭三态门
SJMPCXW1
RET
CXW1:
RRCA;把键的值放到进位位
JNCCXW2;如果键合上,跳到CXW2,发音子程序
DJNZR1,CXW1;(K1没闭合,就看K2是否闭合;K2没闭合,就看K3是否闭合;K3没闭合,就看K4是否闭合)
SJMPBEEP;四个键都没闭合,就重新采样
RET
CXW2:
CLRP2.3;开喇叭
LCALLDELAY;调用延时
SETBP2.3;关喇叭
SJMPBEEP;发音完毕,跳转到BEEP,重新采样
RET
SEL7:
CLRP2.7;(关闭三态门子程序)
SETBP2.6
SETBP2.5
RET
SEL8:
SETBP2.7;(打开三态门子程序)
SETBP2.6
SETBP2.5
RET
DELAY:
MOVR6,#0AH;(延时子程序)
CXW3:
MOVR7,#0F8H
CXW4:
DJNZR7,CXW4
DJNZR6,CXW3
RET
(3)七段LED显示器自检程序
DT1:
CLRP2.5;(使第一位LED有效,并显示从1到9)
CLRP2.6
CLRP2.7
LCALLcc1
RET
DT2:
CLRP2.5;(使第二位LED有效,并显示从1到9)
CLRP2.6
SETBP2.7
LCALLcc1
RET
DT3:
CLRP2.5;(使第三位LED有效,并显示从1到9)
SETBP2.6
CLRP2.7
LCALLcc1
RET
DT4:
CLRP2.5;(使第四位LED有效,并显示从1到9)
SETBP2.6
SETBP2.7
LCALLcc1
RET
DT5:
SETBP2.5;(使第五位LED有效,并显示从1到9)
CLRP2.6
CLRP2.7
LCALLcc1
LJMPDT1
RET
cc1:
LCALLSEL0;(调用送字型的子程序,使LED显示0到9)
LCALLDELAY
LCALLSEL1
LCALLDELAY
LCALLSEL2
LCALLDELAY
LCALLSEL3
LCALLDELAY
LCALLSEL4
LCALLDELAY
LCALLSEL5
LCALLDELAY
LCALLSEL6
LCALLDELAY
LCALLSEL7
LCALLDELAY
LCALLSEL8
LCALLDELAY
LCALLSEL9
LCALLDELAY
LCALLSEL10
LCALLDELAY
RET
SEL0:
MOVA,#7EH;SEL1到SEL10是送字型子程序,SEL0是送0子程序
MOVP0,A
LCALLDELAY
RET
SEL1:
MOVA,#0CH;(SEL1是送1子程序)
MOVP0,A
LCALLDELAY
RET
SEL2:
MOVA,#0B6H
MOVP0,A(SEL2是送2子程序)
LCALLDELAY
RET
SEL3:
MOVA,#9EH(SEL3是送3子程序)
MOVP0,A
LCALLDELAY
RET
SEL4:
MOVA,#0CCH(SEL4是送4子程序)
MOVP0,A
LCALLDELAY
RET
(SEL5是送5子程序)
SEL5:
MOVA,#0DAH
MOVP0,A
LCALLDELAY
RET
(SEL6是送6子程序)
SEL6:
MOVA,#0FAH
MOVP0,A
LCALLDELAY
RET
(SEL7是送7子程序)
SEL7:
MOVA,#0EH
MOVP0,A
LCALLDELAY
RET
(SEL8是送8子程序)
SEL8:
MOVA,#0FEH
MOVP0,A
LCALLDELAY
RET
(SEL9是送9子程序)
SEL9:
MOVA,#0DEH
MOVP0,A
LCALLDELAY
RET
(SEL10是送小数点子程序,即使小数点亮)
SEL10:
MOVA,#01H
MOVP0,A
LCALLDELAY
RET
DELAY:
MOVR6,#9fH(延时子程序)
CXW3:
MOVR7,#9fH
CXW4:
DJNZR7,CXW4
DJNZR6,CXW3
RET
(4)一首歌的程序
编程思路:
歌曲是由音调和节拍有机组合而成。
音调是由发音的频率决定的,七种不同频率的方波来产生七种音调,我们用定时器1来控制方波的频率。
节拍就是音调持续的时间,节拍用节拍(延时)程序控制。
BUZZEREQUP2.3;伪指令,不编译
org0000h;主程序起始地址
ajmpbeep;跳至主程序
org000bh;定时器1中断地址
jmptim0;跳至timer0中断子程序
BEEP:
LCALLSEL81;打开三态门
MOVP1;#0FFH(P1口设置为输入输出口)
MOVA,P1;(采样K1键的状态)
LCALLSEL71;关三态门
SJMPCXW1
RET
CXW1:
RRCA;(K1的状态送到累加器的进位位)
JNCCXW2;(K1闭合,跳到点亮LED并放歌的子程序)
SJMPBEEP;(如果K1没闭合,继续扫描键盘)
RET
CXW2:
DT1:
CLRP2.5;(选位子程序,选择第一位LED)
CLRP2.6
setbP2.7
LCALLcc1;(调用LED显示的子程序)
movtmod,#01h;设timer0在MODE1
movie,#82h;打开定时器1中断
start0:
CLRP2.5;(选择第一位LED)
CLRP2.6
setbP2.7
LCALLcc1;(调用LED显示的子程序)
mov30h,#00h
next:
mova,30h
movdptr,#table;(DPTR指向歌曲的简谱码表的首地址)
movca,@a+dptr取简谱码
movr2,a;取到的简谱码暂存于R2
jzend0;判断是否取到00(结束码)?
anla,#0fh;不是结束码,则取低4位(节拍码)
movr5,a;将节拍码存入R5
mova,r2;将取到的简谱码再载入A
swapa;高低四位交换,也就是节拍码和音调码交换位置
anla,#0fh;取低四位(音符码)
jnzsing;取到的音符码是否为零?
clrtr0;音调码是0,则不发音
jmpd1
sing:
deca;取到的音符码减1(不含0).
mov22h,a;存入(22H).
rla;乘2
movdptr,#table1;到音调的频率表table1取相对应的定时器定时初值
movca,@a+dptr
movth0,a;给定时器的TH0赋定时处值
mov21h,a;
mova,22h;再载入取的的音符码
rla;乘2
inca;加1
movca,@a+dptr;
movtl0,a;给定时器的TL0赋定时初值
mov20h,a;取到的高位字节存入(20H)
setbtr0;启动timer0
d1:
calldelay;基本单位时间1/4拍187毫秒
inc30h;取简谱码指针加1
jmpnext;取下一个码
end0:
clrtr0;停止timer0
jmpstart0;重复循环
lJMPBEEP
RET
SEL71:
CLRP2.7;关三态门子程序
SETBP2.6
SETBP2.5
RET
SEL81:
SETBP2.7;开三态门子程序
SETBP2.6
SETBP2.5
RET
tim0:
;;time0中断服务子程序用来产生方波(音调)的负半波。
pushacc;中断现场保护
pushpsw
movtl0,20h;重设定时初值
movth0,21h
cplBUZZER;P2.3反相
poppsw;至堆栈取回psw的值
popacc;至堆栈取回a的值
reti;返回主程序
delay:
movr7,#02h;187毫秒
d2:
movr4,#187
d3:
movr3,#248
CXW:
djnzr3,CXW
djnzr4,d3
djnzr7,d2
djnzr5,delay;延时时间,受节拍码得控制,延时时间也就是音调持续的时间
ret
cc1:
LCALLSEL0;(使LED显示从0到9)
LCALLdelay1
LCALLSEL1
LCALLdelay1
LCALLSEL2
LCALLdelay1
LCALLSEL3
LCALLdelay1
LCALLSEL4
LCALLdelay1
LCALLSEL5
LCALLdelay1
LCALLSEL6
LCALLdelay1
LCALLSEL7
LCALLdelay1
LCALLSEL8
LCALLdelay1
LCALLSEL9
LCALLdelay1
LCALLSEL10
LCALLdelay1
ret
delay1:
MOVR6,#0ffH;(LED显示0到9时的延时子程序)
CXW3:
MOVR7,#0ffH
CXW4:
DJNZR7,CXW4
DJNZR6,CXW3
RET
RET
;SEL0到SEL10是送字型子程序,请参考LED自检的程序,此处不再重述)
SEL0:
MOVA,#7fH
MOVP0,A
LCALLdelay1
RET
SEL1:
MOVA,#60H
MOVP0,A
LCALLdelay1
RET
SEL2:
MOVA,#0B6H
MOVP0,A
LCALLdelay1
RET
SEL3:
MOVA,#0f2H
MOVP0,A
LCALLdelay1
RET
SEL4:
MOVA,#0e8H
MOVP0,A
LCALLdelay1
RET
SEL5:
MOVA,#0dAH
MOVP0,A
LCALLdelay1
RET
SEL6:
MOVA,#0dFH
MOVP0,A
LCALLdelay1
RET
SEL7:
MOVA,#70H
MOVP0,A
LCALLdelay1
RET
SEL8:
MOVA,#0ffH
MOVP0,A
LCALLdelay1
RET
SEL9:
MOVA,#0fbH
MOVP0,A
LCALLdelay1
RET
SEL10:
MOVA,#01H
MOVP0,A
LCALLdelay1
RET
table1:
DW64580,64684,64777,64820;(table1是各方波(音调)对应的周期表)
DW64898,64968,65030,64260
DW64400,64524,65058,63835,64021
;(table:
是简谱码表,也就是歌曲的曲谱表,每个码的高四位是音调,低四位是节拍)
table:
DB88h,14h,24h,36H,42H,34H,14H,28H,14H,94H
DB1fH,88H,14H,24H,34H,32H,42H,54H,14H
DB46H,32H,54H,22H,32H,32H,22H,2CH,38H,54H,74H
DB76H,62H,68H,54H,52H,62H,74H,62H,52H,3fH
DB46H,42H,54H,64H,54H,42H,32H,28H,0a4H,0a2H
DB92H,84H,94H,1fH,0b8H,68H,46H,52H,68H
DB74H,72H,72H,74H,62H,52H,3fH,0b8H,68H
DB46H,52H,68H,64H,62H,62H,64H,42H,32H,2fH
DB58H,14H,24H,36H,42H,34H,12H,12H,26H,22H,24H,22H,12H
DB94H,9cH,0a8H,0a6H,92H,84H,64H,54H,22H,22H,46H,42H,44H,32H,22H,5fH
DB00
子程序:
七个子程序,采样子程序,打开三态门子程序,关闭三态门子程序,定时器中断程序,LED显示子程序,LED显示延时子程序,音调延时(节拍)子程序。
六、设计体会
要求每个人根据自己的不同情况分别写出本人的设计体会,不得少于300字。
顺序装订
我们组的任务是便一首歌,我们对这个程序是这样理解的。
歌曲就是音调和节拍的有机组成。
音调就是DAO,LAI,MI,FA,SAO,LA,XI,节拍就是音调的持续时间。
我们所用的单片机只能输出方波,方波的频率不同,所以就产生了七种音调。
我们小组用定时器一来定时方波的频率,用延时程序来控制音调的持续时间。
做完基本任务后,又添加了键盘和LED的程序。
编程序时要结合硬件,如果不匹配,那将无法下手编。
经过这几天的实训,我对单片机有了理性的认识。
总而言之就是编程之前要了解硬件的接线,否则就是瞎编。
印象最深的是做LED自检时,一开始送字型送的是教材上的字型编码,显示出来后乱七八糟的,于是我又重新找七段LED管和字型码的第0位,第一位,第二位直到第七位的对应关系,依次输入00000001,000000010,直到10000000,找到对应关系后重新编字型码,使得LED显示从0到9。
三个人一组,古代的人说三个臭皮匠赛过一个诸葛亮,可我却觉得不一定是那样,因为三个人的编程思路有时候非常不统一。
每个人都试图说服对方,但这一般是说服不了的。
幸亏刘老师要求先做程序流程图,然后照图施工,然后调试解决失真。
两周的时间太短了,我觉得应该加长单片机实习的时间。
单片机是很实用的,如果学好学精通,找工作就不用费心了。
还有就是我觉得实习应该按这样的流程进行:
先熟悉各种指令,然后熟悉硬件的环境,最后布置任务。
另外我建议实验室下午可以开放,学生可以来也可以不来,我想来的人虽然不多,但是肯定有学生会来。
因为在寝室虽然可以编程,但却不能用硬件来验证程序是否可行。
刘老师要求是非常严格的,要求外行人能通过流程图就能了解编程思想,是按公司企业验收项目的“交钥匙工程”标准来要求学生的,虽然很累,但是我觉得很充实。
七、参考资料
1、《单片机系统综合设计与实践》教材主编:
裴岩刘利民内蒙古大学出版社。
2、《单片机应用及原理》教材主编:
李建忠西安电子科技大学出版社
3、《单片机原理及应用(MCS-51)教材主编:
蒋廷彪刘电霆高富强方华
重庆大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 首歌曲