» 您尚未 登录   注册 | 搜索 | 社区服务 | 帮助 | 无图版 | 左右分栏


AVR与虚拟仪器论坛 AVRVi.com -> AVR单片机论坛(主坛) -> 俺也发一个用ICC做的“歌唱祖国”+“我的中国心”
 XML   RSS 2.0   WAP 

AVRVI的淘宝店 AVR单片机学习套餐 EasyAVR M128开发板 SK 国内最专业AVR开发工具商城

--> 本页主题: 俺也发一个用ICC做的“歌唱祖国”+“我的中国心” 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题
铜河



技术群用户 优秀斑竹奖

级别: 论坛版主
精华: 7
发帖: 491
威望: 726 点
金钱: 5771 VI
贡献值: 253 点
技术积分: 31 点
在线时间:118(小时)
注册时间:1970-01-01
最后登录:2008-08-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子

0 俺也发一个用ICC做的“歌唱祖国”+“我的中国心”

看到slyt发了一个用BASCOM做的“歌唱祖国”+“我的中国心”,晚上回家也动心了,马上找来简谱用ICCAVR也做了一个,在板上实验成功,不敢独享,现共享,供有兴趣的朋友参考:
本人所用板上的蜂鸣器接于PD5,如果有不同的,只需稍加改动即可。时钟频率:外部7.3728M
主程序如下:

#include <iom16v.h>
#include <macros.h>
#include "music_qp2.h"           //包含音乐文件
#include "delay.h"             //延时文件

#define uchar unsigned char
#define uint unsigned int

/************************************
*       端口初始化函数         *
************************************/
void port_init(void)
  {
  [color=red]PORTD=0x20;   //蜂鸣器接口初始化为高
  DDRD=0x20;   //蜂鸣器接口为输出:根据蜂鸣器所接端口不同而不同[/color]
  }

/**********************************
*定时器1中断入口函数:产生方波发声*
**********************************/
#pragma interrupt_handler timer1:iv_TIMER1_COMPA
void timer1(void)               //定时器1中断入口
  {
  [color=red]PORTD^=(1<<5);     //产生方波,发声:根据蜂鸣器所接端口不同而不同[/color]
  }
/***********************************
*       音乐产生函数       *
* 功能:输出频率为x的方波,延时y MS*
* 范围:x:100-20000Hz,0:不发声   *
*       y:0-65536 MS           *
***********************************/
void sound(uint i)
  {
  uint x;
  x=i;                   //取音乐的频率数据
  if(x!=0)
    {
    [color=red]x=3686400/x;   //数据计算:根据时钟频率不同而不同[/color]
    OCR1A=x;             //比较值赋值
    TCCR1B = 0x09;           //允许比较反转输出
    }
  else
    {
    TCCR1B = 0x00;           //频率为0,休止符,不发声
    }
  }

/***********************************
*       音乐播放函数       *
***********************************/
void music_play1(void)
  {
  uchar i=0;
  TCCR1B = 0x09;             //开启比较匹配
  while(music_data1[i][1]!=0)     //等待最后一个音符到来
    {
    sound(music_data1[i][0]);   //输出音符
    delay_ms(music_data1[i][1]);//节拍延时
    TCCR1B = 0x00;           //奏完一个音符停止
    [color=red]PORTD|=(1<<5);[/color]           //关闭蜂鸣,保护喇叭
    i++;                 //准备一下个音符
    delay_ms(5);           //演奏
    }
  TCCR1B = 0x00;
  [color=red]PORTD|=(1<<5); [/color]               //关闭蜂鸣,保护喇叭
  }

/***********************************
*       音乐播放函数       *
***********************************/
void music_play2(void)
  {
  uchar i=0;
  TCCR1B = 0x09;
  while(music_data2[i][1]!=0)     //等待最后一个音符到来
    {
    sound(music_data2[i][0]);   //输出音符
    delay_ms(music_data2[i][1]);//节拍延时
    TCCR1B = 0x00;           //奏完一个音符停止
    [color=red]PORTD|=(1<<5);[/color]           //关闭蜂鸣,保护喇叭
    i++;                 //准备一下个音符
    delay_ms(5);           //演奏
    }
  TCCR1B = 0x00;
  [color=red]PORTD|=(1<<5); [/color]               //关闭蜂鸣,保护喇叭
  }

/******************************
*       主函数         *
******************************/
void main(void)
  {
  port_init();
  TCCR1A = 0x40;             //将T/C1配置为CTC模式,OC1A取反:产生音乐
  TIMSK |= (1<<OCIE1A);         //开启比较匹配中断
  SEI();                     //开总中断
  while(1)
    {
    music_play1();           //演奏第一曲:歌唱祖国
    delay_ms(2000);
    music_play2();
    delay_ms(2000);           //演奏第二曲:我的中国心
    }
  }

本站原创AVR单片机新手入门教程!
[楼 主] | Posted: 05-04 20:22 顶端
铜河



技术群用户 优秀斑竹奖

级别: 论坛版主
精华: 7
发帖: 491
威望: 726 点
金钱: 5771 VI
贡献值: 253 点
技术积分: 31 点
在线时间:118(小时)
注册时间:1970-01-01
最后登录:2008-08-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



音乐数据文件:music_qp2.h
/****************************************
*       音乐数据文件           *
****************************************/
/****************************************
*   定义音乐数据二维数组{x,y}         *
* x:对应音符音阶(频率),0表示休止符   *
* y:对应音符节拍时长ms                 *
****************************************/
//以下音乐数据为《歌唱祖国》,位于程序区
flash unsigned int music_data1[][2]=
  {
  {392,100},{392,100},{392,600},{392,100},{392,100},{392,600},
  {392,100},{392,100},{392,200},{349,200},{330,200},{294,200},
  {262,400},
  {196,300},{392,100},{262,400},{196,400},{330,400},
  {262,400},{392,600},{440,200},{392,400},{392,300},{392,100},
  {523,400},{523,400},{440,300},{392,100},{349,200},{440,200},
  {392,1200},{392,300},{392,100},{440,400},{440,400},{294,400},
  {294,300},{294,100},{392,600},{349,200},{330,400},{196,300},
  {196,100},{392,400},{392,200},{440,200},{392,200},{349,200},
  {330,200},{294,200},{262,1200},{392,300},{392,100},{523,400},
  {523,400},{440,400},{440,300},{392,100},{349,600},{392,200},
  {440,400},{294,300},{294,100},{392,400},{392,200},{440,200},
  {392,200},{349,200},{330,200},{294,200},{262,1200},{ 0, 0}
  };

//以下音乐数据为《我的中国心》,位于程序区
flash unsigned int music_data2[][2]=
  {
  {220,600},{330,200},{294,200},{330,200},{262,200},{247,200},
  {220,1200},{ 0,400},{330,200},{440,400},{392,200},{330,200},
  {294,200},{262,200},{294,200},{330,1200},{330,200},{392,200},
  {440,600},{499,200},{440,200},{392,200},{330,200},{294,200},
  {262,200},{262,400},{294,200},{330,800},{294,600},{330,200},
  {247,200},{220,200},{196,400},{220,1200},{ 0,400},
 
  {220,600},{330,200},{294,200},{330,200},{262,200},{247,200},
  {220,1200},{ 0,400},{330,200},{440,400},{392,200},{330,200},
  {294,200},{262,200},{294,200},{330,1200},{330,200},{392,200},
  {440,600},{499,200},{440,200},{392,200},{330,200},{294,200},
  {262,200},{262,400},{294,200},{330,800},{294,600},{330,200},
  {499,200},{440,200},{392,400},{440,1200},{ 0,200},{330,200},
 
  {392,600},{330,200},{330,400},{ 0,200},{330,200},{523,600},
  {440,200},{440,600},{440,100},{523,100},{440,400},{392,400},
  {262,400},{294,200},{262,100},{294,100},{330,1200},{ 0,200},
  {330,200},{523,600},{440,200},{440,600},{440,200},{523,600},
  {587,200},{659,1200},{659,200},{587,200},{499,600},{392,200},
  {440,1200},{ 0,400},
 
  {220,600},{330,200},{294,200},{330,200},{262,200},{247,200},
  {220,1200},{ 0,400},{330,200},{440,400},{392,200},{330,200},
  {294,200},{262,200},{294,200},{330,1200},{330,200},{392,200},
  {440,600},{499,200},{440,200},{392,200},{330,200},{294,200},
  {262,200},{262,400},{294,200},{330,800},{294,600},{330,200},
  {499,200},{440,200},{392,400},{440,2400},{ 0, 0}
  };

