版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE单片机课程设计报告PAGE3-单片机课程设计课程设计名称:电子琴专业班级:0914121学生姓名:胡中光学号:091412116指导教师:张磊课程设计时间:2015/1/5目录第1章概述3第2章课程设计任务及要求42.1设计任务42.2设计要求4第3章系统设计53.1设计方案53.2系统设计5系统流程图53.2.2系统原理图73.3文件程序代码7第4章心得体会30概述以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器.本文主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。本系统是简易电子琴的设计,按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放器对应的音符。第2章课程设计任务及要求2.1设计任务1、任务设计一简易电子琴,要求能够发出1,2,3,4,5,6,7等7个音符,具有一般演奏功能。2.2设计要求1)具有一般演奏功能,利用所给键盘的1,2,3,4,5,6,7,8八个键,能够发出8个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间再按别的键则发另一个音调的声音2)具有自动播放已存曲目功能3)显示当前正在播放的歌曲的名称和歌词4)显示北京时间第3章系统设计3.1设计方案该电路由时钟模块,液晶模块,键盘扫描模块组成。时钟模块:由时钟模块1307实现,能够正确显示北京时间,以及扩展显示星期等等。液晶模块:将时钟模块的信息正确的显示到液晶显示屏上,使用1602的液晶。键盘扫描模块:对十六个按键进行逐次扫描,扫描到前八个按键时,蜂鸣器依次发出1,2,3,4,5,6,7,8的音调声。其余按键,可以跳转到不同的曲目以及液晶模块显示,保留几个按键做以后的扩展用。3.2系统设计3.2.1系统流程图分析各项设计要求后,可绘制如下程序流程图3.2.2系统原理图文件程序代码(1).液晶模块头文件sbitLCD_RS =P3^6;sbitLCD_RW =P3^5;sbitLCD_EN=P3^3;sfrLCDData=0x80;voidLCDWrite(bitcd,unsignedcharinput);voidLCDWait(unsignedcharCiShu);voidLCDDelay();voidLCDInitialize();voidLCDPrintString(unsignedcharx,unsignedchary,unsignedchar*string);voidLCDPrintNumber(unsignedcharx,unsignedchary,unsignedcharbits,unsignedintnumber);unsignedcharReadState();voidLCDInitialize(){LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x08);LCDDelay();LCDWrite(0,0x01);LCDDelay();LCDWrite(0,0x06);LCDDelay();LCDWrite(0,0x0c);}voidLCDWrite(bitcd,unsignedcharDATA){LCDWait(20);LCD_RS=cd;LCD_RW=0;LCD_EN=0;LCDData=DATA;LCD_EN=1;LCD_EN=0;}voidLCDPrintString(unsignedcharx,unsignedchary,unsignedchar*string){unsignedcharaddress;address=x+(1-y)*0x40+0x80;LCDWrite(0,address);while(*string!='\0'){LCDWrite(1,*string);string++;}}voidLCDPrintNumber(unsignedcharx,unsignedchary,unsignedcharWeiShu,unsignedintnumber){unsignedcharaddress;unsignedcharj,temp[5];address=x+(1-y)*0x40+0x80;LCDWrite(0,address);//if(number>0){temp[0]=(number%100000)/10000+48;temp[1]=(number%10000)/1000+48;temp[2]=(number%1000)/100+48;temp[3]=(number%100)/10+48;temp[4]=number%10+48;for(j=5-WeiShu;j<5;j++){LCDWrite(1,temp[j]);}}}voidLCDWait(unsignedcharCiShu){unsignedchari;for(i=0;i<CiShu;i++){if(ReadState()&0x80)continue;elsebreak;}}unsignedcharReadState(){unsignedchartemp;P0=0xff;LCD_EN=0;LCD_RS=0;LCD_RW=1;LCD_EN=1;temp=LCDData;LCD_EN=0;returntemp;}voidLCDDelay(){unsignedinta;for(a=0;a<1000;a++);} (2).时钟芯片模块头文件voidiicdelay(unsignedinttimes);voidiicstart(){MDE=1;MDO=1;iicdelay(2);MCO=1;iicdelay(2);MDO=0;iicdelay(2);}voidiicstop(){MDE=1;MDO=0;iicdelay(2);MCO=1;iicdelay(2);MDO=1;}voidiicack(){MDE=1;MCO=0;MDO=0;iicdelay(2);MCO=1;iicdelay(2);MCO=0;iicdelay(1);MDO=1;}voidiicnack(){MDE=1;//MCO=0;MDO=1;iicdelay(2);MCO=1;iicdelay(2);MCO=0;}bitiicreadack(){bitack;MCO=0;iicdelay(2);MDE=1;MDO=1;MCO=1;iicdelay(2);MDE=0;ack=MDI;MCO=0;returnack;}voidiicwriteda(unsignedcharda){unsignedchari;MDE=1;for(i=0;i<8;i++){ MCO=0; iicdelay(0); if((da<<i)&0x80) MDO=1; else MDO=0; iicdelay(2); MCO=1; iicdelay(3);}MCO=0;}unsignedchariicreadda(){unsignedcharda;inti;da=0;MDE=1;MDO=1;MDE=0;for(i=0;i<8;i++){MCO=0; iicdelay(3); MCO=1; iicdelay(1); if(MDI==1) {da=da<<1;da++;} else da=da<<1; }MCO=0;returnda;}voidiicdelay(unsignedintt){unsignedinti,j; for(i=0;i<t;i++)for(j=5;j>0;j--);}voidReadTime(unsignedcharTIME[7]){bitEATemp;unsignedchartemp;EATemp=EA; iicstart();iicwriteda(0xd0);iicreadack();iicwriteda(0x00);iicreadack();iicstop();iicdelay(1);iicstart();iicwriteda(0xd1);iicreadack();TIME[0]=iicreadda();iicack();TIME[1]=iicreadda();iicack();TIME[2]=iicreadda();iicack();TIME[3]=iicreadda();iicack();TIME[4]=iicreadda();iicack();TIME[5]=iicreadda();iicack();TIME[6]=iicreadda();iicnack();iicstop();iicdelay(1);TIME[0]=((TIME[0]&0x7f)>>4)*10+(TIME[0]&0x0f);//secondTIME[1]=((TIME[1]&0x7f)>>4)*10+(TIME[1]&0x0f);//minuteif(TIME[2]&0x40){if(TIME[2]&0x20)temp=0x80;elsetemp=0x40;TIME[2]=((TIME[2]&0x1f)>>4)*10+(TIME[2]&0x0f);//hourTIME[2]|=temp;}else{TIME[2]=((TIME[2]&0x3f)>>4)*10+(TIME[2]&0x0f);}TIME[3]=TIME[3]&0x07;//weekTIME[4]=((TIME[4]&0x3f)>>4)*10+(TIME[4]&0x0f);//dateTIME[5]=((TIME[5]&0x1f)>>4)*10+(TIME[5]&0x0f);//monthTIME[6]=(TIME[6]>>4)*10+(TIME[6]&0x0f);//yearEA=EATemp;}voidSetTime(unsignedcharTIME[7]){bitEATemp;unsignedchartemp=0;unsignedcharTimeTemp[7];EATemp=EA;for(temp=0;temp<7;temp++)TimeTemp[temp]=TIME[temp];temp=0;TimeTemp[6]=((TimeTemp[6]/10)<<4)+(TimeTemp[6]%10);TimeTemp[5]=((TimeTemp[5]/10)<<4)+(TimeTemp[5]%10);TimeTemp[4]=((TimeTemp[4]/10)<<4)+(TimeTemp[4]%10);TimeTemp[3]=((TimeTemp[3]/10)<<4)+(TimeTemp[3]%10);if((TimeTemp[2]&0xc0)==0x00){TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%10);}else{if((TimeTemp[2]&0xc0)==0x01)temp=0x40;elsetemp=0x60;TimeTemp[2]&=0x3f;TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%10);TimeTemp[2]|=temp;}TimeTemp[1]=((TimeTemp[1]/10)<<4)+(TimeTemp[1]%10);TimeTemp[0]=((TimeTemp[0]/10)<<4)+(TimeTemp[0]%10);TimeTemp[0]&=0x7f;iicstart();iicwriteda(0xd0);iicreadack();iicwriteda(0x00);iicreadack();iicwriteda(TimeTemp[0]);iicreadack();iicwriteda(TimeTemp[1]);iicreadack();iicwriteda(TimeTemp[2]);iicreadack();iicwriteda(TimeTemp[3]);iicreadack();iicwriteda(TimeTemp[4]);iicreadack();iicwriteda(TimeTemp[5]);iicreadack();iicwriteda(TimeTemp[6]);iicreadack();iicstop();iicdelay(1);EA=EATemp;}voidSwitchRTC(unsignedcharSWITCH){unsignedchartemp;bitEATemp;EATemp=EA;iicstart();iicwriteda(0xd0);iicreadack();iicwriteda(0x00);iicreadack();iicstop();//iicdelay(1);iicstart();iicwriteda(0xd1);iicreadack();temp=iicreadda();iicnack();iicstop();//iicdelay(1);if(SWITCH)temp&=0x7f;elsetemp|=0x80;iicstart();iicwriteda(0xd0);iicreadack();iicwriteda(0x00);iicreadack();iicwriteda(temp);iicreadack();iicstop();//iicdelay(1);EA=EATemp;主体程序#include<aduc848.h>#include<INTRINS.H>#include<LCD1602.h>#include<rtc.h>sbitlie0=P2^3;sbitlie1=P2^2;sbitlie2=P2^1;sbitlie3=P2^0;sbitPWM1=P2^6;unsignedchartemp;unsignedcharkey;unsignedcharSTH0,STL0;unsignedcharjishi=0;unsignedcharn=0;//n为节拍常数变量unsignedchara[7]={00,59,19,3,4,8,10};unsignedcharb[7];voiddelay1s(void){unsignedchari,k;for(k=100;k>0;k--)for(i=100;i>0;i--);}/*定时器0中断*/voidTIMER0(void)interrupt1{TH0=STH0;TL0=STL0;PWM1=~PWM1;}/*定时器1中断*/voidint0()interrupt3//采用中断3控制节拍节拍延时{TH1=0xd8;TL1=0xef;n--;}/*定时器2中断*/voidint1()interrupt5//采用中断3控制节拍节拍延时{TH2=0xd8;TL2=0xef;n--;}voiddelay(unsignedcharm)//控制频率延时{unsignedi=3*m;while(--i);}voiddelayms(unsignedchara)//豪秒延时子程序{while(--a);//采用while(--a)不要采用while(a--);各位可编译一下看看汇编结果就知道了!}unsignedintcodetab[]={0xfc43,0xfd08,0,0,0xfd08,0xfd32,0,0,0xfd81,0xfdc7,0,0,0xfe05,0xfe21,0,0,};/*unsignedcharcodetable[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71,0xff}; */unsignedcharcodemusic_tab_1[]={/*1*/0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10,0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10,0x2b,0x60,/*2*/0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10,0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10,0x2b,0x60,//11767112377550x30,0x40,0x18,0x20,0x19,0x20,0x1c,0x20,0x19,0x10,0x18,0x10,0x18,0x20,0x2b,0x20,0x13,0x20,0x19,0x20,0x19,0x20,0x20,0x10,0x20,0x10,//632211170x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,0x18,0x40,0x18,0x20,0x19,0x20,//67112377550x1c,0x20,0x19,0x10,0x18,0x10,0x18,0x20,0x15,0x20,0x13,0x20,0x19,0x20,0x19,0x20,0x20,0x10,0x20,0x10,//6322110x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,0x18,0x60,//000000x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x60,key=15;break;} P0=tab[key];}}switch(key){case0,4,8,12,1,5,9,13,8,12,7,11,15:break;case2:{play_1:{a_1:p=music_tab_1[i];if(p==0x00){i=0,delayms(1000);gotoplay_1;}//如果碰到结束符,延时1秒,回到头再来一遍elseif(p==0xff){i=i+1;delayms(100),TR1=0;gotoa_1;}//若碰到休止符,延时100ms,继续取下一音符else{m=music_tab_1[i++],n=music_tab_1[i++];}//取频率常数和节拍常数TR1=1;//开定时器1while(n!=0)PWM1=~PWM1,delay(m);//等待节拍完成,通过P1口输出音频TR1=0;//关定时器1}break;} case6: { play_2:{a_2:p=music_tab_2[i];if(p==0x00){i=0,delayms(1000);gotoplay_2;}//如果碰到结束符,延时1秒,回到开始再来一遍elseif(p==0xff){i=i+1;delayms(100),TR2=0;gotoa_2;}//碰到休止符,延时100ms,取下一音符else{m=music_tab_2[i++],n=music_tab_2[i++];}//取频率常数和节拍常数T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 西点高级必知试题及详细答案
- 煤矿监控技能试题及详细答案
- 查找降水原理试题及对应答案
- 宜宾市2024年春期高中教育阶段学业质量监测物理答案
- 走进济宁环保试题与答案世界
- 安徽教师遴选历年试题及答案分享
- 2026编导试题详情与答案呈现
- 奥运场馆测试题和解答答案
- 会计文化小测验试题及答案
- 小雨语文课后试题及答案分享
- 九年级物理学情分析
- JBT 9986-2013 工具热处理金相检验
- 人教版六年级下册数学第一单元《负数》测试卷附参考答案(培优)
- 银行校招在线测评题库
- 工业设计史(全套课件142P)-课件
- GB/T 14034.4-2023液压传动连接金属管接头第4部分:60°锥形
- 专家型胫骨髓内钉及代概述
- 麻醉过程中的意外与并发症处理规范与流程
- YY/T 0322-2018高频电灼治疗仪
- 毫米的认识 说课稿
- 泡菜制作实验
评论
0/150
提交评论