北京邮电大学信息与通信工程学院
小学期AVR单片机实验报告
实验题目: 基于ATmega16L单片机的电子琴设计
学生姓名:学渣
班 级:2012XXXXXX
班内序号:XX
学 号:2012XXXXXX
日 期:2014年9月30日
同组同学:学渣
第1页
北京邮电大学信息与通信工程学院
目录:
一、实验介绍 ......................................3 1.1实验课题名称 .................................3 1.2实验平台 .....................................3 1.3实验课题关键字 ..............................3 1.4实验摘要 .....................................3 二、小组分工 ......................................3 三、基本题目训练——流水灯与数码管秒表计时器.......3 3.1实现功能......................................3 3.2程序代码分析..................................4 3.3实验结果图片...................................7 四、有关发声的基础知识 ............................7 五、电子琴的设计与测试..............................9 5.1设计过程 ......................................9 5.2实验所需元器件.................................9 5.3实验程序主要流程图.............................10 5.4实验原理及原理图...............................10 5.4.1实验原理....................................10 5.4.2原理图 .....................................11 5.5各个模块的设计与讲解............................11 5.6程序源代码及程序分析 ..........................14 5.7实验结果..................................... ..24 六、排错过程............................ .............26 七、心得体会..........................................29 八、参考文献..........................................32 九、意见与建议........................................33
第2页
北京邮电大学信息与通信工程学院
一、实验介绍:
1.1实验课题名称:基于ATmega16L单片机的电子琴设计 1.2实验平台:本实验所用平台为AVR Studio 4 1.3实验课题关键字:
ATmega16L型单片机 电子琴 键盘按键 LCD液晶显示屏
1.4实验摘要:
本实验设计的电子琴拥有可视化操作界面,能实现即时弹奏音乐、音乐播放、音乐变速、音乐变调,并可以进行任意长度录音(通过按键记录音阶)等功能
二、小组分工:
? XXX负责电路硬件的连接和报告的撰写 ? XXX负责程序代码的编写 ? XXX负责资料的收集整理和查阅
三、基本题目训练——流水灯与数码管秒表计时器
3.1功能:八盏LED二极管按顺序依次循环点亮,实现流水灯的效
果,同时两只数码管分别代表秒和十分之一秒,进行秒表计时,配有
第3页
北京邮电大学信息与通信工程学院
两个按键,实现计时过程中的暂停和继续,同时在按下暂停键的时候蜂鸣器会响一声。利用ATmega16的寄存器中断功能,实现流水灯和数码管秒表计时器在实验板上同时工作,并且互相独立不影响。
3.2程序代码分析:
#include
#include
char b[10] = { 0b11111010,//0 0b00110000,//1 0b11011001,//2 0b01111001,//3 0b00110011,//4 0b01101011,//5 0b11101011,//6 0b00111000,//7 0b11111011,//8 0b01111011,//9 };
char a[10] = { 0b11111010,//0 0b00110000,//1 0b11011001,//2 0b01111001,//3 0b00110011,//4 0b01101011,//5 0b11101011,//6 0b00111000,//7 0b11111011,//8 0b01111011,//9 };
volatile char temp;
int main(void) {
DDRA = 0xff;
PORTA = 0b10000000;
DDRC = 0xff;
第4页
北京邮电大学信息与通信工程学院
DDRD = 0b11111011; DDRB = 0b11111011;
TCNT0 = 55; PORTB = b[0]; PORTD = a[0]; PORTC |= (1 << 0); TCCR0 |= (1 << CS01);
int count1 = 0,count2 = 0,i;
MCUCR |= (1 << ISC00)|(1 << ISC01);//INT0上升沿触发 GICR |= (1 << INT0);//使能INT0,INT1 sei();//使能全局中断 while(1) { for(i = 0;i<9000;i++) { while(!(TIFR & (1< count1++; if(count1!=10) PORTD = a[count1]; else { count2++; count1 = 0; if (count2 == 10) count2 = 0; temp = PORTA; PORTA = PORTA >> 1; if(temp & 0b00000001) { PORTA = PORTA | 0b10000000; } PORTB = b[count2]; PORTD = a[0]; } } } SIGNAL(SIG_INTERRUPT0)//INT0中断服务程序 { int count3 = 0,count4=0; 第5页