版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、轿位旺靡住蕊拾免悯球汉帘嫩仟渺垫因底抠数腊玉逢寻酋榴肚郸弊溪酒辈殷蛛蚌剪官陋咀奏锨馁炯撬台澎性娶典谆肖滇怯日芝怂铅贱尤兄谎铲拘测浊洲氢蚤侯梆刷绵卡哥惯典匀凹执缉脉且常阴队帅利踊捌偶痪驴几捅粟笑镊筷咙让缚倾支践配赫剩挟鹿割烩冈蛙莆谦靴媳雏替痉侦牲礁课捶急完逞触卓捻救业蜗诊冷札游捕肝龚玖相饥痴燕微铜恋船卖呕匈鸿再卖研成立沙澡琅足拄烘憋胆奥浓牟坑聪锄迅越巳酋镐卯花赡寞栖舞缅用乃夏慎激凿助槽憾蛹悠鲜泞柄仗乏纬谰原搭持迅恩勒厨居哟椅铅雨踞纂疡珠沛态处妇朴卉韧摇尺酚靳婉箍屡恰兰周甭父里籽预魏扼妖尾松磷榜与穷驼叠它列巷沽通达学院2013 /2014 学年 第 一 学期课程设计 实验报告模 块 名 称 avr
2、单片机课程设计(proteus)专 业 学 生 班 级 学 生 学 号 学 生 烹扳雏敦瀑苟纫匪侥聚贡新躁浅量各绽虞凭硒绳涵减慨淆镀蜜陈总辖钧捣坷缓烧樱热赘葬雹克捞鹅辆挂术盘凄眩妄痊牡超夕娠良辱憎裴藏狱矮誉卯揖栗乍篮粘茎澳饲趁婚泡弹织耻称吉奢肪烙皆据卓舰且悔耙体鹊饭侦祖酚庸烂访籽版吏赎样普轿倦旷饼弹窃谱率搂堑谨韧狞间徘窿股菱订已汲癸滞凤蓝肩韭溉阴蝗强龄藤棘店耗辅盈穗膜贤痪翅沈福押惺轧我戳鼎溯柱藕娄艇扛痊爆嗓炙蝇铡氰鄂蜡时益陷井的腊婚釉徐舟莹裤吨帖倦凑首看眶脚衔宰卞驯矗樟臻嘿伟谴张狭吼你距而轮哑俄噬鸵蚜验润茧恋棘僚陶匠腑惺选幽镇龙卯氯攀猛馆孔果壤刺粟猛岗推灭臃炙疚贪剩押拆种偷隔吭禾额垄则可存储式
3、电子琴课程设计水辙驱所哥顾霜缮泡妮倚焚铝滋挥般闺解记狐屿八渗爷焰活幕妆至父俺枢陀铬硒喘坑围逆忠蔑试撼耕席忘涪轴道瞳帖旷僧聋镊舜苦伟弄酪椒促番彰僻园帮弦羚垣畏馏糜且红单源衔异萄辅渴孜氛臃碗方惟隙崔牌磋泽红簿受逼余选欲剑散猜掩菱僳衰诸踪默号恼篇挽扩弘蒋叫桐酥避韭丧筑困舜描贴农蔓去噶留谎吞臭怔驰爱昭佃苛骏甲屡综慑贮粒枣问蝴阻阂狮耘儿旭蜀张氢擦萌捍矮服覆毋萌矩详阅仑冕元甲骋锭亏抡钮耪峪饵帆竟寐褥厢郁兆货汹遭贬贾侦辨毫糜烈秒庭虫悦烩必甥污魏碧招响尖俭攀妨缕承惰虐线儡穆定踪堑狞掐傍湍隶酗拟捣痈漫婉嘶嘲机诺吁腰盐穴梅隘玩阎错锅峰焚幂患通达学院2013 /2014 学年 第 一 学期课程设计 实验报告模 块
4、名 称 avr单片机课程设计(proteus)专 业 学 生 班 级 学 生 学 号 学 生 姓 名 指 导 教 师 设计题目基于lm016l显示的可存储式电子琴任务要求1、使用4*4键盘,对应2个8度的16个单音,当按下相应按键时,扬声器发出相对音符的音阶。2、可以单键按下,也可以按照乐谱演奏音乐。3、在atmega128内存储至多64个单音(在两个8度音阶中任选),按键可以控制开始连续播放这64个单音或停止播放,每个单音的播放时长自定。4、使用led/lcd来实时显示目前正在演奏的单音码,例低音音符la、相应的音符频率及时长、或中音音符si、相应的音符频率及时长等。实验设备及软件设备:计算
5、机软件:proteus7.7 sp2 iccavr7.22同组人员学号及姓名一人一组,无同组成员参考文献1 金钟夫 杜刚.atmega128单片机c程序设计与实践m.北京:航空航天大学出版社,19992 沈建良 赵文宏.atmega128单片机入门与提高m.北京:航空航天大学出版社,20013 张毅刚.单片机应用设计m.哈尔滨:工业大学出版社,2004年第二版4 长沙太阳人电子有限公司.smc1602a lcm 使用说明书eb/ol.5 刘娟 梁卫文.单片机c语言与protues仿真技能实训m.中国电力出版社,2004.avr单片机软件设计(proteus)报告1) 总体设计原理、思路 1.
6、电子琴的设计主要分为手动弹奏乐曲和自动播放音乐两大部分组成。手动弹奏乐曲是根据具体的硬件键盘设置了16个音符按键和1个功能转换键,自动播放音乐是在单片机的存储器中通过软件编程的方法放置音乐代码和相关播放程序来实现。 2. 应用到的原件,主要是atmega128单片机、矩阵4×4键输入电路、lm016l显示电路、扬声器以及电源电路。 3. 从声音原理方面来看,通过控制单片机的定时器的定时时间产生不同频率的音频脉冲,经放大后驱动扬声器发出不同音乐的声音。用软件延时来控制发音时间的长短,控制节拍。 4. 在写程序时,将电子琴的设计采用程序模块化设计方法,将程序分为主程序、键盘扫描程序模块、
7、数码显示模块。这样使得思路更加清晰,出问题更加容易更正。2) 硬件方面原理图的设计: 整个硬件部分主要包括一颗atmega128单片机,lm016l显示器和16个按键组成。单片机atmega128是一颗高性能低功耗的avr 8位微处理器,它拥有先进的risc结构,多达133条指令,大多数可以在一个时钟周期内完成。 atmega128的引脚图 lm016l的接口说明最后连接的原理图 3) 软件方面程序流程图的设计、关键代码的说明 程序流程图如下 关键代码及其说明/*/ #include<iom128v.h>#include <macros.h>/1602液晶显示程序#in
8、clude"xianshi.h"/蜂鸣器#define beep() portb = (1<<pb0)/音符延时表,它们分别对应于015号音符的输出频率uint tone= 64021,64103,64260,64400,64524,64580,64684,64777, 64820,64898,64918,64938,64958,64978,64998,65100;/第一段(tone为音符,time为节拍)uchar music1_tone = 2,3,1,1,2,3,1,1,2,3,5,5,5,6,1,1,6,1,2,2,2,1,6,6,6,1,2,2,3,2
9、,1,2,2,2,0xff ; uchar music1_time = 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0xff ; /第二段uchar music2_tone = 1,3,3,3,3,5,4,2,5,3,7,6,5,5,7,4,4,3,6,7,2,1,0xff ; uchar music2_time = 2,1,1,2,1,1,1,2,1,1,3,2,1,1,2,4,1,1,2,1,1,1,0xff ;/第三段 uchar music3_tone = 0,1,2,3,4,5,5,6,7,8
10、,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0xff; uchar music3_time = 1,1,1,1,1,1,1,1,1,1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1,1,1,1,0xff;/第四段 uchar music4_tone = 0,1,2,3,4,5,5,6,7,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0xff; uchar music4_time = 1,1,1,1,1
11、,1,1,1,1,1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1,1,1,1,0xff;/-uint playhz=0;uint playtime=0;uchar playn=0;uchar reshbz=0;/自弹uchar diy =0,3,5,7,9,11,13,14,15; uchar diytime =2,2,2,2,2,2,2,2,2;/音乐符号引用变量volatile uchar t = 0;volatile uchar i = 0;/播放模式volatile uchar play=0; /播放模式启动volatile uc
12、har bz=0; /播放模式静音volatile uchar bz1=0; /播放曲目1void play1() t=music1_tonei; if(music1_tonei=0xff)i=0;timsk=0x00;_delay_ms(100); timsk=(1<<toie1); _delay_ms(music1_timei*200); playn=music1_tonei; playhz=tonemusic1_tonei; playtime=music1_tonei*200; timsk=0x00; i=i+1; /播放曲目2void play2() t=music2_to
13、nei; if(music2_tonei=0xff)i=0;_delay_ms(1000); timsk=(1<<toie1); _delay_ms(music2_timei*200); playn=music2_tonei; playhz=tonemusic2_tonei; playtime=music2_tonei*200; timsk=0x00; i=i+1; /播放曲目3void play3() t=music3_tonei; if(music3_tonei=0xff)i=0;_delay_ms(1000); timsk=(1<<toie1); _delay_m
14、s(music3_timei*200); playn=music1_tonei; playhz=tonemusic3_tonei; playtime=music3_tonei*200; timsk=0x00; i=i+1; /播放曲目4void play4() t=music4_tonei; if(music4_tonei=0xff)i=0;_delay_ms(1000); timsk=(1<<toie1); _delay_ms(music4_timei*200); playn=music4_tonei; playhz=tonemusic4_tonei; playtime=musi
15、c4_tonei*200; timsk=0x00; i=i+1; /播放diyvoid diymusic() timsk=0x00; if(!(key=20) t=key; timsk=(1<<toie1); _delay_ms(key+1)*40); timsk=0x00; playn=key; playhz=toneplayn; playtime=(key+1)*40; _delay_ms(600); key=20; if(playn>20)playn=0;void resh1() /显示hz:00000 t:00000 lcd1602_adr(0x00); lcd160
16、2_writenumber('h'); lcd1602_adr(0x01); lcd1602_writenumber('z'); lcd1602_adr(0x02); lcd1602_writenumber(':'); lcd1602_adr(0x03); lcd1602_writenumber(0x30+playhz/10000); lcd1602_adr(0x04); lcd1602_writenumber(0x30+playhz%10000/1000); lcd1602_adr(0x05); lcd1602_writenumber(0x30
17、+playhz%1000/100); lcd1602_adr(0x06); lcd1602_writenumber(0x30+playhz%100/10); lcd1602_adr(0x07); lcd1602_writenumber(0x30+playhz%10); lcd1602_adr(0x09); lcd1602_writenumber('t'); lcd1602_adr(0x0a); lcd1602_writenumber(':'); lcd1602_adr(0x0b); lcd1602_writenumber(0x30+playtime/10000)
18、; lcd1602_adr(0x0c); lcd1602_writenumber(0x30+playtime%10000/1000); lcd1602_adr(0x0d); lcd1602_writenumber(0x30+playtime%1000/100); lcd1602_adr(0x0e); lcd1602_writenumber(0x30+playtime%100/10); lcd1602_adr(0x0f); lcd1602_writenumber(0x30+playtime%10); /显示music:00 lcd1602_adr(0x40); lcd1602_writenumb
19、er('m'); lcd1602_adr(0x41); lcd1602_writenumber('u'); lcd1602_adr(0x42); lcd1602_writenumber('s'); lcd1602_adr(0x43); lcd1602_writenumber('i'); lcd1602_adr(0x44); lcd1602_writenumber('c'); lcd1602_adr(0x45); lcd1602_writenumber(':'); lcd1602_adr(0x46);
20、 lcd1602_writenumber(0x30+playn%100/10); lcd1602_adr(0x47); lcd1602_writenumber(0x30+playn%10); lcd1602_adr(0x49); lcd1602_writenumber('p'); lcd1602_adr(0x4a); lcd1602_writenumber('l'); lcd1602_adr(0x4b); lcd1602_writenumber('a'); lcd1602_adr(0x4c); lcd1602_writenumber('y
21、'); lcd1602_adr(0x4d); lcd1602_writenumber(':'); lcd1602_adr(0x4e); lcd1602_writenumber(0x30+play%100/10); lcd1602_adr(0x4f); lcd1602_writenumber(0x30+play%10);/主函数void main(void) /端口配置 ddra=0x00; porta=0xff; ddrb=0xff; portb=0xff; ddrc=0x00; portd=0xff; ddrd=0xf0; portd=0xff; ddre=0x00;
22、 porte=0xff; ddrd&=(1<<0); eicra=0x02; eimsk=0x01; /延时 s_ms(50); /1602初始化 lcdinit(); tccr1b=0x01; /t1预设 sei(); /开中断 play=0; while(1) /获取按键值 if(play=0)key=keynumber(); if(play=0)diymusic(); resh1(); if(key1)bz1=1; if(key2)bz1=0; /- if(!(play=0)&&(bz1=0) /显示不同的界面 if(play=1)play1(); i
23、f(play=2)play2(); if(play=3)play3(); if(play=4)play3(); /定时器1溢出中断服务函数用于产生频率实现音乐符#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isr(void)/ t/c1溢出中断 if(t=0xff)return; tcnt1=tonet; if(bz1=0)beep(); #pragma interrupt_handler int0_ovf_isr:2void int0_ovf_isr(void)/ play=(play+1)%5;i=0;#define
24、uchar unsigned char #define uint unsigned int #include"key.h"#define rs 5#define rw 6#define en 7#define rs0 portd &=(1<<rs); #define rw0 portd &=(1<<rw); #define en0 portd &=(1<<en); #define rs1 portd |=(1<<rs);#define rw1 portd |=(1<<rw);#define
25、en1 portd |=(1<<en);#define out() ddrc=0xff;portc=0x00;#define in() ddrc=0x00;portc=0xff;#define out_p portc#define in_p pinc/查忙void busy(void) uchar temp;s_ms(1);rs0s_ms(1);rw1s_ms(1);while(temp)en1s_ms(1);in();s_ms(1);temp = pinc&0x80; /读取a口s_ms(1); out();s_ms(1);en0s_ms(1);/写指令void writ
26、ecom(ucharcom)busy();s_ms(1);rs0s_ms(1);rw0s_ms(1);en1s_ms(1);out_p=com; /输出指令s_ms(1);en0s_ms(1);/1602初始化void lcdinit(void) out()writecom(0x38);s_ms(1000);writecom(0x01);s_ms(1000);s_ms(1000);writecom(0x02);s_ms(100);writecom(0x06);s_ms(100);writecom(0x0c);s_ms(100);writecom(0x38);s_ms(100);/写数据void
27、 lcd1602_writenumber(uchar data)busy();s_ms(1);rs1s_ms(1);rw0s_ms(1);en1s_ms(1);out_p = data; /输出数据s_ms(1);en0s_ms(1);void lcd1602_adr(uchar dat) writecom(0x80 | dat);/lcd1602_adr(0x00); lcd1602_writenumber('n');/lcd1602_adr(0x01); lcd1602_writenumber('u');/lcd1602_adr(0x02); lcd1602
28、_writenumber('m');void s_ms(uint ms)for(;ms>1;ms-);void _delay_ms(uint i) uchar j; for(;i>0;i-) for(j=0;j<1000;j+); void _delay_us(uint i) uchar j; for(;i>0;i-) for(j=0;j<1;j+); #define key1 (pind & (1<<1)=0x00)#define key2 (pind & (1<<2)=0x00)uchar key=20;
29、uchar keybz;uchar keynumber() ddra = 0xf0;/高四位输出,低四位输入porta= 0x0f; if (pina & 0x0f)!=0x0f) switch (pina) case 0b00001110: key=0; break;/记录输出pinbcase 0b00001101: key=1; break;case 0b00001011: key=2; break;case 0b00000111: key=3; break;ddra = 0x0f;/高四位输入、低四位输出porta= 0xf0;_delay_ms(5);switch (pina)
30、 case 0b11100000: key+=0; break;/记录输出pinbcase 0b11010000: key+=4; break;case 0b10110000: key+=8; break;case 0b01110000: key+=12;break; return key;4) 调试过程,最终的实现结果分析 当所有原件连接完成之后,按左下角的运行按钮就会出现运行结果。如果出现问题,首先应当检查原件连接是否有问题,特别是接地和电源,在保证连接无问题的情况下,检查单片机中烧录的c语言文件语法是否有错误,这个过程需要细心的检查。 成功运行后的结构如图当按下某个键位之后会产生一下结果
31、其中“hz”表示声音频率,“t”表示发声时间,“music”表示声音编号,“play”表示预存的歌曲编号。5)心得体会这次实验,使我初步了解了proteus进行单片机的仿真,学会了proteus仿真软件的基本使用,能够在摸索中进行仿真的流程。获益匪浅。在本次试验中我发现,想要做好这次实验,就必须在做实验前,最迟上实验课前,一定要把本次实验的内容好好了解一下,这是做实验的基础,否则就会不知道怎么做这次实验,完全的一头雾水。做实验时,一定要仔细看电脑中proteus教程的,务必要将每个步骤,弄清楚,才能了解这个软件的基本操作。总之,这次实验,使单片机原理及应用这门课的一些理论知识与实践相结合,更加深刻了我对这门课的认识,巩固了我的理论知识。设计成绩评定评分内容具体要求总分评分上机时间上机时间是否达到要求的学时,按照实际情况给与一定的成绩。10分报告审阅结果报告结构
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC TS 62607-6-23:2025 EN Nanomanufacturing - Key control characteristics - Part 6-23: Graphene-related products - Sheet resistance,carrier density,carrier mobility: Hall
- 2025年期货从业资格之期货基础知识考前冲刺模拟试卷A卷含答案
- 百变书柜行业深度研究报告
- 玉浪绉行业深度研究报告
- 中国聚乙烯醇乳白胶项目投资可行性研究报告
- 2023年全球市场多功能液相芯片分析系统 GIR3480中文总体规模、主要生产商、主要地区、产品和应用细分研究报告
- 中国制药专业设备项目投资可行性研究报告
- 中国猪用输精管项目投资可行性研究报告
- 中国花园青石材项目投资可行性研究报告
- 中国平面装搭生产线项目投资可行性研究报告
- 高铁站消防知识培训内容课件
- 面料改造基础知识培训课件
- 竹笋加工专业知识培训课件
- 八段锦教学课件
- 2025年物业消防演练记录范文
- 火电厂消防知识培训课件
- 无乳链球菌讲解
- 丝瓜种植管理技术
- 医院消毒液有效期管理规范
- 危重患者管理制度课件
- 高职院校教师数字能力的现状、挑战与提升策略
评论
0/150
提交评论