用M16单片机I/O口生成模拟音乐

发布者:心灵飞翔最新更新时间:2011-09-20 关键字:M16单片机  模拟音乐 手机看文章 扫描二维码
随时随地手机看文章

* 用M16单片机I/O口生成模拟音乐 *
* 功 能:用I/O口生成模拟音乐 *
* 时钟频率:内部1M *
* 设 计:tonghe *
* 修改日期:2007年04月13日 *
* 编译环境:ICC-AVR6.31 *
* 实验环境:本站M16学习板 *
* 发 声:无源蜂鸣器 *
* 结 果:试验通过 *
* 要 求:插上JP1、JP2、LED_EN短路块 *
*****************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
/****************************************
* 定义音乐数据二维数组{x,y} *
* x:对应音符音阶(频率),0表示休止符 *
* y:对应音符节拍,0表示音乐结束 *
* 此数据取自《ICC AVR应用实例》 *
****************************************/
//以下音乐数据为《卡秋莎》,位于程序区
flash uint music_data[][2]=
{
{440,600},{494,200},{523,600},{443,200},{523,400},{494,200},
{440,200},{494,400},{330,400},{494,600},{523,200},{578,600},
{494,200},{578,400},{523,200},{494,200},{440,800},{659,400},
{880,400},{784,400},{880,200},{784,200},{698,400},{659,200},
{578,200},{659,400},{440,400},{ 0,200},{698,400},{578,200},
{659,600},{523,200},{494,200},{330,200},{523,200},{494,200},
{440,800},{659,400},{880,400},{784,400},{880,200},{784,200},
{698,400},{659,200},{578,200},{659,400},{440,400},{ 0,200},
{698,400},{578,200},{659,600},{523,200},{494,200},{330,200},
{523,200},{494,200},{440,800},{ 0, 0}
};

#pragma data:data //设置回到数据存储器区
/************************************
* 延时函数:1M时钟时为MS *
************************************/
void delay_ms(uint i)
{
uchar a;
for(;i;i--)
{
for (a = 220; a; a--)
{
;
}
}
}
/************************************
* 端口初始化函数 *
************************************/
void port_init(void)
{
DDRD=0xff; //D口配置为输出,驱动蜂鸣器
DDRB=0xff; //B口配置为输出,驱动LED
PORTB=0xff; //LED初值为灭
}
/***********************************
* 音乐产生函数 *
* 功能:输出频率为x的方波,延时y MS*
* 范围:x:100-20000Hz,0:不发声 *
* y:0-65536 MS *
***********************************/
void sound(uchar i)
{
uint x;
x=music_data[i][0]; //取音乐的频率数据
if(x!=0)
{
x=500000/x; //1M时钟数据计算
OCR1A=x; //比较值赋值
TCCR1A = 0x40; //允许比较反转输出
}
else
{
TCCR1A = 0x00; //频率为0,休止符,不发声
}
}
/*******************************
* 主函数 *
*******************************/
void main(void)
{
uchar i=0;
port_init(); //端口初始化
TCCR1A = 0x40; //将T/C1配置为比较匹配,OC1A取反
TCCR1B = 0x09;
while(1)
{
while(music_data[i][1]!=0) //等待最后一个音符到来
{
sound(i); //输出音符
delay_ms(music_data[i][1]);//节拍延时
TCCR1A = 0x00; //奏完一个音符停止
PORTB^=1<<5; //音符节拍由LD5闪亮显示
PORTD|=1<<5;
i++; //准备一下个音符
}
delay_ms(1000);
i=0; //一遍结束,停1秒,从头开始
}
}

关键字:M16单片机  模拟音乐 引用地址:用M16单片机I/O口生成模拟音乐

上一篇:定时器T1中断实验
下一篇:存储器分类及周期

推荐阅读最新更新时间:2024-03-16 12:41

M16单片机I/O口生成模拟音乐
* 用M16单片机I/O口生成模拟音乐 * * 功 能:用I/O口生成模拟音乐 * * 时钟频率:内部1M * * 设 计:tonghe * * 修改日期:2007年04月13日 * * 编译环境:ICC-AVR6.31 * * 实验环境:本站M16学习板 * * 发 声:无源蜂鸣器 * * 结 果:试验通过 * * 要 求:插上JP1、JP2、LED_EN短路块 * *****************************************/ #include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved