51单片机之音乐代码

发布者:DreamyMoon最新更新时间:2018-07-12 来源: eefocus关键字:51单片机  音乐代码 手机看文章 扫描二维码
随时随地手机看文章

世上只有妈妈好音乐源代码。

#include

sbit   speaker = P3^7;
unsigned char timer0h, timer0l, time;
//--------------------------------------
//单片机晶振采用11.0592MHz
// 频率-半周期数据表 高八位     本软件共保存了四个八度的28个频率数据
code unsigned char FREQH[] = {
    0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8,    //低音1234567
    0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
    0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,            //高音 234567
    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF};   //超高音 1234567
// 频率-半周期数据表 低八位
code unsigned char FREQL[] = {
    0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,    //低音1234567
    0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
    0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,             //高音 234567
    0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16};   //超高音 1234567
//--------------------------------------
//世上只有妈妈好数据表           要想演奏不同的乐曲, 只需要修改这个数据表
code unsigned char sszymmh[] = {
6, 2, 3,  5, 2, 1,  3, 2, 2,  5, 2, 2,  1, 3, 2,  6, 2, 1,  5, 2, 1, 
//一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。
//6, 2, 3 分别代表:6, 中音, 3个半拍;
//5, 2, 1 分别代表:5, 中音, 1个半拍;
//3, 2, 2 分别代表:3, 中音, 2个半拍;
//5, 2, 2 分别代表:5, 中音, 2个半拍;
//1, 3, 2 分别代表:1, 高音, 2个半拍;
//
6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1,
6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4, 2, 2, 3, 3, 2, 1, 5, 2, 2,
5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4, 5, 2, 3, 3, 2, 1,
2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6, 0, 0, 0};
//--------------------------------------
void t0int() interrupt 1         //T0中断程序,控制发音的音调
{
    TR0 = 0;                     //先关闭T0
    speaker = !speaker;          //输出方波, 发音
    TH0 = timer0h;               //下次的中断时间, 这个时间, 控制音调高低
    TL0 = timer0l;
    TR0 = 1;                     //启动T0
}
//--------------------------------------
void delay(unsigned char t)     //延时程序,控制发音的时间长度
{
    unsigned char t1;
    unsigned long t2;
    for(t1 = 0; t1 < t; t1++)    //双重循环, 共延时t个半拍
      for(t2 = 0; t2 < 8000; t2++); //延时期间, 可进入T0中断去发音
    TR0 = 0;                        //关闭T0, 停止发音
}
//--------------------------------------
void song()                      //演奏一个音符
{
    TH0 = timer0h;               //控制音调
    TL0 = timer0l;
    TR0 = 1;                     //启动T0, 由T0输出方波去发音
    delay(time);                 //控制时间长度
}
//--------------------------------------
void main(void)
{
    unsigned char k, i;
    TMOD = 1;                    //置T0定时工作方式1
    ET0 = 1;                     //开T0中断
    EA = 1;                      //开CPU中断
    while(1) {
      i = 0;
      time = 1; 
      while(time) {
        k = sszymmh[i] + 7 * sszymmh[i + 1] - 1;
                      //第i个是音符, 第i+1个是第几个八度
        timer0h = FREQH[k];      //从数据表中读出频率数值
        timer0l = FREQL[k];      //实际上, 是定时的时间长度
        time = sszymmh[i + 2];   //读出时间长度数值
        i += 3;
        song();                  //发出一个音符
}   } }


关键字:51单片机  音乐代码 引用地址:51单片机之音乐代码

上一篇:51单片机流水灯的三种实现方法
下一篇:51单片机学习笔记【四】——定时器和中断系统

推荐阅读最新更新时间:2024-03-16 16:08

51单片机上实现的交通灯程序
  这是我前几天无聊自己写的交通灯程序,在51单片机上实现的。基本的定时的交通灯转换是实现了,根据时间来改变交通灯的变换。可以下载下来看看的,电路图和原程序都有,代码就自己下载吧。我不全放上了。   单片机源程序:   #include   sbit beiR=P1^0;   sbit beiY=P1^1;   sbit beiG=P1^2;   sbit nanR=P1^3;   sbit nanY=P1^4;   sbit nanG=P1^5;   uint a,b,c,type,j,i;   void Delay(uint x) //延时   {   uchar i;   while(x--)for(i=0;i《120;
