avr单片机论坛CTC模式,脉冲计数的疑问

AVR单片机定时器CTC输出PWM模式_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
AVR单片机定时器CTC输出PWM模式
上传于||文档简介
&&A​V​R​单​片​机​定​时​器​计​数​器​ ​相​关​寄​存​器​ ​及​操​作​过​程​实​例
阅读已结束,如果下载本文需要使用
想免费下载本文?
你可能喜欢您现在位于:
云龙电子 →
AVR单片机学习开发板
(PQ-min型,带DVD同步实验教程-)
----------------------------------------------------------------------------------
为了感谢广大网友的一贯以来对本站的支持,使得更多的初学者能够拥有高性能的单片机实验板,学好单片机技术,本站将PQ-min型单片机学习
开发板标准配置在2月25-3月15公司活动日期间定为:220元
PQ-min型单片机学习开发系统主要特色:
1.实验板的主控芯片采用ATmega16单片机.
2.板载仿真下载器,可轻松搭建一个完整的单片机实验平台.用户可以方便的进行程序下载和各种硬仿真,给调试带来极大的方
& 便,也可以将配带的仿真器用于其他的目标板上.
3.配带DVD同步实验教程,为单片机初学者学习单片机知识变得更加轻松简单.-
&&注:随机光盘内包产品详细使用说明
,单片机学习教程,单片机多媒体教程,大量单片机实验例程,单片机开发常用工具软件,学习资料等。
&&&&本站最新的PQ-min型AVR单片机学习
板采用优质环氧树脂双面PCB板材,专业大厂生产。元件一律采用优质元器件,所有产品都经过严格测试,确保每一个产品的质量,同时提供7天包退,1个月包换,1年保修,终身技术支持的超值VIP售后服务。&&
&&&下面是PQ-min型AVR单片机学习板介绍
一.AVR单片机的优势:
二.PQ-min型 AVR单片机学习板基本配置及功能介绍
1、LED&&&&&&&&&&LED灯驱动程序,两种演示方式
2、SMG&&&&&&&&&&数码管驱动程序,循环滚动显示数字1-6
3、1602&&&&&&&&&1602液晶驱动程序,除正常显示ASCII码外,还教如何显示中文
4、12864&&&&&&&
12864液晶驱动程序,显示汉字和图形。液晶为带字库的& ST7920控制器的液晶。
5、SKEY&&&&&&&&
4个独立按键驱动程序,采用查询方式驱动
6、SKEY_INT&&&&&利用按键产生外部中断,教你中断程序的编写
7、MKEY&&&&&&&&&4x4矩阵按键驱动程序,教你如何扫描矩阵按键
8、TIMER0INT&&&&定时器0驱动程序,教你如何使用定时器
9、AD&&&&&&&&&&&Mega16自带的AD的驱动程序
10、DA&&&&&&&&&&SPI接口的8位DA驱动程序,利用Mega16的硬SPI接口
11、DS18B20&&&&&数字温度传感器驱动程序,教你如何显示小数
IIC )&&IIC接口数字电位器驱动程序,利用Mega16的硬件IIC接口
13、BEEP&&&&&&&&蜂鸣器唱歌程序,教你如何唱出好听的歌曲
14、PWM&&&&&&&&&Mega16的定时器1驱动程序,实现PWM输出功能
15、RELAY&&&&&&&继电器驱动程序,利用Mega16的I/O口直接驱动继电器
16、UART&&&&&&&
Mega16的异步串口驱动程序,教你如何实现串口通信
17、RTC&&&&&&&&&时钟芯片驱动程序,可以显示和利用按键设定时间
18、EEPROM&&&&&Mega16的EEPROM驱动程序,读写内部EEPROM
19、PS2&&&&&&&&&标准PS2键盘驱动程序,教你如何读入扫描码并译成ASCII码
20、UC/OS-II&&&&移植好的操作系统,执行两个任务,编译后,占用Mega16的26%资源。
三.自带在线仿真下载功能
板载仿真下载器,可轻松搭建一个完整的单片机实验平台.用户可以方便的进行程序下载和各种硬仿真,给调试带来极大的方便,也可以将配带的仿真器用于其他的目标板上.
四.PQ-min型AVR单片机学习开发板导购
PQ-min型AVR单片机学习开发板标准配置
&1、AVR单片机学习开发板 1块
&2、ATMEGA 16 单片机芯片 1块
&3、USB电源线1条
&4、USB转RS232串口通信线1条&
(可以直接使用USB口下载和仿真调试,非常适用于笔记本电脑)
&5、1602液晶模块 1块
&6、产品配套DVD资料光盘(含同步视频实验教程)
套餐点评:
板载仿真下载器,可轻松搭建一个完整的单片机实验平台.用户可以方便的进行程序下载和各种硬仿真,给调试带来极大的方便,也可以将配带的仿真器用于其他的目标板上,因为仿真器的JTAG接口是标准口.采用节约型设计方针,
在降低成本的基础上,做到功能完整易用,性价比很高,是单片机开发的利具!
五.视频内容介绍:
六.部分图片展示
产品包装图片
流水灯实验
A/D模数转换试验
DS1302时钟显示实验
18B20温度测试实验
USB转串口线
六、包裹邮寄费用计算
&&&网站所有物品售价均为实价&,并没有包含邮费,下面列出了不同邮寄方式的所需费用,您可以根据需要选择不同的邮寄方式。
您的汇款总额=您订购物品货款+您选择邮寄方式所需的邮费
&一般3天内可以收到(送货范围城区,送货上门)。
&邮政EMS特快专递
&一般1~3天可以收到(送货范围全国各地,送货上门)
本站部分软件资料来源于网络,如有涉及版权问题,请及时联系删除。云龙电子版权所有
(技术支持)公考,家教,作文,写作,答案,中考,高考,语文,英语,培训,教师,律师,秘书,文秘,作业,辅导
&>&&>&北邮小学期AVR单片机电子琴实验报告
北邮小学期AVR单片机电子琴实验报告_14700字
小学期AVR单片机实验报告
实验题目: 基于ATmega16L单片机的电子琴设计
学生姓名:学渣
级:2012XXXXXX
班内序号:XX
号:2012XXXXXX
同组同学:学渣
一、实验介绍 ......................................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
一、实验介绍:
1.1实验课题名称:基于ATmega16L单片机的电子琴设计
1.2实验平台:本实验所用平台为AVR Studio 4
1.3实验课题关键字:
ATmega16L型单片机 电子琴 键盘按键 LCD液晶显示屏
1.4实验摘要:
本实验设计的电子琴拥有可视化操作界面,能实现即时弹奏音乐、音乐播放、音乐变速、音乐变调,并可以进行任意长度录音(通过按键记录音阶)等功能
二、小组分工:
? XXX负责电路硬件的连接和报告的撰写
? XXX负责程序代码的编写
? XXX负责资料的收集整理和查阅
三、基本题目训练——流水灯与数码管秒表计时器
3.1功能:八盏LED二极管按顺序依次循环点亮,实现流水灯的效果,同时两只数码管分别代表秒和十分之一秒,进行秒表计时,配有
两个按键,实现计时过程中的暂停和继续,同时在按下暂停键的时候蜂鸣器会响一声。利用ATmega16的寄存器中断功能,实现流水灯和数码管秒表计时器在实验板上同时工作,并且互相独立不影响。
3.2程序代码分析:
#includevr/io.h>
#include vr/interrupt.h>
char b[10]
char a[10]
int main(void)
PORTA = 0b;
DDRD = 0b; DDRB = 0b;
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();//使能全局中断
for(i = 0;i<9000;i++)
while(!(TIFR & (1<<TOV0)));
if(count1!=10)
PORTD = a[count1];
count1 = 0;
if (count2 == 10)
count2 = 0;
temp = PORTA;
PORTA = PORTA >> 1;
if(temp & 0b)
PORTA = PORTA | 0b;
PORTB = b[count2];
PORTD = a[0];
SIGNAL(SIG_INTERRUPT0)//INT0中断服务程序
int count3 = 0,count4=0;
while(!(PINB & (1<<2)))
if(count3 == 10)
count3 = 0;
temp = PORTA;
PORTA = PORTA >> 1;
if(temp & 0b)
PORTA = PORTA | 0b;
for(int i=0;i<9000;i++)
while(!(TIFR & (1<<TOV0)));
3.3实验结果:
四、有关发声的基础知识:
声波是振动产生的。频率即表示每秒钟振动的次数,采用CTC方式时AVR单片机通过特定的端口(PD4及PD5)输出一定频率的方波,TCCR1A设为比较匹配时OC1A/OC1B电平取反,TCCR1B的计数上限为
OC1A,根据公式OCnA=f/2N(1+OCRnA)计算出7个频率音阶所需的OCR1A,则只需将喇叭接在PD4或PD5,通过程序控制端口输出特定频率的方波波形(发声使用正弦波最好,方波效果稍次但影响不大),喇叭就会发出七种不同的声音,依照人听觉分辨7个音阶分为三组,分别为高中,低音阶频率,经计算可得,当OCR1A=(500000/musicmem[i]-1)时,{131,147,165,175,196,220,247}存放低音阶频率,{262,294,330,349,392,440,494}存放中音阶频率,{524,588,660,698,784,880,988}则存放高音阶频率,所以需要定义三个数组存放各音阶的频率值。除了音符频率以外还需要音长,所以定义1个2位数组表示一段音乐,第一个表示频率,第二个表示音长,播放时先访问频率数组,使喇叭发声,之后访问音长数组,确定喇叭发声时间。而有了音符频率数组,只要再得到任意一首歌的简谱,就可以将其转化为两个数组的形式,由音符对应的频率得出频率数组,然后再根据每个音符的音长,将其通过乐曲的节拍和音符的拍数计算出音符持续时间即可得出音长数字。
五、电子琴的设计过程:
5.1设计过程:
5.2 实验所需元器件:
ATmega16L型单片机,JTAG下载器,扬声器,4*4矩阵键盘,
液晶屏,LM386,实验盒(内装剪刀、镊子、导线等用品)等
5.3实验程序主要流程图:
5.4实验原理及原理图 :
5.4.1实验原理 :
以ATmega16单片机作为整个系统的控制中心,外加琴键控制模块、播放模块、显示模块,使制作的电子琴完成设想的功能。琴键控制模块为4*4矩阵键盘,可以通过按下不同的琴键弹奏出不同的音阶,每个音阶对应着不同的频率,一段音乐是由许多不同的音阶组成,这样我们就可以根据不同的频率组合得到我们想要的音乐,同时在录制模式下,还可以通过按不同的按键记录下不同的音阶,由此记录一段音乐。播放模块接收对应频率的方波,由此播放琴键弹奏的音阶以
及播放预先存放在单片机里的音乐。显示模块显示出当前所处的模式。
5.4.2 原理图:
5.5各模块的设计与详解:
? 中央处理器——ATmega16:
实验中,PB0~PB7全部设置为输出,分配给LCD液晶显示屏D0~D7管脚;PA0~PA7连接4*4矩阵键盘的八个引脚;PD4、PD6和PD7设置为输出状态,分别连接到LCD显示屏的RS、R/W和E端口上;PD5置为输出状态,接到扬声器的一个管脚,扬声器的另一管脚接地;VCC为电源,向LCD显示屏供电;GND为公共接地。
? 琴键控制模块——4*4矩阵键盘:
工作原理:按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。行线通过上拉电阻接到+5V 电源上。无按键按下时,行线处于高电平的状态,而当有按键按下时,行线电平由与此行线相连的列线的电平决定。
? 显示模块——LCD液晶显示屏:
引脚详解:
第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
? 播放模块——扬声器:
原先以为单片机本身的电源电压不足以驱动扬声器工作,所以设计了有LM386的功放模块,后来在实际操作的过程中测试发现,单片机本身的电源足以驱动扬声器播放音乐音调,因此舍弃了LM386功放模块的设置。
5.6程序源代码及程序分析:
#includevr/io.h>
#includevr/interrupt.h>
#pragma data:code
#define uchar unsigned char
#define uint unsigned int
const uchar table[]=
volatile uint num=0,count=0;
volatile uint Mode=0,list=2,pause=0,aim=0,sure=0,del=0;
volatile int state=0, S=1;
//定义全局变量,S为变速变量
const uint Mode_Data[16]={0,440,494,523,587,659,698,784,880,998,18,};//存放声音的频率
//音高对应定时器初始化数值(低la~高la+休止符),cpu频率1MHz,用8分频
const uchar tone[]={0x00,0x8E,0x7E,0x77,0x6A,0x5E,0x59,0x4F,0x47,0x3F,0x3B,0x35,0x2F,0x2C,0x27,0x23,0X19,0X15};
uint Ssong[10][2]={{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}};
//********************************************
void delay_us(int n)
//微妙级延时函数;
while(n--)
void delay_ms(int n)
//毫秒级延时函数;
int m=14500*n;
while(m--)
//**********************************************
/************************
屏幕显示函数
************************/
void write_com(uchar com)
PORTD&=~(1<<4);
//低电平指令模式。高电平数据;
PORTD&=~(1<<6);
//低电平写;
PORTD|=(1<<7);
//高电平使能
delay_ms(1);
PORTD&=~(1<<7);
void write_dat(uchar dat)
PORTD|=(1<<4);
PORTD&=~(1<<6);
PORTD|=(1<<7);
delay_ms(1);
PORTD&=~(1<<7);
/***********************************
音乐产生函数
* 功能:输出频率为x的方波*
* 范围:x:100-20000Hz,0:不发声
***********************************/
void sound (int i)
TIMSK|=(1<<2);
if(i&&i<17)
//按了音符键了,且在0到F键这16个发音键上,才发声
OCR1A=tone[i];
TCCR1A=0X50;
//控制寄存器,选择可翻转功能,产生方波;
TCCR1B=0X0a;
PORTD=(1<<5);
TCCR1A = 0x00;
//频率为0,休止符,不发声
TCCR1B=0X00;
/************************************
************************************/
void play(int n)
//参数为键盘上的数字;
write_com(0X80+0X40+n);
write_dat(16);
//弹奏音符;
delay_ms(1);
write_dat(20);
TCCR1A=0x00;
TCCR1B=0X00;
//中断,为下一个节拍做准备;
PORTD|=(1<<5);
//PD5作为输出管脚,接扬声器;
//___________________________________________
void INI_POTR(void)
PORTD=(1<<5);
PORTD&=~(1<<7);
//A口作为键盘输入口;
//_____________________________________
void INN_DEVICE(void)
MCUCR=0X00;
中断寄存器置零;
//____________________________________
//检测键盘是否被按下的函数
uint isKeyPress()
//初始设置端口均为输出
PORTA=0xf0;
//设置端口的初值为
DDRA=0xf0;
//将低四位设为输入
if(PINA == 0xf0)
//当没有按下时,PINA仍然为
//返回0,代表未按下
//当按下后,PINA不再是
//返回1,代表按下了
//键盘输入检测函数;
//_______________________________
int key_in(void)
//先全部设置为输出,再将后四位置为输入
PORTA = 0xf0;
//设置高低电平
DDRA = 0xf0;
uint i = 0,j = 16,Key = 17;
unsigned char temp1,temp2;
if(isKeyPress())
temp1 = PINA;
temp1 &= 0x0f;
//只关心低四位的情况
switch(temp1)
temp2 = PINA;
temp2 &= 0x0f;
if(temp1 != temp2)
return 17;
PORTA= 0x0f;
DDRA = 0x0f;
temp1 = PINA;
temp1 &= 0xf0;
switch(temp1)
temp2 = PINA;
temp2 &= 0xf0;
if(temp1 != temp2)
return 17;
Key = i*4 + j+1;//
/***************************** //去抖动
//只关心高四位的情况
音乐播放函数;
*****************************/
void m_sound(uint a)
int m=(62500/a)-1;
//发声原理
TCCR1A=0X50;
//控制寄存器,选择可翻转功能,产生方波;
TCCR1B=0X0a;
//**********************************播放函数;
void music_play(uint a[][2])
const char Mtable[]=
write_com(0X01);
for(int i=0;i<5;i++)
write_dat(Mtable[i]);
char tem=aim,T=1;
while((a[i][1]!=0)&&(tem==aim)&&state)
//A 返回 B 暂停 F 模式 C 上一曲你 D 播放
E 下一曲;
num=key_in();
switch(num)
// F STATE = 0弹奏
///上一首C
case 10: T=1;
//变速,1代表正常速度A
//慢速0 //快速9
while(a[i][0]&&pause)
num=key_in();
if(num==12)
if( S == 0.5)
m_sound(a[i][0]*S);
m_sound(a[i][0]);
delay_ms(a[i][1]-100);
else if(T==0)
delay_ms(a[i][1]+100);
delay_ms(a[i][1]);
TCCR1A=0x00;
TCCR1B=0X00;
//6 正常调
//下一个音符;
TCCR1A=0x00;
TCCR1B=0X00;
//中断,为下一个节拍做准备;
if(a[i][1]==0)
aim = (++aim) %
/***************** 录制音乐函数; *****************/ void record(void) {
write_com(0X01);
const uchar R_table[]=
write_dat(R_table[i]);
while(pause)
uint Skey = key_in();
if((Skey>0)&&(Skey<11))
int i=0;//count=0;
while(i0)&&(Skey<11))
play(Skey);
Ssong[i][0]=tone[Skey];
Ssong[i][1]=600;
delay_ms(20);
if(Skey==14)
//清屏;//开始录制
//先清零计数器
//录制完成,
按D键结束录制
//借助 PAUSE 来标记一下什么时候退出while
//***************************歌曲数据 uint music_data[][2]= {
{440,400},{440,400},{659,400},{659,400},{740,400},{740,400},{659,800}, {587,400},{587,400},{554,400},{554,400},{494,400},{494,400},{440,800}, {659,400},{659,400},{587,400},{587,400},{554,400},{554,400},{497,800}, {659,400},{659,400},{587,400},{587,400},{554,400},{554,400},{497,800}, {440,400},{440,400},{659,400},{659,400},{740,400},{740,400},{659,800}, {587,400},{587,400},{554,400},{554,400},{494,400},{494,400},{440,800}, {0,0}
uint music_1[][2]=
{{262,400},{294,400},{330,400},{262,400},{262,400},
//乐谱 {294,400},{330,400},{262,400},{330,400},{349,400}, {392,800},{330,400},{349,400},{392,800},{392,300}, {440,100},{392,300},{349,100},{262,400},{392,400}, {440,300},{392,100},{349,300},{330,100},{262,400}, {294,400},{196,400},{262,400},{294,800},{196,400}, {262,400},{294,800},{0,0}}; //music_1
int main(void) {
INI_POTR();
write_com(0X38);
//显示光标等;
write_com(0X01);
write_com(0X0f);
//打开光标;
write_com(0X06);
write_com(0X80+0X02);
for(int i=0;i<8;i++)
write_dat(table[i]);
write_com(0X80+0X11);
delay_ms(5);
num = key_in();
if(num==16)
//模式选择
if(state==1)
if(state==1)
(state==1)
switchaim()
music_play(music_data);
music_play(Ssong);
delay_ms(10);
else if(num==11)
//录制模式;
delay_ms(10);
write_com(0X01);
const uchar Ptable[]=
//弹奏模式
5.7实验结果:
实现了最初设想的功能,所设计的电子琴可以进行即兴弹奏、录制音乐、播放音乐以及音乐变速。测试图片如下:
接通电源后,显示屏以每次显示一个字符的形式显示出“HELLO WELCOM!”的欢迎文字,接着自动进入弹奏模式,并在LCD的第一行显示出“Playing Mode”的文字,用户每次按下按键都会在LCD的第二行的相应位置出现对应按键顺序的光标闪烁。在弹奏模式下,按下F键会进入播放模式,LCD显示出“Music Mode”字样,此时按下D键是播放/继续,按下B键是暂停,C键和E键分别代表上一首和下一首,9键则是将音乐速度调整为慢速,再次按下F键会回到弹奏模式。在弹奏模式下,按下A键会进入录制模式,此时LCD显示“Recording Mode”字样,可以使用1~0十个按键进行录音,想要听听录制好的音乐,可以切换到播放模式下进行欣赏。
六、排错过程:
? 基础题目训练阶段:
1. 硬件连接好之后,在进行编程的过程中发现端口不够用,因为PB3和PD3这两个能产生中断的端口必须空出来作为暂停和开
始按键的接口,于是我重新布线,将数码管显示小数点的右下角的引脚改接到PC0,同时在代码中将此端口设置为高电平输出,这样就解决了该问题。
2. 当我们简单地把流水灯和计时器代码合并在一起然后编译运行时,却发现流水灯在工作,计时器却停止了工作。经过仔细排查,发现简单地将代码合并会导致单片机陷入流水灯的工作循环,而没有进入计时器的工作进程。经过一番思考,我们将流水灯的代码加以修改写入计时器的工作循环中,解决了计时器不工作的问题。
3. 但是新问题又出现了,我们发现按下计时器的暂停按钮后,会导致流水灯也停止工作。经过小组的讨论,我们决定在中断程序函数里面加上流水灯工作的代码并加以修改使其能够在中断函数里面运行。经过多次调试,终于实现了计时器的计时、暂停、继续功能,并且流水灯能够一直工作不受计时器的暂停影响。
4. 在调整计时器计时精读的过程中,我们发现本实验中使用的ATmega16频率不是16MHz,也不是1MHz,为了尽可能的实现秒表计时,试验了很多的数字组合,最后达到了30秒误差1秒的精确度,当然还可以达到更高的精确度。
? 电子琴设计与实现阶段:
1. 在硬件连接的时候,没想到LCD液晶显示屏的每根管脚都需要
连接,导致在进行程序下载验证的时候,显示屏总是不能显示出应有的文字,后来参考了相关文档资料发现是V0这个管脚也必须接地才可以,解决了问题。
2. 在安插矩阵键盘的时候,费了很多功夫,首先,不知道哪根管脚是行线哪根管脚是列线,其次不知道所连接的端口的输出输入模式应该怎么设置,导致设计过程受阻,后来观看了视频并查阅相关资料解决了此问题。
3. 在初步完成电子琴的弹奏功能程序时,我们开始对单片机进行测试,发现在按下数次按钮后单片机就会卡死,我们仔细检查了弹奏功能的代码,经过多次排查,我们小组最终将键盘检测函数key_in()和弹奏函数play()两条语句的执行顺序交换,以达到比较好的逻辑顺序效果,提高了程序的稳定性,把多次按下按钮会导致单片机卡死的问题给基本解决了。
4. 播放音乐功能也是我们设想的一个重要功能。刚开始,按照我们的思路去实现该功能时,在测试时播放音乐是实现了,但是暂停和继续功能都没能够实现。我们小组对代码进行重新检查,检查出几个比较严重的逻辑错误。我们重新调整播放音乐函数的判断语句和循环结构,并加入一个pause变量来标志暂停状态,在按下暂停按钮时将pause标志为0,使程序退出播放循环。经过一番努力,我们顺利完成了暂停播放和继续播放的功能。
5. 录制音乐功能的实现是整个实验过程里面最为困难的一环。我
们预先设想的实现方法是每按下一个按键,将对应音阶的数字和节拍存入数组中,然后录制完成后自动播放录制的音乐。但是,我们实际测试时发现录制的音乐并没有能自动播放。经过小组讨论,我们决定将录制好的音乐在播放音乐模式里面播放,根据这个思路,我们将录制的音乐对应的数组用播放音乐函数进行播放,成功地实现了录制音乐并播放的功能。
七、心得体会:
为期9天的单片机小学期圆满结束,不得不说,我从中学到了很多知识,从一个对单片机一窍不通的小白,蜕变成了一个熟悉单片机各个端口的作用和使用方法、懂得如何编程实现相应功能的技术人员。
在这九天中,我们通过观看老师给的视频资料和文档,加上查阅的资料,独立完成了所布置的任务。由于有C++的基础,加上有硬件的端口以及相应设备的使用说明文档的帮助,因此在我看来,在AVR Studio上进行C语言的编程从逻辑上比C++更容易理解,所需要的只是在编程时将端口的配置和逻辑函数结合到一起,实现编写的函数对单片机端口以及内部中断的控制。
第一天刚接到流水灯和数码管秒表计时器的任务的时候,内心真的十分激动,心想:实现了这个不就实现了街边广告牌上滚动的文字了么!但是一看到ATmega16芯片时还是傻了眼,心想:这么多的管脚都该怎么用啊?“视频里有”,同学告诉我,于是我就开始认真地
研究起老师给的单片机教学视频和它的技术文档。由此发现,只需要将单片机的端口设置好,再套上一个循环结构,就可以实现流水灯的功能了。说做就做,于是最初的流水灯就实现了,可以一个一个依次循环点亮。那时真是好高兴!在做数码管的时候,由于不知道数码管的显示与管脚之间的关系,于是我先创建了一个数组,数组中的元素都是8位二进制数,其中只有一位是1,其余位都是0,如下:
然后我采用一个循环,将端口PORTX每次等于一个a[i],单步运行,找出了数码管的显示与管脚之间的对应关系。这样,之后的工作就轻松许多,只需要在该亮的位置将对应的PORTX端口置为1,就可以显示出自己想要的数字了。流水灯和数码管秒表计时器都分别完成了,最后只需将它们合在一起共同工作即可。不过这个过程也不是一帆风顺的,因为中断的概念我刚开始觉得很难理解,也不知道该将中断的有关函数放在代码的哪个位置,因此反复纠结反复研究视频和技术文档,持续了一段时间。后来我和同学决定将两份流水灯的程序,一份放在主程序main中,和秒表计时器的程序放在一起,即实现两者同时工作,且流水灯的闪烁间隔是一秒,另一份放在中断服务程序中SIGNAL()中,即实现按下按钮进入中断服务程序后,秒表计时器暂停
工作,而流水依旧在依次循环闪烁。由此实现了流水灯和秒表计时器的独立工作,互不影响。
完成了基础题目的训练任务,我信心满满,迎来了我的下一个任务——电子琴。刚开始选题的时候觉得电子琴蛮有趣的,可以弹奏可以录音可以播放,而且原理看起来也比较简单。但是其实不是这样的,拿到元器件的时候,我发现,LCD液晶显示屏有16个管脚!矩阵键盘有8个管脚!但是有了前面对付ATmega16芯片的经验,我沉住气,查阅了有关LCD液晶显示屏和矩阵键盘的技术文档,以及一些经验之作,初步定下了键盘接到A端口,LCD的8个数据口接到B端口,D端口用于LCD的读写控制使能端以及扬声器的输入端。至此,硬件的连接工作就完成了,根据硬件的连接,我们开始了程序的编写。键盘检测函数、播放函数、液晶显示函数,弹奏功能,录制功能,,,,一步一步,一个完整的系统渐渐完善。由于有硬件,因此我们编写的程序可以马上下载到板子里验证效果,并及时修改,大大方便了我们排错和系统优化。期间由于JTAG下载器和AVR Studio总是出现连接失败的情况,浪费了我们许多宝贵的时间,个人总结原因是驱动可能用了一段时间会失效,解决办法是重新启动计算机,并将WINAVR这个环境卸载后再次装上,并且是装到与上一次不同的盘中,同时编译AVR程序的时候先接上JTAG下载器,试验了许多次,这个方法很管用,之后就没有出现该问题了。最终,电子琴的功能基本完成,并且达标,能实现弹奏、播放、录制、变速等最初设想的功能,但是可能还有一些小BUG没有调出来,导致电子琴在运行的过程中有不稳定的现象,
也不能排除是板子的问题。
最终,单片机小学期圆满结束了!9天的时间,完全的自己动手实验,不仅增加了自己对单片机的理解,提高了自己的编程能力,而且在这个过程中,我觉得团队的合作至关重要,自己连接的电路或者自己编写的程序,在自己看来都是对的,但是旁观者清,队友能很容易地帮你找出其中的错误;在和队友的讨论中,我能了解对方的想法和思路,多种想法和思路的碰撞能让我收获更多新的东西;组内的分工能让每个人都尽到自己的责任,发挥自己所长。
总之,这次单片机小学期是一次难忘的过程,一次丰富知识、提升技能的历程,也激起了我对单片机的兴趣,我今后会多多研究单片机,争取更上一层楼!
八、参考文献:
1. AVR C库函数介绍.pdf
2. AVR C语言开发入门指导.pdf
3. AVR单片机原理及应用.pdf
4. AVR高速嵌入式单片机原理及应用(修订版).pdf
5. 深入浅出AVR单片机.pdf
6. 1602液晶说明.pdf
7. AVR系统板说明.doc
8. cn_mega16-16L.pdf
9. EN_TC1602.pdf
10.字符手册.pdf
11.百度百科《乐理》
12.AVR单片机软硬件设计视频教程-入门篇-第二讲-AVR硬件电路设
13.AVR单片机软硬件设计视频教程-入门篇-第三讲-AVR开发基础知
14.AVR单片机软硬件设计视频教程-入门篇-第四讲-C语言的流水灯
15.AVR单片机软硬件设计视频教程-入门篇-第五讲-按键与数码管的
16.AVR单片机软硬件设计视频教程-入门篇-第六讲-中断与定时器
九、意见与建议:
1. 建议老师能稍微讲解一下实验室AVR软件的用法(视频中讲的是
没有JTAG下载器的,与实验室不同,刚开始还以为是板子有问题);
2. 实验室的元器件老旧,个别元器件特别是单片机芯片有问题之后,
调BUG好久都不知道错在哪里,建议更新。
致 富宝 典 ZHI UB F AODI ANo 赚 钱 其 实 很 容 2 句 话 让 01一个 人, 如果 你不逼 自己一把 , 你 根本不知道 自己有 多优秀 。 2 赚 钱是 一 种 能力 , 钱 是一种 水 . 花 平, 能力可以练, 水平…
难忘小学生活活动一:抒写美好的情怀第一课时 难忘师恩(导学案)编者及授课老师:雷富学 授课时间:2013 年5月16日 类型:课内比教学优质课竞赛 ●学习目标1、 认真阅读《难忘的启蒙》《老师领进门》《新来的老师》《给老师的一封信》4篇文章,体会作者…
小学期AVR单片机实验报告 实验题目: 基于ATmega16L单片机的电子琴设计学生姓名:学渣班 级:2012XXXXXX班内序号:XX学 号:2012XXXXXX日 期:日同组同学:学渣 目录:一、实验介绍 ..........…
总结经验 展望未来 推动经济责任审计工作深入发展审计署经济责任审计司经济责任审计是伴随我国社会主义经济、政治体制改革和民主法治建设进程而产生和发展起来的一项有中国特色的审计制度。上世纪八十年代从黑龙江、吉林、安微等省的部分县市探索的厂长(经理)承包经…
新定义型专题第一部分 讲解部分(一)专题诠释所谓“新定义”型问题,主要是指在问题中定义了中学数学中没有学过的一些概念、新运算、新符号,要求学生读懂题意并结合已有知识、能力进行理解,根据新定义进行运算、推理、迁移的一种题型.“新定义”型问题成为近年来中…
本文由()首发,转载请保留网址和出处!
免费下载文档:

我要回帖

更多关于 avr单片机论坛 的文章

 

随机推荐