#pragma data:data               //设置回到数据存储器区

学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[1 楼] | Posted: 05-04 20:23 顶端
slyt





级别: 圣骑士
精华: 3
发帖: 87
威望: 104 点
金钱: 1350 VI
贡献值: 0 点
技术积分: 9 点
在线时间:40(小时)
注册时间:2007-03-27
最后登录:2008-08-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



哈哈,支持!!!
本站原创AVR单片机新手入门教程!

http://avr.cnta.net
QQ : 634432569
QQ群: 17727270
[2 楼] | Posted: 05-04 20:26 顶端
铜河



技术群用户 优秀斑竹奖

级别: 论坛版主
精华: 7
发帖: 491
威望: 726 点
金钱: 5771 VI
贡献值: 253 点
技术积分: 31 点
在线时间:118(小时)
注册时间:1970-01-01
最后登录:2008-08-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



延时函数:
/****************************************
** 文 件 名: delay.c                   **
** 日   期: 2007年12月26日               **
** 描   述: 延时函数                   **
** 作   者:tonghe                       **
** 版     本: V1.0                       **
** 主控芯片:M16                       **
** 晶振频率:7.3728MHZ, 波特率9600       **
****************************************/
#include <iom16v.h>
#include <macros.h>

/****************************************
* 函数名称: void delay_us(uchar i)        *
* 函数功能:延时函数                    *
* 晶振频率:7.3728MHZ                    *
****************************************/
void delay_us(unsigned int i)
   {
   while(i--)
       {
       NOP();
       NOP();
       }
   }
   
/****************************************
* 函数名称: void delay_ms(uint i)        *
* 函数功能:延时函数                    *
* 晶振频率:7.3728MHZ                    *
* 入口参数:i mS                        *
****************************************/
void delay_ms(unsigned int i)
   {
   unsigned int a;
   for(;i;i--)
       {
       for(a=1052;a;a--)
           {;}
       }
   }

延时函数头文件:delay.h

/****************************************
* 函数名称: void delay_us(uint i)        *
* 函数功能:延时函数                    *
* 晶振频率:7.3728MHZ                    *
****************************************/
void delay_us(unsigned int i);

/****************************************
* 函数名称: void delay_ms(uint i)        *
* 函数功能:延时函数                    *
* 晶振频率:7.3728MHZ                    *
* 实际延时:i mS                        *
****************************************/
void delay_ms(unsigned int i);

本站原创AVR单片机新手入门教程!
[3 楼] | Posted: 05-04 20:26 顶端
raosibin



新人进步奖 特殊贡献奖

级别: 风云使者
精华: 4
发帖: 515
威望: 528 点
金钱: 2919 VI
贡献值: 1 点
技术积分: 12 点
在线时间:451(小时)
注册时间:2008-02-25
最后登录:2008-08-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



这好象不是用ICC做的吧?ICC中好象没有FLASH关键字啊
学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[4 楼] | Posted: 05-04 20:28 顶端
铜河



技术群用户 优秀斑竹奖

级别: 论坛版主
精华: 7
发帖: 491
威望: 726 点
金钱: 5771 VI
贡献值: 253 点
技术积分: 31 点
在线时间:118(小时)
注册时间:1970-01-01
最后登录:2008-08-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



QUOTE:
引用第4楼raosibin05-04 20:28发表的:
这好象不是用ICC做的吧?ICC中好象没有FLASH关键字啊

如假包换的ICCAVR6.31A,呵呵呵~~~~

学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[5 楼] | Posted: 05-04 20:33 顶端
raosibin



新人进步奖 特殊贡献奖

级别: 风云使者
精华: 4
发帖: 515
威望: 528 点
金钱: 2919 VI
贡献值: 1 点
技术积分: 12 点
在线时间:451(小时)
注册时间:2008-02-25
最后登录:2008-08-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



ICC中是用CONST吧,IAR,CCAVR中才用到FLASH,是不是你程序有什么其它的定义啊?

PS:先收起来,慢慢理解消化,顶你个肺

本站原创AVR单片机新手入门教程!
[6 楼] | Posted: 05-04 21:16 顶端
铜河



技术群用户 优秀斑竹奖

