📄 main.c.110606142808
字号:
//开发环境:HJ-1G HJ-3G 开发板+AVR增强包套装
//芯片:ATMEGA16A
//编译器:ICCV7
//编写:慧净电子
//网址:WWW.HLMCU.COM QQ:121350852
//HJ-1G/3G开发板上的8个LED灯前后流动
//晶振:1M 12M
/*****************************************
* 慧净电子 *
* www.HLMCU.cn *
* 目 的:IO模拟音频 *
* 功 能:IO模拟音频 *
* 时钟频率:内部1M *
* 整 理:HLMCU *
* 修改日期:2008年08月8日 *
* 编译环境:ICC-AVR6.31 *
* 实验环境:HJ-2G 80AVR开发板 *
* 使用硬件:无源喇叭 杜邦线 *
* 结 果:音乐发声 *
* 操作要求:用杜邦线连接J7的第1脚和PD5端口上 *本程序只能发出 的 的 的声音。
*****************************************/
/*******************************************
文件:BEEP.C
环境:编译为ICC AVR6.31A,仿真为AVR Studio4.10
硬件:ATMEGA16芯片 外部晶振 12M
日期:2008年8月8日
功能:驱动开发板上的蜂鸣器
备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
/******************************************/
#include <iom16v.h> //包含型号头文件
#include <macros.h> //包含"位"操作头文件
#include <stdio.h> //标准输入输出头文件
#include <AVR_HJ-2G.h> //包含自定义常量头文件
#pragma interrupt_handler Timer1_Ov:10
/*-------------两只老虎-------------*/
const uchar MusicTable2[77]={13,2, 15,2, 17,2, 13,1, 0,1,
13,2, 15,2, 17,2, 13,1, 0,1,
17,2, 18,2, 20,2, 0,2,
17,2, 18,2, 20,2, 0,2,
20,1, 22,1, 20,1, 18,1, 17,2, 13,2,
20,1, 22,1, 20,1, 18,1, 17,2, 13,2,
15,2, 8,2, 13,2, 0,2,
15,2, 8,2, 13,2, 0,2,
0xff};
/*-----------------新年好------------------*/
const uchar MusicTable1[129]={ 13,1, 13,1, 13,2, 8,2,//音符,拍数,
17,1, 17,1, 17,2, 13,2,
13,1, 17,1, 20,2, 20,2,
18,1, 17,1, 15,2, 0,2,
15,1, 17,1, 18,2, 18,2,
17,1, 15,1, 17,2, 13,2,
13,1, 17,1, 15,2, 8,2,
12,1, 15,1, 13,2, 0,2,
13,1, 13,1, 13,2, 8,2,//音符,拍数,
17,1, 17,1, 17,2, 13,2,
13,1, 17,1, 20,2, 20,2,
18,1, 17,1, 15,2, 0,2,
15,1, 17,1, 18,2, 18,2,
17,1, 15,1, 17,2, 13,2,
13,1, 17,1, 15,2, 8,2,
12,1, 15,1, 13,2, 0,2,
0xff};
//0, 1, #1, 2, #2, 3, 4, #4, 5, #5, 6, #6, 7,
uint ToneTable[37]={ZERO,DO_L,DOA_L,RE_L,REA_L,MI_L,FA_L,FAA_L,SO_L,SOA_L,LA_L,LAA_L,TI_L,
DO ,DOA ,RE ,REA ,MI ,FA ,FAA ,SO ,SOA ,LA ,LAA ,TI ,
DO_H,DOA_H,RE_H,REA_H,MI_H,FA_H,FAA_H,SO_H,SOA_H,LA_H,LAA_H,TI_H};
uint tone;
/*******************************************
函数名称: Timer1_Ov
功 能: 定时器1溢出中断服务函数(完成单个音的产生)
参 数: 无
返回值 : 无
/********************************************/
void Timer1_Ov(void)
{
if(tone)//若不是休止符,则发声
{
TCNT1=tone; //计数值装入寄存器
PORTA^=BIT(BEEP);//蜂鸣器接口电平翻转
}
}
/*******************************************
函数名称: Timer1_init
功 能: Timer1的初始化
参 数: 无
返回值 : 无
/********************************************/
void Timer1_init(void)
{
TCCR1A=0x00; //普通端口操作
TCCR1B=0x02; //8分频
SREG|=0x80; //开放全局中断
}
/*******************************************
函数名称: Music
功 能: 完成整曲的音乐演奏
参 数: pmusic--曲谱数组指针
返回值 : 无
/********************************************/
void Music(const uchar *pMusic)
{
while(*pMusic!=0xFF) //0xFF为音乐结尾符
{
TIMSK=0x04; //Timer1溢出中断使能
tone=ToneTable[*pMusic]; //取音调频率
TCNT1=tone; //将频率值对应的计数值写入计时器,开始发声
pMusic++; //乐谱音符指针+1 ,取拍数
Delayms((*pMusic)*100); //按拍数延时
Delayms((*pMusic)*100);
TIMSK=0x00; //发声结束 ,屏蔽Timer1溢出中断
pMusic++; //乐谱音符指针+1 ,取下一音符
}
Delayms(1000); //曲谱结束,等待
}
/*******************************************
函数名称: main
功 能: 演奏指定的音乐
参 数: 无
返回值 : 无
/********************************************/
void main(void)
{
Board_init( ); //初始化开发板/
Timer1_init(); //Timer1初始化
while(1)
{
Music(MusicTable2); //循环演奏歌曲(改变参数MusicTable1可以变换歌曲)
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -