1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 51单片机两只老虎 c语言 基于51单片机做音乐盒(两只老虎)

51单片机两只老虎 c语言 基于51单片机做音乐盒(两只老虎)

时间:2019-01-11 09:15:27

相关推荐

51单片机两只老虎 c语言 基于51单片机做音乐盒(两只老虎)

/*********************************************************************************

项目:音频音乐盒

设计时间:.4.10

硬件描述:

软件描述:

* 【实验平台】: QX-MCS51 单片机开发板

* 【外部晶振】: 11.0592mhz

* 【主控芯片】: STC89C52

* 【编译环境】: Keil μVisio3

* 【程序功能】: 实验板唱歌实验(歌曲:两只老虎)

* 【使用说明】:

**********************************************************************************/

#include

#define uchar unsigned char

bit flag; //标志音乐输出脚电平的高低

uchar ptr = 0x00; //取音符

uchar high; //计数器高位

uchar low; //计数器低位

// 本曲谱为 "两只老虎",前两个十六进制表示发声频率,后一个表示发声时间,0x7F,0xFF 表示休止符

// 0x00 表示结束

// 1 _ 1_ 1 .5

uchar code music[] = {

0xFC,0x44,0x7F, 0xFC,0xAC,0x7F, 0xFD,0x09,0x7F, 0xFC,0x44,0xFF,

// 1 _ 2 3_15

0xFC,0x44,0x7F, 0xFC,0xAC,0x7F, 0xFD,0x09,0x7F, 0xFC,0x44,0xFF,

// 1_ 2 3_1

0xFD,0x09,0x7F, 0xFD,0x34,0x7F, 0xFD,0x82,0xFF,

// 3_ 4 5

0xFD,0x09,0x7F, 0xFD,0x34,0x7F, 0xFD,0x82,0xFF,

// 3_ 4 5

0xFD,0x82,0x7F, 0xFD,0xCB,0x7F, 0xFD,0x82,0x7F, 0xFD,0x34,0x7F,0xFD,0x09,0X7F,0XFC,0X44,0XFF,

// 5_ 6 5_4 3 1

0xFD,0x82,0x7F, 0xFD,0xCB,0x7F, 0xFD,0x82,0x7F, 0xFD,0x34,0x7F,0xFD,0x09,0X7F,0XFC,0X44,0XFF,

// 5_ 6 5_4 3 1

0xFC,0xAC, 0X7F,0xFC,0x44,0X7F, 0xFC,0xAC,0X7F,0xFA,0x44,0xFF,

// 2 51 0

0xFC,0xAC,0X7F, 0xFC,0x44,0X7F, 0xFC,0xAC,0X7F, 0xFA,0x44,0xFF,

// 2 51 0

0x00//结束

};

void Init(void); //初始化函数

void DelayMs(unsigned int time); //毫秒级延时函数

void main()

{

uchar time;

Init();

TH0 = high;

TL0 = low;

while (1)

{

if (music[ptr] != 0xFF && music[ptr] != 0x00)//判断是否是正常音符

{

TR0 = 0;

P2_3 = 1;

DelayMs(10); //间歇

TR0 = 1;

high = music[ptr]; //取设置频率数值的高8 位

low = music[ptr + 1]; //取设置频率数值的低8 位

time = music[ptr + 2]; //取发声时间

DelayMs(time);

ptr += 3;

}

else if (music[ptr] == 0xFF) //判断是否是休止符

{

time = music[ptr + 2];

DelayMs(time);

ptr += 3;

}

else //结束符,停止2 秒后继续

{

TR0 = 0;

P2_3 = 1;

DelayMs(2000);

ptr = 0;

}

}

}

/*********************************************************************************

* 名称:Count1(void) interrupt 1

* 功能:设置计时器0 溢出中断,每中断一次改变P2_3 引脚电平

*********************************************************************************/

void Count1(void) interrupt 1

{

TH0 = high;

TL0 = low;

if (flag == 0) //改变P2_3 引脚电平

{

P2_3 = 0;

flag = 1;

}

else

{

P2_3 = 1;

flag = 0;

}

}

/*********************************************************************************

* 名称:Init()

* 功能:设置计数器0 工作方式,16 位计数,溢出中断方式

**********************************************************************************/

void Init()

{

TMOD = 0x01; //定时器0 处于计时方式,16 位

EA = 1;

ET0 = 1; //定时器0 溢出中断

}

/*********************************************************************************

* 名称:DelayMs(unsigned int time)

* 功能:延时time * 1ms 时间

*********************************************************************************/

void DelayMs(unsigned int time)

{

unsigned int i;

unsigned int j;

for (j =0; j < time; j++) //每个循环 约 3ms

{

for (i =0; i < 363; i++)

{;}

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。