级别: 论坛版主
精华: 7
发帖: 491
威望: 726 点
金钱: 5771 VI
贡献值: 253 点
技术积分: 31 点
在线时间:118(小时)
注册时间:1970-01-01
最后登录:2008-08-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



ICC中也可以用FLASH关键字的。嘿嘿~~~~~
2008年网站第一个开源项目 Ethernet IO Kit,单片机上网,网络开发板,网络控制
[7 楼] | Posted: 05-05 09:51 顶端
raosibin



新人进步奖 特殊贡献奖

级别: 风云使者
精华: 4
发帖: 515
威望: 528 点
金钱: 2919 VI
贡献值: 1 点
技术积分: 12 点
在线时间:451(小时)
注册时间:2008-02-25
最后登录:2008-08-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



没有用过,不要卖关子了啊,是不是高版本支持?回去试试,我用的是6.31
学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[8 楼] | Posted: 05-05 10:33 顶端
铜河



技术群用户 优秀斑竹奖

级别: 论坛版主
精华: 7
发帖: 491
威望: 726 点
金钱: 5771 VI
贡献值: 253 点
技术积分: 31 点
在线时间:118(小时)
注册时间:1970-01-01
最后登录:2008-08-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



6.31A是肯定支持的,我用的就是。
2008年网站第一个开源项目 Ethernet IO Kit,单片机上网,网络开发板,网络控制
[9 楼] | Posted: 05-05 10:40 顶端
raosibin



新人进步奖 特殊贡献奖

级别: 风云使者
精华: 4
发帖: 515
威望: 528 点
金钱: 2919 VI
贡献值: 1 点
技术积分: 12 点
在线时间:451(小时)
注册时间:2008-02-25
最后登录:2008-08-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



呵呵,看了下头文件
#if defined(_AVR) && !defined(flash)
#define flash    const        /* IAR compatibility */
#endif

本站原创AVR单片机新手入门教程!
[10 楼] | Posted: 05-05 12:01 顶端
sunke9

技术群用户 特殊贡献奖 优秀斑竹奖 宣传大使奖 原创先锋奖
头衔:C语言学徒C语言学徒

级别: 论坛版主
精华: 12
发帖: 937
威望: 1182 点
金钱: 534 VI
贡献值: 438 点
技术积分: 36 点
在线时间:816(小时)
注册时间:2007-03-09
最后登录:2008-08-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



算你们狠!都这么会玩!给楼主加精
本站原创AVR单片机新手入门教程!

********************************

我的博客: 小可歌的学习空间        

********************************

[11 楼] | Posted: 05-05 13:57 顶端
hnsyzlh





级别: 新手上路
精华: 0
发帖: 7
威望: 8 点
金钱: 70 VI
贡献值: 0 点
技术积分: 0 点
在线时间:4(小时)
注册时间:2008-07-04
最后登录:2008-07-07
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



呵呵,支持原创,用力顶啊!
2008年网站第一个开源项目 Ethernet IO Kit,单片机上网,网络开发板,网络控制
[12 楼] | Posted: 07-07 11:45 顶端
zhaojun_xf



级别: 骑士
精华: 1
发帖: 49
威望: 52 点
金钱: 870 VI
贡献值: 0 点
技术积分: 3 点
在线时间:47(小时)
注册时间:2008-04-17
最后登录:2008-08-18
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



讲讲工作原理了
本站原创AVR单片机新手入门教程!
[13 楼] | Posted: 07-07 12:54 顶端
铜河



技术群用户 优秀斑竹奖

级别: 论坛版主
精华: 7
发帖: 491
威望: 726 点
金钱: 5771 VI
贡献值: 253 点
技术积分: 31 点
在线时间:118(小时)
注册时间:1970-01-01
最后登录:2008-08-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



QUOTE:
引用第13楼zhaojun_xf07-07 12:54发表的:
讲讲工作原理了

工作原理?挺简单:
音乐数据中,前一位是音阶频率,后一位是音阶时长(MS),按音阶顺序取出频率数据,计算成比较值赋给比较匹配寄存器,用于产生比较匹配取反操作,产生对应频率,同时按节拍延时。就完成了音乐的演奏。

学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[14 楼] | Posted: 07-07 14:58 顶端
chendy6868



级别: 侠客
精华: 0
发帖: 22
威望: 23 点
金钱: 220 VI
贡献值: 0 点
技术积分: 0 点
在线时间:4(小时)
注册时间:2007-07-21
最后登录:2008-08-08
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