[单片机]
51单片机定时器中断控制灯1S亮的程序
#include AT89X51.H unsigned char i=0,j=0; void main() { TMOD=0X01; TH0=0X4c; TL0=0X00; TR0=1; ET0=1; EA=1; P0_3=1; while(1) {}; } timer0() interrupt 1 { TR0=0; TH0=0X4c;//5000us TL0=0X00; i++; if(i =20) { i==0; j++; if(j =20) { j=0; P0_3= ~P0_3; } } TR0=1; } //注意此处必须用两个变量i,否则程序不会通过。
[单片机]
基于51单片机Proteus仿真的音乐播放器和函数发生器
音乐播放器: 实际运行效果: 51单片机Proteus仿真音乐播放器 音乐播放器原理图 音乐播放器代码链接: https://pan.baidu.com/s/1Yrjb2BtYoAcUZDdtUpbyMw 提取码:vhth 代码: #include reg52.h #include intrins.h typedef unsigned char uchar; typedef unsigned int uint; sbit K1 = P3^2; sbit Beep = P3^7; uchar i; uchar song_Index,Tone_Index=0; uchar * song_Tone, *song
[单片机]
基于<font color='red'>51单片机</font>Proteus仿真的<font color='red'>音乐</font>播放器和函数发生器
51单片机开发板程序----LED流水点亮(C语言)
//实例6:使用P0口流水点亮8位LED #include reg51.h //包含单片机寄存器的头文件 /**************************************** 函数功能:延时一段时间 *****************************************/ void delay(void) { unsigned char i,j; for(i=0;i 250;i++) for(j=0;j 250;j++) ; } /******************************************************* 函数功能:主函数 *****
[单片机]
51单片机延时程序的简单研究
应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。这种情况下,用计时器往往有点小题大做。而在极端的情况下,计时器甚至已经全部派上了别的用途。这时就需要我们另想别的办法了。   以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要:     mov   r0, #09h loop:  djnz  r0, loop 51单片机的指令周期是晶振频率的1/12,也就是1us
[单片机]
51单片机普通定时器时钟参考程序
/* 1、按键可以调整当时时间 2、按键可以调节定时时间 *8位数码管显示 时间格式格式 12-08-00 标示12点08分00秒 S1 用于小时 加1操作 S2 用于小时减1操作 S3 用于分钟 加1操作 S4 用于分钟减1操作 */ #include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 sbit KEY1=P3^0; //定义端口参数 sbit KEY2=P3^1; sbit KEY3=P3^2; sbit KEY4=P3^3; co de unsigned char tab ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07
[单片机]
51单片机串口通讯设计
通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。 测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。 //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #include reg51.h #include string.h #define INBUF_LEN 4 //数据长度 unsign
[单片机]
51单片机彩灯控制(包括功能说明、原理及C程序)
/*一、功能说明: 此程序是一款普通的彩灯,它通过电源 开关控制四种模式,即关掉电源然后打开电源就可以改变 一种模式,它的功能主要有四种模式分别如下:第一种模式 :开机四种颜色以0.5秒速度循环1次,然后在白颜色上停止 循环,即显示白光第二种模式:按下功能键后,它以1秒 速度四种颜色不停的循环第三种模式:当按键按下后它会 记住第二种模式的颜色,比如第二种模式现在亮得是绿色, 你按下按键时,它会先闪一下,然后在绿颜色上停下来第 四模式:当你再按下开关时,它自动回到模式一下,在模式 三下,当它断电时,可以记住模式三 些产品特点:利用 电源开关切换功能,断电数据保存,起到减小EEPROM擦除 次数.程序部分转自51单片机 www.51he
[单片机]
<font color='red'>51单片机</font>彩灯控制(包括功能说明、原理及C程序)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved