ARM实验报告.

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int freq[]={0,523,578,659,698,784,880,988,1046,1174,1318,1397,1568,1760,1976};//1234567频率值
int music[]={5,5,6,5,1,7,5,5,6,5,2,1,5,5,3,2,1,7,6,4,4,3,1,2,1};//播放的音乐数组
三,程序流程图Fra Baidu bibliotek
四:主函数代码和相关注释.
/****************************************************************************
*文件名:main.c
*功能:使用定时器0实现1秒定时,控制蜂鸣器蜂鸣。(中断方式)
*说明:短接蜂鸣器跳线JP7。断开CF卡跳线JP13、GPIO接口J17。
Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz
*/
T0PR = 99;//设置定时器0分频为100分频,得110592Hz
T0MCR = 0x03;//匹配通道0匹配中断并复位T0TC
T0MR0 = 110592;//比较值(1S定时值)
T0TCR = 0x03;//启动并复位T0TC
T0IR = 0x01;//清除中断标志
VICVectAddr = 0x00;//通知VIC中断处理结束
}
/****************************************************************************
*名称:Time0Init()
*功能:初始化定时器0,定时时间为1S,并使能中断。
VICVectCntl0 = 0x24;//定时器0中断通道分配最高优先级(向量控制器0)
VICVectAddr0 = (uint32)IRQ_Time0;//设置中断服务程序地址向量
VICIntEnable = 0x00000010;//使能定时器0中断
};
n++;
if(n>1976) n=0;//频率值大于高音7时重新播放
*功能:定时器0中断服务程序,取反BEEPCON控制口。产生50%的占空比
*入口参数:无
*出口参数:无
****************************************************************************/
void __irq IRQ_Time0(void)
ARM实验报告
一,程序功能。
该程序可以实现简单的音乐播放,通过蜂鸣器发出不同的音乐,播放的音乐为music[]数组中的乐谱。每秒播放一个频率的音乐。播放完毕后重头开始播放。
二,播放的原理
在音乐中每个乐谱的频率值不一样,因此,我们可以改变驱动给蜂鸣器的频率值来使蜂鸣器发出不同的声音,下面是频率对应表:
void frequecy_time(int f)
{ T0MR0 =(int)(110592/f) ;//产生特定频率时给T0MR0的初值
}
/****************************************************************************
*名称:IRQ_Time0()
T0TCR = 0x01;
/*设置定时器0中断IRQ */
VICIntSelect = 0x00;//所有中断通道设置为IRQ中断
VICVectCntl0 = 0x24;//定时器0中断通道分配最高优先级(向量控制器0)
VICVectAddr0 = (uint32)IRQ_Time0;//设置中断服务程序地址向量
VICIntEnable = 0x00000010;//使能定时器0中断
}
/****************************************************************************
*名称:main()
*功能:初始化I/O及定时器,然后等待中断。
****************************************************************************/
*入口参数:无
*出口参数:无
****************************************************************************/
void Time0Init(void)
{ /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz
{
if( (IO0SET&BEEPCON) == 0 )
{
IO0SET = BEEPCON;//输出高电平
}
else
{
IO0CLR = BEEPCON;//输出低电平
}
if(n==freq[music[j]])//到达1秒后
{T0PR = 99;//设置定时器0分频为100分频,得110592Hz
T0MCR = 0x03;//匹配通道0匹配中断并复位T0TC
音乐
1
2
3
4
5
6
7
高1
高2
高3
高4
高5
高6
频率
523
578
659
698
784
880
988
1046
1175
1318
1397
1568
1760
在本程序中,我们采用的是方波驱动,故只需要在IO口产生高低电平就可以了,对于不同的乐器,其频率值都是一样的,只是驱动蜂鸣器的波形不一样,这里由于是简单的音乐播放程序,故我们直接使用占空比为50%的方波作为蜂鸣器的驱动波形,改变占空比可以模拟不同的乐器发音。
****************************************************************************/
#include "config.h"
#defineBEEPCON 1<<7// P0.7引脚控制B1,低电平蜂鸣
int n,j;//全局变量见后面的详细解释。
frequecy_time(freq[music[j]*2]);//播放下一个频率值
T0TCR = 0x03;//启动并复位T0TC
T0TCR = 0x01;
n=0;
j++;
if(j==25) j=0;//播放完毕后从新播放
/*设置定时器0中断IRQ */
VICIntSelect = 0x00;//所有中断通道设置为IRQ中断
相关文档
最新文档