下了,有时间了试试
2008年网站第一个开源项目 Ethernet IO Kit,单片机上网,网络开发板,网络控制
[15 楼] | Posted: 07-16 17:45 顶端
胡来一刀



特殊贡献奖

级别: 圣骑士
精华: 0
发帖: 72
威望: 73 点
金钱: 839 VI
贡献值: 0 点
技术积分: 0 点
在线时间:16(小时)
注册时间:2008-03-08
最后登录:2008-08-19
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



极度感兴趣啊!
学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[16 楼] | Posted: 07-16 23:40 顶端
胡来一刀



特殊贡献奖

级别: 圣骑士
精华: 0
发帖: 72
威望: 73 点
金钱: 839 VI
贡献值: 0 点
技术积分: 0 点
在线时间:16(小时)
注册时间:2008-03-08
最后登录:2008-08-19
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



有两个疑问请铜河版主解答:
1.[color=red]PORTD=0x20;   中[color=red]是干什么用的?
2.音乐数据哪里来的?怎么样对着简谱搞?应该有个对照表之类吧!

2008年网站第一个开源项目 Ethernet IO Kit,单片机上网,网络开发板,网络控制
[17 楼] | Posted: 07-17 00:00 顶端
dnfcus





级别: 新手上路
精华: 0
发帖: 8
威望: 9 点
金钱: 79 VI
贡献值: 0 点
技术积分: 0 点
在线时间:1(小时)
注册时间:2008-05-22
最后登录:2008-08-14
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



……怎么看起来有点像html语言的,莫非LZ想让给它括住的那句话边为红色?
本站原创AVR单片机新手入门教程!
[18 楼] | Posted: 07-21 19:16 顶端
dnfcus





级别: 新手上路
精华: 0
发帖: 8
威望: 9 点
金钱: 79 VI
贡献值: 0 点
技术积分: 0 点
在线时间:1(小时)
注册时间:2008-05-22
最后登录:2008-08-14
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子





2008年网站第一个开源项目 Ethernet IO Kit,单片机上网,网络开发板,网络控制
[19 楼] | Posted: 07-21 19:17 顶端
dnfcus





级别: 新手上路
精华: 0
发帖: 8
威望: 9 点
金钱: 79 VI
贡献值: 0 点
技术积分: 0 点
在线时间:1(小时)
注册时间:2008-05-22
最后登录:2008-08-14
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



x=3686400/x;   //数据计算:根据时钟频率不同而不同
不过这前面有分号会有效果么?

学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[20 楼] | Posted: 07-21 19:19 顶端
bh3nbx





级别: 新手上路
精华: 0
发帖: 2
威望: 3 点
金钱: 20 VI
贡献值: 0 点
技术积分: 0 点
在线时间:0(小时)
注册时间:2008-07-24
最后登录:2008-07-24
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



收藏下。有时间研究一下。
学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[21 楼] | Posted: 07-24 22:52 顶端
蓝色精灵



技术群用户

级别: 圣骑士
精华: 0
发帖: 61
威望: 72 点
金钱: 660 VI
贡献值: 1 点
技术积分: 0 点
在线时间:24(小时)
注册时间:1970-01-01
最后登录:2008-07-25
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



楼主,我想问一下,你的音乐数据是怎么得到的?
学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[22 楼] | Posted: 07-25 22:05 顶端
jacktau



级别: 精灵王
精华: 0
发帖: 121
威望: 122 点
金钱: 1310 VI
贡献值: 0 点
技术积分: 0 点
在线时间:33(小时)
注册时间:2007-10-20
最后登录:2008-08-19
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



这么好的贴,顶一下!
学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[23 楼] | Posted: 07-28 12:33 顶端
army





级别: 新手上路
精华: 0
发帖: 7
威望: 8 点
金钱: 90 VI
贡献值: 0 点
技术积分: 0 点
在线时间:12(小时)
注册时间:2008-07-22
最后登录:2008-08-10
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



好帖啊
2008年网站第一个开源项目 Ethernet IO Kit,单片机上网,网络开发板,网络控制
[24 楼] | Posted: 07-28 13:50 顶端

AVR与虚拟仪器论坛 AVRVi.com -> AVR单片机论坛(主坛)