⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c.110606142448

📁 很实用的单片机例程
💻 110606142448
字号:
//开发环境: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端口上 *本程序只能发出 的 的 的声音。
*****************************************/

#include <iom16v.h> 
#include <macros.h>

#define uchar unsigned char
#define uint unsigned int
 #define OE_138_ON PORTC |= (1<<PC7)     //使能74hc138
#define OE_138_OFF PORTC &= ~(1<<PC7) 
#define OE_573_ON PORTA |= (1<<PA4)     //使能74hc573
#define OE_573_OFF PORTA &= ~(1<<PA4) 
/****************************************
* 定义音乐数据二维数组{x,y} *
* x:对应音符音阶(频率),0表示休止符 *
* y:对应音符节拍,0表示音乐结束 *
****************************************/
//以下音乐数据为《卡秋莎》,位于程序区
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)
{
DDRC=0xff; //D口配置为输出,驱动蜂鸣器
DDRB=0xff; //B口配置为输出,驱动LED
PORTB=0xff; //LED初值为灭
DDRC  = 0x80;   //PC7 为输出
OE_138_OFF;
}

/***********************************
* 音乐产生函数 *
* 功能:输出频率为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闪亮显示
PORTC|=1<<3;
i++; //准备一下个音符
}
delay_ms(1000);
i=0; //一遍结束,停1秒,从头开始
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -