AI8051U擎天柱播放BEEP音乐,为什么还不响?是不是哪里没有使能?
AI8051U擎天柱播放BEEP音乐,为什么还不响?是不是哪里没有使能?#include "comm\AI8051U.h"
#include "stdio.h"
#include "intrins.h"
// 定义 GPIO_P5_0 宏
#define GPIO_P5 (*(volatile unsigned char *)0x00C8)
sbit GPIO_P5_0 = GPIO_P5^0;
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define MAIN_Fosc 24000000UL
#define Timer0_Reload (65536UL - (MAIN_Fosc / 1000))// Timer 0 中断频率, 1000次/秒
#define NOTE_C4262
#define NOTE_D4294
#define NOTE_E4330
#define NOTE_F4349
#define NOTE_G4392
#define NOTE_A4440
#define NOTE_B4494
#define NOTE_C5523
// 定义延时函数
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 123; j++); // 根据24MHz时钟调整
}
// 定义音符播放函数
void play_note(unsigned int frequency, unsigned int duration) {
unsigned int period = 24000000 / frequency; // 计算周期(us)
unsigned int half_period = period / 2; // 半周期(us)
unsigned int cycles = duration * 1000 / period; // 计算播放的周期数
unsigned int i;
for(i = 0; i < cycles; i++) {
GPIO_P5_0 = 1; // 高电平
delay_ms(half_period / 1000); // 延时半周期
GPIO_P5_0 = 0; // 低电平
delay_ms(half_period / 1000); // 延时半周期
}
delay_ms(50); // 音符间的间隔
}
// 生日快乐歌音符序列
u16 song[] = {
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, NOTE_E4,
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_G4, NOTE_F4,
NOTE_C4, NOTE_C4, NOTE_C5, NOTE_A4, NOTE_F4, NOTE_E4, NOTE_D4,
NOTE_A4, NOTE_A4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_F4
};
// 生日快乐歌音符时长(ms)
unsigned int song_duration[] = {
300, 300, 600, 600, 600, 900,
300, 300, 600, 600, 600, 900,
300, 300, 600, 600, 600, 600, 900,
300, 300, 600, 600, 600, 900
};
void main() {
unsigned int i;
while(1) {
for(i = 0; i < sizeof(song) / sizeof(song); i++) {
play_note(song, song_duration);
}
delay_ms(2000); // 歌曲播放完后停顿2秒
}
}
没配置IO,没开XFR,代码逻辑还有BUG
play_note(song, song_duration);
#include "AI8051U.h"
#include "stdio.h"
#include "intrins.h"
// 定义 GPIO_P5_0 宏
#define GPIO_P5 P5 //(*(volatile unsigned char *)0x00C8)
sbit GPIO_P5_0 = GPIO_P5^0;
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define MAIN_Fosc 24000000UL
#define Timer0_Reload (65536UL - (MAIN_Fosc / 1000))// Timer 0 中断频率, 1000次/秒
#define NOTE_C4262
#define NOTE_D4294
#define NOTE_E4330
#define NOTE_F4349
#define NOTE_G4392
#define NOTE_A4440
#define NOTE_B4494
#define NOTE_C5523
// 定义延时函数
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 123; j++); // 根据24MHz时钟调整
}
// 定义音符播放函数
void play_note(unsigned int frequency, unsigned int duration) {
unsigned int period = 24000000 / frequency; // 计算周期(us)
unsigned int half_period = period / 2; // 半周期(us)
unsigned int cycles = duration * 1000 / period; // 计算播放的周期数
unsigned int i;
for(i = 0; i < cycles; i++) {
GPIO_P5_0 = 1; // 高电平
delay_ms(half_period / 1000); // 延时半周期
GPIO_P5_0 = 0; // 低电平
delay_ms(half_period / 1000); // 延时半周期
}
delay_ms(50); // 音符间的间隔
}
// 生日快乐歌音符序列
u16 song[] = {
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, NOTE_E4,
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_G4, NOTE_F4,
NOTE_C4, NOTE_C4, NOTE_C5, NOTE_A4, NOTE_F4, NOTE_E4, NOTE_D4,
NOTE_A4, NOTE_A4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_F4
};
// 生日快乐歌音符时长(ms)
unsigned int song_duration[] = {
300, 300, 600, 600, 600, 900,
300, 300, 600, 600, 600, 900,
300, 300, 600, 600, 600, 600, 900,
300, 300, 600, 600, 600, 900
};
void main() {
unsigned int i;
P_SW2 |= 0x80;
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
while(1) {
for(i = 0; i < sizeof(song) / sizeof(song); i++) {
play_note(song,song_duration);
}
delay_ms(2000); // 歌曲播放完后停顿2秒
}
}
感谢回复
页:
[1]