/************* 功能说明 **************
本例程基于AI8051U为主控芯片的实验箱进行编写测试.
使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
下载时, 选择时钟 24MHZ (用户可自行修改频率).
******************************************/
#include "AI8051U.h"
#include "stdio.h"
#include "intrins.h"
// 定义 GPIO_P5_0 宏
#define GPIO_P4 (*(volatile unsigned char *)0x00C0)
#define GPIO_P5 (*(volatile unsigned char *)0x00C8)
sbit GPIO_P4_1 = GPIO_P4^1;
sbit GPIO_P5_0 = GPIO_P5^0;
//#define GPIO_P5_0 P50
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
u8 code LED[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
#define MAIN_Fosc 24000000UL
#define Timer0_Reload (65536UL - (MAIN_Fosc / 1000)) // Timer 0 中断频率, 1000次/秒
// 定义延时函数
void delay_ms(unsigned int ms) {
unsigned int i;
do{
// i=MAIN_Fosc/96000L; //STC89/90_12T
// i=MAIN_Fosc/48000L; //STC89/90_6T
// i=MAIN_Fosc/14000; //STC11、STC12
// i=MAIN_Fosc/13000; //STC15 14T per loop
// i=MAIN_Fosc/10000; //STC8 10T per loop
i=MAIN_Fosc/6030; //STC32 6T per loop
while(--i);
}while(--ms);
}
// 生日快乐歌音符序列
u8 code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};
u8 code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0};
//控制音频、节拍函数
void PlayMusic()
{
u16 i=0,j,k;
u8 a=0;
while(SONG_LONG[ i]!=0||SONG_TONE[ i]!=0)
{
for(j=0;j<SONG_LONG[ i]*40;j++) //播放各个音符,SONG_LONG 为拍子长度
{
GPIO_P5_0=~GPIO_P5_0;
GPIO_P4_1=~GPIO_P4_1;
for(k=0;k<SONG_TONE[ i]*7;k++);//SONG_TONE 延时表决定了每个音符的频率
}
P2=LED[a];
a++;
if(a==8)
{a=0;}
delay_ms(10);
i++;
}
}
void main() {
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0xff; //设置为推挽输出
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P4M0 = 0x01; P4M1 = 0x00; // 设置P4.1为推挽输出
GPIO_P4_1 = 0;
P5M0 = 0x01; P5M1 = 0x00; // 设置P5.0为推挽输出
GPIO_P5_0 = 0;
P40 = 0; //LED Power On
while(1) {
PlayMusic(); //播放生日快乐
delay_ms(3000); // 歌曲播放完后停顿3秒
}
}
作者: 丙丁先生, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-3996156.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论