没配置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_C4 262
- #define NOTE_D4 294
- #define NOTE_E4 330
- #define NOTE_F4 349
- #define NOTE_G4 392
- #define NOTE_A4 440
- #define NOTE_B4 494
- #define NOTE_C5 523
-
- // 定义延时函数
- 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[0]); i++) {
- play_note(song[i],song_duration[i]);
- }
- delay_ms(2000); // 歌曲播放完后停顿2秒
- }
- }
复制代码
|